1、PC机与单片机232通信协议 作者: 日期:15 个人收集整理 勿做商业用途PC 机与单片机通信(RS232 协议)目录:1、单片机串口通信的应用2、PC控制单片机IO口输出3、单片机控制实训指导及综合应用实例4、单片机给计算机发送数据:实验任务单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机系统接收后,用LED显示接收到的数据和向上位机发回原样数据。硬件电路图实验原理RS232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通
2、讯。RS232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为20kBps。RS-232协议以-5V15V表示逻辑1;以+5V15V 表示逻辑0。 我们是用MAX232芯片将RS232电平转换为TTL电平的。 一个完整的RS-232接口有22根线,采用标准的25芯插头座。我们在 这里使用的是简化的9芯插头座.注意我们在这里使用的晶振是11。0592M的,而不是12M.因为波特率的设置需要11.0592M的。“串口调试助手V2.1.exe” 软件的使用很简单,只要将串口选择CMO1波特率设置为9600 数据位为 8 位。打开串口(如果关闭)。然后在发送区里输入要发送的数据,单击
3、手动发送就将数据发送出去了。注意,如果选中十六进制发送那么发送的数据是十六进制的,必须输入两位数据.如果没有选中,则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。数字二进制Px0Px7Abcdefg p十六进制00011111100000011111111000xco10000011010011111011000000xf920101101100100101110110100xa430100111100001101111100100xb040011011010010011011011000x9950110110101001001101101100x9260111110101
4、000001101111100x8270000011100011111111000000xf880111111100000001111111100x8090110111100001001111101100x90A0111011100010001111011100x88B0111110011000001001111100x83C0011100101100011100111000xc6D0101111010000101011110100xa1E0111100101100001100111100x86F0111000101110001100011100x8e ASCII常用代码表字符代码字符代码字符
5、代码字符代码字符3252472H92112p33!53573I93113q34”54674J94114r35#55775K95_115s3656876L96116t3757977M97a117u38&58:78N98b118v3959;79O99c119w40(6082R102f122z43+63?83S103g12344,6484T104h124|4565A85U105i12546。66B86V106j12647/67C87W107k48068D88X108l49169E89Y109m50270F90Z110n51371G91111oC语言源程序#include reg52。h /包函805
6、1 内部资源的定义unsigned char dat; /用于存储单片机接收发送缓冲寄存器SBUF里面的内容sbit gewei=P24; /个位选通定义sbit shiwei=P25; /十位选通定义sbit baiwei=P26; /百位选通定义unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,; /110void Delay(unsigned int tc) /延时程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;void LE
7、D() /LED显示接收到的数据(十进制)gewei=0; P0=tabledat10; Delay(10); gewei=1;shiwei=0; P0=tabledat/10; Delay(10); shiwei=1;baiwei=0; P0=tabledat/100; Delay(10); baiwei=1;/功能:串口初始化,波特率9600,方式1/void Init_Com(void)TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;/主程序功能:实现接收数据并把接收到的数据原样发送回去/void mai
8、n()Init_Com();/串口初始化while(1) if ( RI ) /扫描判断是否接收到数据,dat = SBUF; /接收数据SBUF赋与datRI=0; /RI 清零。SBUF = dat; /在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)LED(); /显示接收到的数据/这一个例子是以扫描的方式编写的,还可以以中断的方式编写,请大家思考/实验任务PC控制单片机IO口输出#include reg52。h /包函8051 内部资源的定义unsigned char dat; /用于存储单片机接收发送缓冲寄存器SBUF里面的内容void Delay(un
9、signed int tc) /延时程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;/功能:串口初始化,波特率9600,方式1/void Init_Com(void)TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;/主程序功能:实现接收数据并把接收到的数据原样发送回去/void main()Init_Com();/串口初始化while(1) if ( RI ) /扫描判断是否接收到数据,dat = SBUF; /接收数据SBUF赋与datif(da
10、t=0x00)/如果PC发送十六进制00,单片机P1口全亮。P1=0x00;else if(dat=0x01)P1=0x01;else if(dat=0x02)P1=0x02;else if(dat=0x03)P1=0x03;else if(dat=0x04)P1=0x04;RI=0; /RI 清零。SBUF = dat; /在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113) 实验任务单片机控制实训指导及综合应用实例#include reg52。h /包函AT89S52 内部资源的定义(注视参看书160页)define uchar unsigned char /宏定
11、义uchar led 10=0xbf,0x06,0xdb,0xcf,0x66,0xed,0xfd,0x87,0xff,0xef;/数字110,字符串uchar led164;/存储接收数据unsigned int i,j,t,k;sbit P32=P32; void scjs(void)interrupt 4 /定义中断ES=0;/ 使能串行口的中断k=1;while(1)RI=0;led1k1=SBUF; /将接收数据送段码表k+;TH0=0x3c; /t0定时50sm内接收不到数据跳过接收TL0=0xb0;TR0=1;while(!RI)if(!TF0) goto FH;FH:TF0=0;
12、/TF0不清零不能重新接收 TR0=0; P32=1;for(j=1;jk;j+)SBUF=ledj1;/数据送回给pcwhile(!TI);TI=0;P32=0;delay(t)ES=1;SCON=0x50;for(i=0;it;i+);ES=0;SCON=0x00;void main (void)int a,c;TMOD=0x21;TH1=0Xfd;TL1=0xfd;SCON=0x50;PCON=0x00;IE=0x90;TR1=1;k=1;P32=0;while(1)ES=0;SCON=0x00;for(a=0;a=k+1/k8;a+)for(c=5;c=0;c-)if(a+ck+1/k
13、*8+1)if(k=1)SBUF=leda+c;else SBUF=led1a+c;else SBUF=0x00;while(!TI);TI=0;delay(39000);#include ”reg52。h” /包函8051 内部资源的定义#define uchar unsigned charsbit P3_2=P32;uchar zdzt=0x0c;uchar zsgw=0x02;uchar zsdw=0x00;uchar bs=0;uchar zqsbw=0;uchar zqssw=0;uchar zqsgw=0;uchar yxsj=0x11;uchar zs=20;int zqs=0;
14、uchar zqsgzj=0x00;uchar zqsdzj=0x00;uchar zsscgw=0x1f;uchar zsscdw=0x00;uchar bzsj;uchar ztsj;void key (void);void keyprc();void binbcd();void disp();void delay();code uchar tab13=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x39;code uchar zssc160=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0
15、x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0
16、x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,;void key(void)TR0=0;if(!(P20X01))delay();while(!(P2&0X01);zdzt=0x0a;disp();else if(!(P30X0
17、8)delay();while(!(P30X08);zdzt=0x0b;disp();else if(!(P30X10))delay();while(!(P30X10);zs=zs+1;keyprc();disp();else if(!(P2&0X02))delay();while(!(P20X02));zs=zs-1;keyprc();disp();void keyprc()if(zs7;else if (zdzt=0x0b)yxsj=yxsj1;else if(zdzt=0x0c)P1=0xff;goto LP;P1=yxsj;bs+;if(bs=48)bs=0;zqs+;LP:binbc
18、d();disp();void binbcd()zqsbw=zqs/100;zqssw=zqs100/10;zqsgw=zqs10;void disp()TR1=0;ES=0;SCON=0x00;TMOD=0x01;SBUF=tabzqsgw;while(!TI);TI=0;SBUF=tabzqssw;while(!TI);TI=0;SBUF=tabzqsbw;while(!TI);TI=0;SBUF=tabzsdw;while(!TI);TI=0;SBUF=tabzsgw;while(!TI);TI=0;SBUF=tabzdzt;while(!TI);TI=0;TMOD=0x02;TH1=0
19、Xfd;TL1=0xfd;SCON=0x50;TR1=1;ES=1;void delay()int k;for(k=0;k1200;k+);void sin()interrupt 4P1=0xff;ES=0;bzsj=SBUF;RI=0;while(!RI);RI=0;ztsj=SBUF;if(bzsj=0x30)zdzt=ztsj-0x37;if(bzsj=0x31)if(ztsj=0x49)zs+;else zs-;ES=1;P3_2=0;keyprc();zqs=0;disp();main()TMOD=0x21;TH1=0xfd;TL1=0xfd;SCON=0x50;PCON=0x00;
20、IE=0X92;PS=1;TR1=1;P3_2=0;TH0=0x1f;TL0=0x00;SP=0x60;disp();while(1)key();if(zdzt=0x0c)TR0=0;P1=0xff;else TR0=1;单片机给计算机发送数据:#include ”reg52。h /包函8051 内部资源的定义unsigned char dat; /用于存储单片机接收发送缓冲寄存器SBUF里面的内容unsigned char fan;int i,j;void Delay() /延时程序for(i=0; i100; i+)for(j=0; j100; j+);void delays()int k
21、;for (k=0;k1200;k+);/功能:串口初始化,波特率9600,方式1/void Init_Com(void)TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;/主程序功能:实现接收数据并把接收到的数据原样发送回去/void main()Init_Com();/串口初始化while(1) if ( RI ) /扫描判断是否接收到数据,dat = SBUF; /接收数据SBUF赋与datif(dat=0x30)/如果PC发送十六进制00,单片机P1口全亮。P1=0x00;Delay(); else if
22、(dat=0x31)P1=0x01;Delay();else if(dat=0x32)P1=0x03;Delay();else if(dat=0x33)P1=0x07;Delay(); else if(dat=0x34)P1=0x0f;Delay(); else if(dat=0x35)P1=0x1f;Delay();else if(dat=0x06)P1=0x3f;Delay(); else if(dat=0x07)P1=0x7f;Delay();else if(dat=0x08)P1=0xff;Delay(); else if(!(P20x01) delays();while(!(P20x01);fan = 0x36;else if(!(P2&0x02)) delays();while(!(P20x02));fan = 0x37;else if(!(P20x04)) delays();while(!(P2&0x04));fan = 0x38;else if(!(P20x08) delays();RI=0; /RI 清零.SBUF =dat; /在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)