课程报告姓名:学号:学院:专业:序号:杭州电子科技大学课程设计报告第1页一、系统框图1.1系统框图USARTUSB图1二、STM32端软件流程图及关键代码2.1下位机软件流程图YNUSART图2按键模拟量输入LEDMCUPL2303PC上电初始化复位按键数据处理&反馈信息PCLEDAD&按键杭州电子科技大学课程设计报告第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);//发送的字符为K2break;}}}(2)发送按键信息函数voidUSART1_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.3AD转换代码voiddisplayADV(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:Addextrainitializationhereif(!port.OpenPort(COM5))//修改接口名称,此时应根据每台电脑上的接口来配置returnFALSE;if(!port.ConfigurePort(9600,8,0,0,0))//设置波特率为9600,数据位8位杭州电子科技大学课程设计报告第4页returnFALSE;if(!(port.SetCommunicationTimeouts(0,100,0,0,0)))//设置通信延时returnFALSE;SetTimer(1,100,NULL);//设置计时器1,间隔为100ms,使用OnTimer函数returnTRUE;//returnTRUEunlessyousetthefocustoacontrol3.1.2根据发送数据使LED发光voidCCOMTESTDlg::OnButtonSend(){UpdateData(TRUE);inti;for(i=0;im_strSend.GetLength();++i)//判断是否达到了接收导数据的宽度,未达到循环port.WriteByte(m_strSend[i]);//将接收的发送数据写入到端口,从而使LED发光}3.1.3全亮按键函数定义voidCCOMTESTDlg::OnButton5(){port.WriteByte('L');//按下全亮按键时,接收到的字符为L,此时所有PA口为低,LED发光}3.2STM32端程序串口通信协议解析的工作流程图发送指令传到上位机str数组大于9不大于13为6MR其它情况大于13位其它情况为6MdMCU上位机str数组判定指令长度判定前三位灯状态读取指令上位机无操作判定前三位AD状态读取指令上位机显示AD上位机显示灯状态杭州电子科技大学课程设计报告第5页四、课程设计改进建议4.1建议像这种类似的课程设计,不应该放在短学期里,而应该给予更高的重视。这种课程才是更能提高学生能力的好课,远比学习理论课给人的感觉要好很多。但是,总感觉学校好像不太重视,也感觉大学在这方面训练的还不够。