PC与51单片机串口通信.doc_第1页
PC与51单片机串口通信.doc_第2页
PC与51单片机串口通信.doc_第3页
PC与51单片机串口通信.doc_第4页
PC与51单片机串口通信.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 sbit P1_2=P12; /接发光二极管bit flag; /单片机数据发送标志位bit flag_inter; /单片机数据接收完标志位unsigned char a;void SendData(char dat);/发送字符void SendString(char *s);/发送字符串void main() SCON=0x50; /串行通信方式1,接收允许 PCON=0x00; /单倍频 TMOD = 0x20; /设置定时器T1为模式2,定时方式 TH1=TL1=0xFD; /波特率为9600,晶振11.0594MHz TR1=1; /定时器T1开始计数 EA=1; /中断允许 ES=1; /串行口中断开放 while(1) if(flag_inter=1) flag_inter=0; /标志位清0SendString(Wait command!n); /串口接收发送中断void Uart_Isr() interrupt 4 using 1 if (RI) RI=0; /接收中断标志 a=SBUF; P1_2=!P1_2; /数据送到P0口if(a=!) flag_inter=1; /数据接收完毕,置1 if(TI) TI=0; /发送中断标志 flag=0; /标志位清0 /向串口发送字符void SendData(char dat) while(flag); /等待数据发送 ACC=dat; flag=1; /标志位置1 SBUF=ACC; /数据装入SBUF/向串口发送字符串void SendString(char *s) while(*s) /字符串发送完否 SendData(*s+); /发送字符,并指针指向下一字符 2、利用串口调试助手实现串行口数据收发本程序可以实现PC机与单片机之间数据双向传输、互发(注:由CH37X451电路板原理图可知CH452数码管驱动及键盘控制芯片为四线接口,CH452_DCLK=P17,CH452_DIN=P16,CH452_LOAD=P15,CH452_DOUT=P33。)(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,ba!”时,数码管将依次显示对应的十六进制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 #include #include #include bit flag; /标志位bit flag_inter; /PC机发送信息结束标志位unsigned char m=0; /数组testdataaunsigned char testdata20=0; /存放PC机发送到单片机的信息 /输出命令子程序,定义一无符号整型变量存储12字节的命令字。void CH452_Write(unsigned int cmd)unsigned char i;#ifdef USE_KEYDISABLE_INTERRUPT; /禁止键盘中断,防止传输过程中被CH452中断/进入中断服务程序中再次传输#endifCH452_LOAD_CLR; /命令开始,LOAD=0for(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; /命令数据加载周期不小于6USDELAY_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; /往右移一位 CH452_DCLK_SET;/产生时钟上升沿锁通知CH451输入位数据 CH452_LOAD_SET;/产生加载上升沿通知CH451处理命令数据 keycode=0; /清除keycode for(i=0;i!=7;i+)keycode=1; /数据移入keycode,高位在前,低位在后 keycode|=CH452_DOUT; /从高到低读入451的数据 CH452_DCLK_CLR;/产生时钟下升沿通知CH451输出下一位 CH452_DCLK_SET; CLEAR_INTER_FLAG; /清中断标志#ifdef USE_KEY ENABLE_INTERRUPT;#endif return(keycode); /反回键值/延时函数void delayms(unsigned char i)unsigned intj;dofor(j=0;j!=1000;j+);while(-i);/串行通信初始设置子函数void init(void) SCON=0x50; /串行通信方式1,接收允许 PCON=0x00; /单倍频 TMOD = 0x20; /设置定时器T1为模式2,定时方式 TH1=TL1=0xf3; /波特率为4800,晶振24MHz TR1=1; /定时器T1开始计数 EA=1; /中断允许 ES=1; /串行口中断开放/LED显示函数 void Display(void) unsigned char n=0;unsigned char p; unsigned char testdata1;unsigned char testdata2;unsigned char testdata3;unsigned char testdata4;unsigned char testdata5;unsigned char testdata6;unsigned char testdata7; unsigned char testdata8; CH452_Write(CH452_SYSON2);/两线制方式,如果SDA用做按键中断输出,/那么命令应该为(0x04,0x23)CH452_Write(CH452_BCD); / BCD译码,8个数码管 while(4*n)(m+1)testdata1=testdata0+4*n%16; testdata2=testdata0+4*n/16;testdata3=testdata1+4*n%16; testdata4=testdata1+4*n/16;testdata5=testdata2+4*n%16; testdata6=testdata2+4*n/16;testdata7=testdata3+4*n%16; testdata8=testdata3+4*n/16;CH452_Write(CH452_DIG0 | testdata7); / 显示接收字符的ASCII码CH452_Write(CH452_DIG1 | testdata8);CH452_Write(CH452_DIG2 | testdata5);CH452_Write(CH452_DIG3 | testdata6);CH452_Write(CH452_DIG4 | testdata3);CH452_Write(CH452_DIG5 | testdata4);CH452_Write(CH452_DIG6 | testdata1);CH452_Write(CH452_DIG7 | testdata2);delayms(1000); /延时delayms(1000);delayms(1000);delayms(1000);n+; for(p=0;p21;p+) /数组清零testdatap=0; m=0; /串口接收发送中断void Uart_Isr() interrupt 4 using 1 if(RI) RI=0; /接收中断标志 testdatam=SBUF; if(testdatam=!) Display(); flag_inter=1; else m+; if(TI) TI=0; /发送中断标志 flag=0; /标志位清零 /向串口发送字符void SendData(char data0) while(flag); /等待数据发送 ACC=data0; flag=1; /标志位置1 SBUF=ACC; /数据装入SBUF/向串口发送字符串void SendString(char *s) while(*s) /字符串发送完否 SendData(*s+); /发送字符,并指针指向下一字符 / INT1中断服务程序void int1() interrupt 2 /using 1 TI=0; SBUF=CH452_Read(); /将按键值通过串口发给PC机检查 while(!TI); TI=0;void main() delayms(10); /延时init(); /串口初始化函数 / 设置CH452按键中断 IE1=0; /外部中断1 中断请求标志 EX1=1; /外部中断1中断允许while(1)if(flag_inter=1)flag_inter=0;SendString(Wait command!n);附外加头文件:(1)CH452CMD.h#define CH452_NOP0x0000/ 空操作#define CH452_RESET 0x0201/ 复位#define CH452_LEVEL0x0100/ 加载光柱值#define CH452_CLR_BIT0x0180 / 段位清0#define CH452_SET_BIT0x01C0 / 段位置1#define CH452_SLEEP0x0202/ 进入睡眠状态#define CH452_LEFTMOV 0x0300 /设置移动方式-左移#define CH452_LEFTCYC 0x0301 /设置移动方式-左循#define CH452_RIGHTMOV 0x0302 /设置移动方式-右移#define CH452_RIGHTCYC 0x0303 /设置移动方式-右循#define CH452_SELF_BCD0x0380 /自定义BCD码#define CH452_SYSOFF 0x0400 /关显示、键盘#define CH452_SYSON1 0x0401 /开显示#define CH452_SYSON2 0x0403/开显示、键盘#define CH452_SYSON2W 0x0423/开显示、键盘, 真正2线接口#define CH452_DSP 0x0500/设置默认显示方式#define CH452_BCD 0x0580/设置BCD译码方式#define CH452_TWINKLE 0x0600 /设置闪烁控制#define CH452_GET_KEY0x0700 / 获取按键#define CH452_DIG0 0x0800/数码管位0显示#define CH452_DIG1 0x0900 /数码管位1显示 #define CH452_DIG2 0x0a00 /数码管位2显示#define CH452_DIG3 0x0b00 /数码管位3显示#define CH452_DIG4 0x0c00 /数码管位4显示#define CH452_DIG5 0x0d00/数码管位5显示#define CH452_DIG6 0x0e00/数码管位6显示#define CH452_DIG7 0x0f00 /数码管位7显示(2)pin.h/* 延时1uS子程序,主要用于2线接口,与单片机速度有关 */#defineDELAY_1US_nop_();_nop_();/ MCS510 rcv=fread(handles.s, handles.s.BytesAvailable,uint8);%数据读取 str=sprintf(%3X,rcv);%以大写十六进制ASCII码显示,每个占三位 set(handles.edit1,String,str)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论