




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
51单片机串口通信1./*打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入 hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确*/#include /*主程序*/void main (void) SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload*/ TH1 = 0xFD; /* TH1: reload value for 9600 baud 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ ES = 1; /*打开串口中断*/while (1) /*主循环不做任何动作*/ void UART_SER (void) interrupt 4 /串行中断服务程序 unsigned char Temp; /定义临时变量 if(RI) /判断是接收中断产生 RI=0; /标志位清零 Temp=SBUF; /读入缓冲区的值 P1=Temp; /把值输出到P1口,用于观察 SBUF=Temp; /把接收到的值再发回电脑端 if(TI) /如果是发送标志位,清零 TI=0; 2.51单片机与电脑串口通信的C程序,最好是中断方式的#include #include unsigned char ch;bit read_flag= 0 ; void init_serialcom( void ) /串口通信初始设定 SCON = 0x50 ; /UART为模式1,8位数据,允许接收 TMOD |= 0x20 ; /定时器1为模式2,8位自动重装 PCON |= 0x80 ; /SMOD=1; TH1 = 0xFD ; /Baud:19200 fosc=11.0592MHz IE |= 0x90 ; /Enable Serial Interrupt TR1 = 1 ; / timer 1 run TI=1; /向串口发送一个字符 void send_char_com( unsigned char ch) SBUF=ch; while (TI= 0); TI= 0 ; void serial () interrupt 4 using 3 /串口接收中断函数 if (RI) RI = 0 ; ch=SBUF; read_flag= 1 ; /就置位取数标志 main() init_serialcom(); /初始化串口 while ( 1 ) if (read_flag) /如果取数标志已置位,就将读到的数从串口发出 read_flag= 0 ; /取数标志清0 send_char_com(ch); 3./ 单片机串行口发送/接收程序,每接收到字节即发送出去/ 和微机相接后键入的字符回显示在屏幕上/ 可用此程序测试#include #define XTAL 11059200 / CUP 晶振频率#define baudrate 9600 / 通信波特率void main(void) unsigned char c; TMOD = 0x20; / 定时器1工作于8位自动重载模式, 用于产生波特率 TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate); TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate); / 定时器0赋初值SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; / 禁止任何中断 while(1) while(RI = 0); RI = 0; c = SBUF; / 从缓冲区中把接收的字符放入c中 SBUF = c; / 要发送的字符放入缓冲区 while(TI = 0); TI = 0; 4./ /E51Pro.c/Easy 51Pro编程器主程序,负责通讯,管理编程操作/#include BYTE ComBuf18;/串口通讯数据缓存,发送和接收都使用UINT nAddress;/ROM中地址计数UINT nTimeOut;/超时计数ProWork pw;/编程器一般操作void Delay_us(BYTE nUs)/微秒级延时255us TH0=0; TL0=0; TR0=1; while(TL0nUs)/利用T0做定时计数器,循环采样,直到达到定时值 TR0=0;void Delay_ms(UINT nMs)/豪秒级的延时65535ms UINT n=0; TR0=1; while(nnMs)/利用T0做定时计数器,循环采样,直到达到定时值 TH0=0; TL0=20; while(TH04) n+; TR0=0; BOOL WaitComm()/等待上位机的命令,18字节 BYTE n=0; RI=0; while(!RI)/等待第一个字节 ComBufn=SBUF; RI=0; n+; for(n;n10000)/后17个字节都有超时限制 return 0; ComBufn=SBUF; RI=0; return 1;BOOL WaitResp()/等待上位机回应,1字节,有超时限制 nTimeOut=0; RI=0; while(!RI) nTimeOut+; if(nTimeOut50000) return 0; RI=0; ComBuf0=SBUF; return 1;BOOL WaitData()/写器件时等待上位机数据,18字节,有超时限制 BYTE n; RI=0; for(n=0;n10000) return 0; RI=0; ComBufn=SBUF; return 1;void SendData()/发送数据或回应操作完成,18字节 BYTE n=0; for(n;n=17;n+) TI=0; SBUF=ComBufn; while(!TI) TI=0; void SendResp()/回应上位机1个字节,在写器件函数中使用 TI=0; SBUF=ComBuf0; while(!TI) TI=0;void SetVpp5V()/设置Vpp为5v P3_4=0; P3_3=0;void SetVpp0V()/设置Vpp为0v P3_3=0; P3_4=1;void SetVpp12V()/设置Vpp为12v P3_4=0; P3_3=1;void RstPro()/编程器复位 pw.fpProOver();/直接编程结束 SendData();/通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf0)还没被修改,下同void ReadSign()/读特征字 pw.fpReadSign(); SendData();/通知上位机,送出读出器件特征字void Erase()/擦除器件 pw.fpErase(); SendData();/通知上位机,擦除了器件void Write()/写器件 BYTE n; pw.fpInitPro();/编程前的准备工作 SendData();/回应上位机表示进入写器件状态,可以发来数据 while(1) if(WaitData()/如果等待数据成功 if(ComBuf0=0x07)/判断是否继续写 for(n=2;n=17;n+)/ComBuf217为待写入数据块 if(!pw.fpWrite(ComBufn)/ 调用写该器件一个单元的函数 pw.fpProOver();/出错了就结束编程 ComBuf0=0xff; SendResp();/回应上位机一个字节,表示写数据出错了 WaitData();/等待上位机的回应后就结束 return; nAddress+;/下一个单元 ComBuf0=1;/回应上位机一个字节,表示数据块顺利完成,请求继续 SendResp(); else if(ComBuf0=0x00)/写器件结束 break; else/可能是通讯出错了 pw.fpProOver(); return; else/等待数据失败 pw.fpProOver(); return; pw.fpProOver();/编程结束后的工作 Delay_ms(50);/延时等待上位机写线程结束 ComBuf0=0;/通知上位机编程器进入就绪状态 SendData();void Read()/读器件 BYTE n; pw.fpInitPro();/先设置成编程状态 SendData();/回应上位机表示进入读状态 while(1) if(WaitResp()/等待上位机回应1个字节 if(ComBuf0=0)/ComBuf0=0表示读结束 break; else if(ComBuf0=0xff)/0xff表示重发 nAddress=nAddress-0x0010; for(n=2;n=17;n+)/ComBuf217保存读出的数据块 ComBufn=pw.fpRead();/调用写该器件一个单元的函数 nAddress+;/下一个单元 ComBuf0=6;/向上位机发送读出的数据块 SendData(); else break;/等待回应失败 pw.fpProOver();/操作结束设置为运行状态 ComBuf0=0;/通知上位机编程器进入就绪状态 SendData();void Lock()/写锁定位 pw.fpLock(); SendData();/所支持的FID,请在这里继续添加/extern void PreparePro00();/FID=00:AT89C51编程器extern void PreparePro01();/FID=01:AT89C2051编程器extern void PreparePro02();/FID=02:AT89S51编程器void main() SP=0x60; SetVpp5V();/先初始化Vpp为5v SCON=0x00; TCON=0x00; /PCON=0x00;/波特率*2 IE=0x00; /TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0 / 0 0 1 0 0 0 0 1 TMOD=0x21;/T0用于延时程序 TH1=0xff; TL1=0xff;/波特率28800*2,注意PCON /SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI / 0 1 0 1 0 0 0 0 SCON=0x50; TR1=1; Delay_ms(1000);/延时1秒后编程器自举 ComBuf0=0; SendData(); while(1)/串口通讯采用查询方式 if(!WaitComm()/如果超时,通讯出错 Delay_ms(500); ComBuf0=0;/让编程器复位,使编程器就绪 switch(ComBuf1)/根据FID设置(ProWork)pw中的函数指针 case 0: /at89c51编程器 PreparePro00(); break; case 1: /at89c2051编程器 PreparePro01(); break; case 2:/at89s51编程器 PreparePro02(); break; /case 3:支持新器件时,请继续向下添加 / break; /case 4: / break; default: ComBuf0=0xff; ComBuf1=0xff; /表示无效的操作 break; switch(ComBuf0)/根据操作ID跳到不同的操作函数 case 0x00: RstPro();break; / /编程器复位 case 0x01: ReadSign();break; /读特征字 case 0x02: Erase();break;/擦除器件 case 0x03: Write();break;/写器件 case 0x04: Read();break;/读器件 case 0x05: Lock();break;/写锁定位 default: SendData();break; 5.void InitSerial(void) TMOD = 0x20; / T1 方式2 PCON=0x00; / PCON=00H,SMOD=0 PD = PCON.2 = 1 进入掉电模式 TH1 = TL1 = BAUD_9600; / BAUD: 9600 SCON = 0x50; / 串行通信方式1 REN=1 允许接收 ET1 = 0; / 不允许中断 TR1 = 1; / 开启定时器1 IE = 0; / 关闭所有中断允许位 memset(&SerialBuf, 0x00, SERIAL_BUF_LEN); / 初始化SerialBufSERIAL_BUF_LEN/*名称:SendByte()*功能:串口发送一个字节*输入:ucData*返回:无*说明:无*/void SendByte(unsigned char ucData) SBUF = ucData; while(!TI) _CLRWDT_; TI = 0; RS232串口通信程序#include unsigned char code dispcode1= welcome! ;unsigned char code dispcode2=;unsigned char i,j,k,l,DData;sbit RS = P35; sbit RW = P36; sbit E = P37;unsigned char m=0;void delay()for(l=0;l=100;l+)void enable() /write orderRS=0;RW=0;E=0;delay();E=1;void enable2() /write dataRS=1;RW=0;E=0;delay();E=1;void initializtion() /lcd initializtionfor(i=0;i16) m=0;ES=1;void system_initial(void) /system initializtion TMOD=0x21;/ 定时器1工作方式2, 定时器0工作方式1 PCON=0x00;/数据传输率选择。 SCON=0x50;/串口工作方式选择, 并打开接收允许。 TH1=0xfd;/定时器赋初值。 TL1=0xfd;/波特率9600bit/s TR1=1;/启动定时器。 EA = 1; /开总中断。 ES = 1; void main() initializtion(); P0=0x80;enable(); for(j=0;j=15;j+) P0=dispcode1j; enable2(); P0=0xC0;enable(); for(k=0;k=15;k+) P0=dispcode2k; enable2(); system_initial(); while(1);RS232串口通信单片机接收发送数据的C51程序这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收和查询发送。关于RS232串口通信原理详解见:/gilbertjuly/blog/item/902a3f11d4b42b0b203f2e39.html关于单片机串口控制寄存器设置见:/embedded/51danpianji/danpianji06_chuankou.html#include #include #define length 4 /数据长度unsigned char inbuflength;unsigned char checksum,counter;bit flag = 0; /取数标记main()init_serial(); /串行口初始化while (1)if (flag!=0) /如果取数标志已置位,就将读到的数从串口发出flag= 0; /取数标志清0send_string(inbuf,length); /向串口发送字符串/* 串行口初始化 */void init_serial( void ) SCON = 0x50; /串行工作方式1, 8位异步通信方式TMOD |= 0x20; /定时器1, 方式 2, 8位自动重装PCON |= 0x80; /SMOD=1,表示数据传输率加倍TH1 = 0xF4; /数据传输率:4800 fosc=11.0592MHzIE |= 0x90; /允许串行中断TR1 = 1; /启动定时器1/* 向串口发送一个字符 */void send_char( unsigned char x)SBUF=x;while (TI= 0 );TI= 0;/* 向串口发送一个字符串,string_length为该字符串长度 */void send_string( unsigned char *s, unsigned int string_length)unsigned int i= 0;dosend_char(*(s + i); /向串口发送一个字符i+;while ( i 127 )counter= 0;inbufcounter=x;checksum= x- 128;elsecounter+;inbufcounter=x;checksum = x;if (counter=(length- 1) & (!checksum)flag= 1; /如果串口接收的数据达到length个, 且校验没错,/就置位取数标志手把手教你用增强型51实验板实现RS232串口通信下面我们一起来完成一个用单片机从串行口接收PC机数据,并在数码管上显示出来的实验。先介绍一下串口通信基本知识。目前较为常用的串口有9针串口(DB9)和25针串口(DB25)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。串口引脚定义如图1所示。9针串口(DB9) 25针串口(DB25) 针号 功能说明 缩写 针号 功能说明 缩写 1 数据载波检测 DCD 8 数据载波检测 DCD 2 接收数据 RXD 3 接收数据 RXD 3 发送数据 TXD 2 发送数据 TXD 4 数据终端准备 DTR 20 数据终端准备 DTR 5 信号地 GND 7 信号地 GND 6 数据设备准备好 DSR 6 数据准备好 DSR 7 请求发送 RTS 4 请求发送 RTS 8 清除发送 CTS 5 清除发送 CTS 9 振铃指示 DELL 22 振铃指示 DELL 我们来看一下本次实验的电路图,如图2所示,即增强型51实验板实现串口通信及数码管显示的电路部分。图2中的4个三极管分别与4个共阳数码管相连,是各个数码管的使能端,分别通过单片机的P2.0,P2.1,P2.2,P2.3来控制,数码管显示的详细工作原理,我们已在前几期杂志中作过介绍,有兴趣的朋友可以去看一下以前几期的内容。图2中MAX232芯片起到RS232与TTL电平转换的作用,我们通过9芯串口与PC机相连。 下面是我们完成本次实验的源程序代码,使用Keil编译软件,将其编译生成HEX文件,然后,通过A51编程器烧入AT89S51芯片即可。#include reg51.h #include Unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char dat;void Init_Com(void)TMOD = 0x20; /定时器工作方式2,初值自动装入PCON = 0x00; /波特率不增倍SCON = 0x50; /串行工作方式设定 TH1 = 0xFd; /定时器初值高位TL1 = 0xFd; /定时器初值低位TR1 = 1; /启动定时器 /*函数功能:LED数码管延时程序*/void delay(void)int k;for(k=0;k600;k+);/*函数功能:LED数码管显示程序*/void display(int k)P2=0xfe; /位选 P0=tabk/1000; /显示千位数字delay(); /延时P2=0xfd; /位选P0=tabk%1000/100; /显示百位数字delay(); /延时P2=0xfb; /位选P0=tabk%100/10; /显示十位数字delay(); /延时P2=0xf7; /位选P0=tabk%10; /显示个位数字delay(); /延时P2=0xff; /位选/*函数功能:主程序*/void main() P2=0xff; /端口初始化,关LED显示P0=0xff;Init_Com(); /调用串口初始化程序while(1) /主循环if ( RI ) /判断是否收到数据dat = SBUF; /接收数据RI = 0; /软件清除标志位display(dat-48); /显示收到的数据 我们来一起分析一下程序代码,main主程序首先将P2口和P0口全部输出高电平,即数据管不显示任何内容,Init_Com函数用来初始化串口设置,如波特率设置,工作方式的设置,这些都是程序运行的一切初始化设置。然后,我们看到了一个while(1)语句,该语句的作用是产生死循环,即单片机上电复位后,我们就不断地去接收由PC机发过来的串口数据,同时将接收到的数据放在dat 这个变量中,每接收完一次数据,我们需要执行RI = 0这条语句,用来清除串口数据接收标志位,现在我们已经收到了PC机传过来的数据了,余下的任务就是要将数字通过数码管显示出来,我想大家看了我们前几期的介绍,已经并不陌生数码管的使用了,在这里,我们也写得非常简洁,通过display这个函数将数字显示出来,因为我们收到的是字符型的ASCII码数据,如数字“0”的ASCII码值是48,所以,我们要显示“0”的话,还需要将其值减去48后才是真正要显示的数据。数码管我们采用动态扫描法进行显示,delay函数的作用是产生一定时间的延时,对于人眼来说是分辨不出来的,在display的函数体内,我们先将数据装载到P0口,如我们在程序开始时定义的:unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90语句,意思相当于:数字“0”对应的数码管段码值为“0xc0”, 数字“1”对应的数码管段码值为“0xf9”, 数字“2”对应的数码管段码值为“0xa4”以此类推,最后通过数码管的使能端来显示各位数码管的值。至此,整个程序的功能就轻松地实现了我们所需要的功能,看到这里相信你现在对串行通信感到并不是原来想的那么深奥了吧。 现在我们已经将程序写好,并烧入了单片机芯片,下面我们要做的就是用串口线将增强型51实验板和PC机相连起来,同时给实验板接上电源,然后就是通过PC机软件来发数据了,要在PC机上向串口发送数据一定要借助相应软件,打开光盘内附带的串口调试软件,它设置方便、灵活,界面简洁明。因为我们得告诉实验板来显示哪些数字,程序的功能是发送“1”、“2”、“3”.“8”、“9”、“0”等字符,增强型51实验板收到数据后通过数码管显示出来,所以我们得在软件发送区内填上我们所需要发送的数字,如图3所示。 串口调试软件中,设置参数如下:串口:COM1;波特率:9600;校验位:无;数据位:8位;停止位:1位;发送内容:5当我们点击“手动发送”按钮后,我们可以看到增强型51实验板上的数码管已显示数字“5”的字样,如图4所示。当然,我们也可以选择“自动发送”,即每隔一定的时间,由软件自动发送“发送缓冲区”内的数据,时间周期可以在软件界面中设置。现在,你已经可以自由发挥来接收PC机发过来的数据了,只要发挥你的想象力,定义好PC机和单片机两端的数据通信协议,你可以做出任何通过电脑来对单片机进行控制的程序,实现各种各样的数据传输,远程控制功能,比如通过PC机来控制液晶显示、控制步进电机的转动、控制蜂鸣器奏乐等等,您也可以将本期所讲的知识与前几期所讲的关联起来,完成功能更多,更实用的具体应用实例。因此,到本期的学习,我们已经可以将单片机与PC相连,借助PC机强大而灵活的功能,就可以为我们解决各类实际生产及应用型问题提供了方便。这一期的内容我们就介绍到这里,增强型51实验板更多的学习内容,我们将在以后几期陆续为大家作介绍,祝大家学习顺利。简洁的RS232串口通信电路与串口通信测试程序RS232串口通信电路往往是采用专用的串口传输芯片MAX232(5V)或MAX3232(3.3V),芯片起到驱动、匹配、隔离、保护等作用,这种电路常用于实际系统中的远距离串口通信。多数爱好者搭建串口通信电路只是用于学单片机,其实没有必要用上述专用的驱动芯片,向大家推荐一种用两只三极管组成的串口通信电路(如图),经本人测试,稳定性丝毫不减,对于大家来学习单片机足矣。 我也是第一次做AT89S52的串口通信实验,分享这个测试程序:/*程序名称:51串口通信测试、演示程序,晶振11.0592M程序功能:单片机依次发送0F这16个数至上位机,通过串口调试软件 进行hex观察*/#include #define uchar unsigned char#define uint unsigned intuchar dis=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;/*n(ms)延时子程序*/void delayms(uint ms) /延时ms uchar i;while(ms-) for(i=0;i120;i+);/*主程序*/void main()int i; TMOD=0x20; /定时器1工作于8位自动重载模式, 用于产生波特率TH1=0xFD; /波特率9600TL1=0xFD;SCON=0x50; /设定串行口工作方式TR1=1; /启动定时器1while(1) for(i=0;i16;i+) SBUF=disi; while(!TI); /等特数据传送 TI=0; /清除数据传送标志 delayms(500); 程序功能是依次向上位机发送0F这16个数,用串口调试助手观察,需要勾选“HEX显示”选项,如图:51串口实验:数码管显示电脑键盘按键ASCII值这不仅可以通过一个按钮控制单片机向电脑发送字符串,而且还可以通过数码管显示电脑键盘上按键的ASCII值。 本实验除需要单片机最小系统外,还需用到自制多功能数码管显示实验板一文中的数码管实验板和简洁的RS232串口通信电路与串口测试程序文中的串口通信电路,另需一只轻触式按钮。 系统连接:P1.0接轻触式按钮K1,P0口输出数码管段码,P2口为数码管位选信号,在此实验中只用到了十位和个位显示。 操作说明:打开串口调试助手之类的软件(这次不要勾选“HEX显示”),当按下单片机系统的K1按钮时,单片机向主机发送字符串欢迎光临万用电路板/,在串口调试软件中看得到;当按下电脑键盘上任一按键时,数码管则显示出该键的ASCII键值。程序如下:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人力资源招聘考试模拟题及答题技巧
- 2025年中国医药行业发展趋势及其对招聘考试的影响
- 2025年中国电信集团招聘考试试题及答案全收录
- 2025年工程技术招聘考试宝典工程信息员笔试模拟题
- 专题01 词类、短语辨析-2025年高考真题和模拟题《英语》分类汇编
- 2024年五年级品德与社会上册 第二单元 法律在我身边 第4课《我要上学》说课稿 粤教版
- 2025安保人员劳动合同参考
- 2025房屋买卖合同范本
- 2025年中国传统图案设计大赛试题集及解析
- 人教版高二生物必修三第五章第4节《生态系统的信息传递》教学设计(共1课时)
- 成都市新都区部分单位2025年8月公开招聘编外(聘用)人员(三)(20人)备考练习试题及答案解析
- 人教PEP版(一起)(2024)一年级上册英语全册教案
- (9月3日)铭记历史珍爱和平-纪念中国人民抗日战争暨世界反法西斯战争胜利80周年爱国主义主题教育班会课件
- 2025年事业单位招聘工作人员考试笔试试题(含答案)
- 纪念中国人民抗日战争胜利80周年心得体会
- 《人工智能应用基础》 完整课件(共十个模块-上)
- 教师调课申请表
- 会展项目管理教材 课件
- 酒店文化全套教学课件
- 钻孔桩桩底沉渣处理高压注浆方案
- 汽车VIN效验码计算器
评论
0/150
提交评论