采用USART串口通信,波特率为9600,一个单片机发送数字(自己的学号后两位)
一个单片机接收,并把接收的数字用数码管显示。
需要源码和仿真图可以加我QQ2142686503

接收部分程序:
串口接收
#include"usart.h" unsigned char buf; //头文件为声明,此处为定义 bit flag; //显示标志 void
UsartInit(void) //9600bps @11.0592MHz { PCON &= 0x3F; //启用SM0 SMOD=0 复位时为0 SCON
= 0x50; //方式一8位 不加倍 SM0 SM1 SM2 REN(接受控制位) TB8 RB8 TI RI AUXR &= 0xBF;
//定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位
TMOD|= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1
= 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 EA = 1; ES = 1; //允许串口中断 } void Usart()
interrupt4 { buf = SBUF; //读取缓冲区值 flag = 1; //接受一次后打开显示 ES = 0; //关闭串行中断 RI = 0
; //清除串行接受标志位 // ES = 1; }
显示数字函数
#include"display.h" #include"delay.h" unsigned char code table[]={0x00 , 0x01 ,
0x02 , 0x03 , 0x04 , 0x05 ,0x06 ,0x07,0x08,0x09}; //0----9 void Display(unsigned
char i) //数码管数值显示 { static unsigned char ge, shi, mode; if(mode!=i)
//当值未改变时,去除计算,减少一次while循环时间 { ge = i % 10; shi = i / 10; mode = i; //记录上一次值 } P2
= table[ge] + 0xf0; //数据+关闭位选 delay(1); P2 &= 0xdf; //打开位选 共阴极低电平亮 delay(5);
//充分显示 P2 |= 0xf0; //消影 delay(1); P2 = table[shi] + 0xf0; //P2位选 个位P2^7 十位P2^6
delay(1); P2 &= 0xef; delay(5); }
主函数
#include"reg52.h" #include"usart.h" #include"display.h" #include"delay.h" void
main(void) { UsartInit(); while(1) { while(flag) //接受到数据才开始显示 { Display(buf);
//显示接收值 delay(5); } } }
发送单片机函数
void UART_SendBit(unsigned char Data) //发送数据 { SBUF=Data; //写SUBF指令,启动发送 while(
!TI); //发送完毕,TI置1,请求中断(无中断函数) TI=0; //手动清零 } void UsartInit(void)
//[email protected] { PCON &= 0x3F; //启用SM0 SMOD=0 复位时为0 波特率不倍速 SCON = 0x50;
//8位数据,可变波特率 SM1 SM2 REN(接受控制位) TB8 RB8 TI RI AUXR &= 0xBF;
//定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位
TMOD|= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1
= 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 }

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信