
PC与51单片机串口通信.docx
21页PC与51单片机串口通信串行通信是计算机和外设进行通讯、对外设进行监控并获取由外设采集到的监测数据的一个非常重要的手段由于其所用的传输线少,成本低,实现起来方便易行,因而得到广泛的应用STC89C52RC有一个可编程的全双工串行通信接口,可以方便的实现PC机与其之间的串行通信一、总体方案系统中采用STC89C52RC/STC89C54RD+单片机作为下位机,PC机为上位机,二者通过CH340将PC的USB口转成RS232的串行口接收或上传数据单片机部分的程序采用C语言编程,用Keil uVision4编译后产生HEX文件下载到单片机内,从而实现数据收发PC端采用一个串口调试助手(sscom4.2)或MATLAB GUI实现数据的收发二、具体方案1、简单通信测试程序本程序为了测试通信方式是否合适,以便于下一步增加程序的内容1)利用STC提供STC-ISP-V4.83软件检查MCU选项MCU Type is: STC89C54RD+MCU Firmware Version: 3.2CChinese:MCU 固件版本号: 3.2CDouble speed / 双倍速: 12T/单倍速振荡放大器增益: full gain下次下载时 P1.0/P1.1 与下载无关内部扩展AUX-RAM: 允许访问(强烈推荐)下次下载用户应用程序时将数据Flash区擦除: NO用户软件启动内部看门狗后: 复位关看门狗ALE pin 仍为 ALE内部时钟频率:11.061806M外部时钟频率:11.061806M(2)串行口初始参数设定串行口工作方式为方式1(10位异步收发),波特率为9600bps,用定时器1作波特率发生器,选用定时器模式2,其它详见程序及说明。
3)程序功能说明通过串口调试助手,向单片机发送字符,发送字符的末尾需加“!”,让单片机识别数据接收完毕,返回“Wait command!”字符串当单片机接收一个字符时,发光二极管端引脚取反一次,所以其亮、灭的状态改变一次例如:初始状态为灭当发送“12!”时,取反三次,发光二极管变亮,返回“Wait command!”字符串(如图(1)所示);当发送“123!”时,取反四次,发光二极管状态不变,但返回“Wait command!”字符串(如图(2)所示)图(1)a 图(1)b图(2)a 图(2)b(4)单片机内运行的程序#include
1)利用STC提供STC-ISP-V4.83软件检查MCU选项MCU Type is: STC89C52RCMCU Firmware Version: 3.2CChinese:MCU 固件版本号: 3.2CDouble speed / 双倍速: 12T/单倍速振荡放大器增益: full gain下次下载时 P1.0/P1.1 与下载无关内部扩展AUX-RAM: 允许访问(强烈推荐)下次下载用户应用程序时将数据Flash区擦除: NO用户软件启动内部看门狗后: 复位关看门狗ALE pin 仍为 ALE内部时钟频率:24.011256M.外部时钟频率:24.011256M.(2)串行口初始参数设定串行口工作方式为方式1(10位异步收发),波特率为4800bps,用定时器1作波特率发生器,选用定时器模式2,其它详见程序及说明3)程序功能说明通过串口调试助手,向单片机发送字符,发送字符的末尾需加“!”,让单片机识别数据接收完毕当单片机接收到PC机发来的数据时,先存入数组,当检测到结束标志“!”时,调用显示函数,从左至右,两个LED数码管表示一位字符的ASCII码(注:为了显示出特殊字符,所以用ASCII码表示)。
一次最多只能表示四个字符,当超过四个时,延时一段时间,再显示下面的字符数码管显示结束后,返回“Wait command!”字符串当按下按键时,将按键对应的键值返回给PC机例如:当在串口调试助手中发送“a=1,b=3,b>a!”时,数码管将依次显示对应的十六进制ASCII码如下:61H(a)、3dH(=)、31H(1)、2cH(,)、62H(b)、3dH(=)、33H(3)、2cH(,)、62H(b)、3EH(>)、61H(a)、21H(!),具体见图(3)当从左至右,从上到下依次按下键盘上的三行按键时,返回键值到PC机,具体见图(4)图(3)a 图(3)b图(3)c 图(3)d图(4)a 图(4)b(4)单片机内运行的程序主程序如下:#include
void CH452_Write(unsigned int cmd){ unsigned char i;#ifdef USE_KEY DISABLE_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断//进入中断服务程序中再次传输#endif CH452_LOAD_CLR; //命令开始,LOAD=0 for(i=0;i!=12;i++) //送入12位数据,低位在前 { if (cmd&1) {CH452_DIN_SET;} else {CH452_DIN_CLR;} // 输出位数据 CH452_DCLK_CLR; cmd>>=1; CH452_DCLK_SET; //上升沿有效 } CH452_LOAD_SET; //加载数据,LOAD上升沿 DELAY_1US; //命令数据加载周期不小于6US DELAY_1US; DELAY_1US; DELAY_1US; DELAY_1US; DELAY_1US;#ifdef USE_KEY ENABLE_INTERRUPT;#endif}//输入命令子程序,MCU从CH452读一个字节unsigned char CH452_Read(){ unsigned char i; unsigned char cmd,keycode; //定义命令字,和数据存储器#ifdef USE_KEY DISABLE_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断//进入中断服务程序中再次传输 #endif cmd=0x07; //输入读451命令字 CH452_LOAD_CLR; for(i=0;i!=4;i++) { if (cmd&1) {CH452_DIN_SET;} else {CH452_DIN_CLR;} // 输出位数据 CH452_DCLK_CLR; cmd>>=1; //往右移一位 C。












