课程报告
姓名:
学号:
学院:
专业:
序号:
杭州电子科技大学课程设计报告
第1页
一、系统框图
1.1系统框图
USART USB
图1
二、STM32端软件流程图及关键代码
2.1 下位机软件流程图
Y
N
USART
图2
按键
模拟量输入
LED
MCU PL2303 PC
上电
初始化
复位按键
数据处理&反馈信息
PC
LED
AD&按键
杭州电子科技大学课程设计报告
第2页
2.2 关键代码
2.2.1单片机系统往PC机发送信息并在PC机上显示
(1)扫描法识别并发送按键信息
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0) //K2按下
{
while(1)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1) //K2松开
{
USART1_Puts("k2\n"); //发送的字符为K2
break;
}
}
}
(2)发送按键信息函数
void USART1_Puts(u8 *str)
{
while(*str)
{
USART_SendData(USART1, *str++);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
}
}
注:此处以K2键为例,K3的设置类似于K2。当按键被按下时,PA8为
低电平,此处的if语句检测到K2被按下;然后执行while中的if语
句,此时若K2键被松开则PA8为高电平,从而检测出了K2键被按下并
松开,即可将K2的被按下的信息发送给PC机,在PC机界面上显示出
K2。
2.2.2PC机控制输出信息点亮LED灯
USART1_Gets(); //接收字符
switch(data) //设置GPIOA的0-15的端口位
{
case '0': GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)0);break;
case '1': GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)0);break;
case 'K': GPIO_Write(GPIOA, 0XFF); break;
case 'L': GPIO_Write(GPIOA, 0X00);break;
default : break;
}
杭州电子科技大学课程设计报告
第3页
根据PC机接收到的字符,利用while语句判断,并使改编号的LED低
电平发光或高电平变暗。例如,在满足case0条件时,GPIO端口中的
PA0口电平为低电平,此时LED0将发光;当接收到的字符为F时,GPIO
都将被置为高电平,也即是LED将全部熄灭。
2.2.3 AD转换代码
void displayADV(void) //模拟转数字显示
{
temp=(float)AD_value*(3.3/4096); //4096=2^12,即AD的分辨率12位
tableADV[0]=(int)temp+'0';
tableADV[1]='.';
tableADV[2]=((int)(temp*10))%10+'0';
tableADV[3]=((int)(temp*100))%10+'0';
}
ADC的分辨率为12位,而通过串口输入的模拟量AD_value最大值为
3.3V,则将其转换为数字量为AD_value*(3.3/4096)。然后,再将其余
各位字符表示出来放入tableADV[]字符串,就将模拟量转换成了数字
量。
2.3.4 发送AD转换后的数字量
while(tableADV[i]!='\0') //循环逐字输出,到结束字'\0'
{
USART_SendData(USART1, tableADV[i]); //通过USART1发送tableADV[i]数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
//字符发送完毕
i++;
}
三、PC端软件流程图及关键代码
3.1 上位机关键代码
3.1.1添加额外初始化
// TODO: Add extra initialization here
if (!port.OpenPort("COM5")) //修改接口名称,此时应根据每台电脑上的接口来配置
return FALSE;
if (!port.ConfigurePort(9600, 8, 0, 0, 0)) //设置波特率为9600,数据位8位
杭州电子科技大学课程设计报告
第4页
return FALSE;
if(!(port.SetCommunicationTimeouts(0,100,0,0,0))) //设置通信延时
return FALSE;
SetTimer(1, 100, NULL); //设置计时器1,间隔为100ms,使用On Timer函
数
return TRUE; // return TRUE unless you set the focus to a control
3.1.2 根据发送数据使LED发光
voidCCOMTESTDlg::OnButtonSend()
{
UpdateData(TRUE);
inti;
for (i = 0; i
}
3.1.3全亮按键函数定义
voidCCOMTESTDlg::OnButton5()
{
port.WriteByte('L');//按下全亮按键时,接收到的字符为L,此时所有PA口为低,LED发光
}
3.2 STM32端程序串口通信协议解析的工作流程图
发送指令传到上位机str数组
大于9不大于13 为6MR
其它情况
大于13位 其它情况
为6Md
MCU
上位机str数组
判定指令长度
判定前三位
灯状态读取指令
上位机
无操作
判定前三位
AD状态
读取指令
上位机显
示AD
上位机显
示灯状态
杭州电子科技大学课程设计报告
第5页
四、课程设计改进建议
4.1 建议
像这种类似的课程设计,不应该放在短学期里,而应该给予更高的重视。
这种课程才是更能提高学生能力的好课,远比学习理论课给人的感觉要好
很多。但是,总感觉学校好像不太重视,也感觉大学在这方面训练的还不
够。