ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:508.48KB ,
资源ID:21390634      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21390634.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机串口通信学习总结Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机串口通信学习总结Word文档下载推荐.docx

1、 /单片机52头文件,存放着单片机的寄存器#define uint unsigned int /宏定义#define uchar unsigned charvoid delay_ms(uchar ms); /声明一个ms级延时函数void UART_Init(void); /声明串口初始化函数void UART_Send_Byte(uchar byte); /声明串口发送单字节函数void main(void) /主函数 uchar i=0; /定义一个变量 UART_Init(); / 串口初始化 while(1) /死循环 UART_Send_Byte(i); /串口发送单字节数据 del

2、ay_ms(500); /延时500ms if(+i10) /i自加到10清0 i=0; /定义 delay_ms函数void delay_ms(uchar ms) uchar i; while(ms-) for(i=0;i120;i+); /定义UART_Init函数void UART_Init(void) SCON = 0x40; / 设定串行口工作方式,8位数据位 T2CON = 0x34; /设置定时器2,作为波特率发生器 RCAP2L = 0XD9; /9600波特率的低8位 RCAP2H = 0XFF; /9600波特率的高8位 /定义UART_Send_Byte函数void UA

3、RT_Send_Byte(uchar byte) SBUF=byte; /缓冲区装载要发送的字节数据 while(TI=0); /等待发送完毕,TI标志位会置1 TI=0; /清零发送完成标志位在串口调试助手中看到程序运行的结果:在串口初始化中涉及到的寄存器有:接收实例:1)本程序实现串口数据接收(查询法) 单片机晶振11.0592M while(1) /死循环 if(RI) /检测接收完成标志位置1 RI=0; /清零接收完成标志位 i=SBUF; /读取接收到的数据 UART_Send_Byte(i); SCON = 0x50; / 设定串行口工作方式,8位数据位,允许接收2)本程序实现串

4、口数据接收(中断法) ES = 1; /允许串口中断 EA = 1; /允许总中断 /清零发送完成标志位uchar i=0;/串口中断服务程序void UART(void) interrupt 4 if(RI) /检测接收完成标志位置1重点说明:51单片机可以通过SBUF寄存器对串行接收或发送寄存器进行访问,两个寄存器共用一个地址99H,但在物理上是两个独立的寄存器,有指令操作决定访问哪一个。eg:接收时,我们写“a=SBUF;”发送时,我们写“SBUF=a;实例一:本程序实现在上位机上用串口调试助手发送一个字符X, 单片机收到字符后返回给上位机“I get X”uchar uart_flag

5、,a,i;uchar code table=I get ; if(uart_flag=1) /接收到 ES=0; /关串口中断 for(i=0;6;i+) /在串口发送时,每次只能发一位数据,所以必须用循环将所有位全部发送,也可以用puts(“”); UART_Send_Byte(tablei); UART_Send_Byte(a); /发送接收到的字符 ES=1; /允许串口中断 uart_flag=0; /中断标志位置0 RCAP2L = 0XDC;/串口接收中断服务程序 a=SBUF; uart_flag = 1; /中断标志位置1实例二:/*本程序实现: 单片机上电后等待从上位机串口发

6、送来的命令, 当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turn on ad!” 同时在数码管以每秒刷新显示AD值 当收到上位机以十六进制发送来的02后,向上位机发送字符串“Turn off AD! 当收到上位机发送来的其他任何数据,向上位机发送字符串“Error! 单片机晶振11.0592*/#include/为了使用空指令加载的头文件stdio.h#define uint unsigned intsbit smg1=P26;/数码管位选sbit smg2=P25;sbit smg3=P24;uchar flag_uart; /串口中断标志uchar flag_time; /

7、1s钟标志uchar flag_on; /AD运行标志uchar a;uchar i;uchar t0_num; /T0 50ms定时标志uchar ad_val; /AD采集得到的值(二进制表示)float ad_vo; /实际电压标准值unsigned char code table10=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/数码管段选显示 0-9sbit cs=P33; /ad的cs控制管脚定义sbit wr=P35; /ad的wr控制管脚定义sbit rd=P34; /ad的rd控制管脚定义void delay(uint

8、count) /delay uint i; while(count) i=200; while(i0) i-; count-;void init(void) TMOD=0x21; /定计0工作方式1,定计1工作方式2 TH0=(65536-50000)/256; /定计0赋初值 TL0=(65536-50000)%256; TH1=0XFD; /定计1赋初值 TL1=0XFD; TR1=1; /开定计1 ET0=1; /开定计0中断 SCON=0X50; /串口控制寄存器:SM0=0,SM1=1,REN=1 EA=1; /开总中断 ES=1; /开串口中断/*读AD0804子程序*/unsig

9、ned char adc0804( void ) /读AD0804子程序 unsigned char addata,i; rd=1;wr=1; /int1=1; /读ADC0804前准备 P1=0xff; /P1全部置一准备 cs=0;wr=0; /启动ADC0804开始测电压 rd=0; /开始读转换后数据 i=i; /无意义语句,用于延时等待ADC0804读数完毕 addata=P1;/读出的数据赋与addatecs=1;/读数完毕 return(addata);/返回最后读出的数据/*数码管显示程序*/void display(int temp) /*/ smg3=1; smg2=1;

10、delay(1); P0=tabletemp/100; /显示百位 smg1=0; smg1=1;/*/ P0=tabletemp%100/10; /显示十位 smg2=0; P0=tabletemp%10; /显示个位 smg3=0;/*主程序*/void main(void) init(); /初始化 while(1) if(flag_uart=1) /接收到数据 flag_uart=0; /串口中断标志置0 /关串口中断,若不关闭,每发送一个字节,程序就会申请进入串口中断,从而导致程序出错 TI=1; /发送标志置1 switch(flag_on) case 0:puts(Turn on

11、 AD!); TR0=1; break; case 1:Turn off AD! TR0=0; case 2:Error! default:break; while(!TI); /等待发送完毕 TI=0; /发送完毕,手动清 if(flag_time=1) flag_time=0; ad_val=adc0804(); /将AD采集回来的8位二进制数赋给ad_val ad_vo=(float)ad_val*5.0/256.0;/以浮点数表示AD实际采集到的电压标准值 printf(The voltage is %fVn,ad_vo); display(ad_val);/*定计0中断服务子程序*/void timer0(void) interrupt 1 /定计0重装初值 t0_num+; if(t0_num=20) t0_num=0; flag_time=1;/*串口中断服务子程序*/void ser(void) interrupt 4 RI=0; a=SBUF; flag_uart=1; /串口中断标志位置1 if(a=1) flag_on=0; else if(a=2) flag_on=1; else flag_on=2;printf()和puts()的区别:1) puts()自带换行符;2) printf()可以在后面追加要输出的变量,而puts()只能输出字符串

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1