
一、实验目的
a)UART 串行通信接口技术应用
二、实验实现的功能
a)甲机向乙机发送按键的键值,同时将乙机发送的键值在数码管上显示并且LED相应的闪烁
b)乙机接收甲机发送的键值并在数码管上显示,同时也能向甲机发送键值
三、系统硬件设计
甲机和乙机的连接一样,将甲机的RXD和乙机的TXD连接,甲机的TXD和乙机的RXD连接,再将两个单片机的GND连接
四、系统软件设计
甲机发送程序:
#include #define uchar unsigned char #define uint unsigned int #define N 50 uchar codevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};//0--F的共阴极字段码表 uchar code tab[]={0XFD,0X3F,0XFA,0X3F,0XF7,0X1F,0XEF,0X2F,0XDF,0X37,0XBF,0X3B,0X7F,0X3F}; //花型显示 uchar ptr=0; sbit P36=P3^6; sbit P37=P3^7; void delay(uint x) //延时函数 { } void display(uchar n) //显示函数 { } uchar scan_key()//按键扫描 { } void shun() //顺时针转 { } void ni() 逆时针转 } void shan() 绿黄红依次点亮 { } void hua() { } void sent()//串口发送 { } void receive() //串口接收并在led上显示 { 03;break; } void main(void) { 工作模式2 波特率2400 串口模式3,允许接收 波特率不倍增 } 乙机接收程序: #include #define uchar unsigned char #define uint unsigned int #define N 10 uchar codevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D, 0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};//0--F的共阴极字段码表 uchar Num_Buffer[]={0,0,0,0};//缓冲区初始化 uchar keyvalue=0,ptr=0; void delay(uint x) //延时函数 { } void display(uchar n) //显示函数 { } uchar scan_key() //按键扫描函数 { } void sent()//串口发送 { } void receive()//串口接收 { } void main(void) { 工作模式2 波特率2400 串口模式3,允许接收 波特率不倍增 获取键值 } 五、实验过程中遇到的问题及解决方法 问题1:和实验一一样,按键扫描时对P3口赋值会影响LED的显示 解决:将按键扫描程序改为 uchar scan_key()//按键扫描 { } 问题2:甲机在接收到5后12个LED全亮,然后无论乙机发送什么,甲机都是12个LED全亮,不会改变状态 解决:反复调试检查发现P3口的最低两位为发送与接收端口,在最开始的程序中接收5的程序为case 5: display(SBUF);P2=0x00;P3=0x00;break;,此时P3的最低两位清零,使发送和接收位都无效,所以在以后无论乙机发送什么甲机都无法接收,将其改为case 5: display(SBUF);P2=0x00;P3=0x03;break;后正常 问题3:怎样让乙机在开始的时候显示0, 解决:开始时写的程序为 void receive()//串口接收 { ; display(keyvalue); } 这时运行后上电后数码管不显示,分析得出开始时SBUF为空,所以不显示,应当把显示函数放在while后面显示即程序改为 void receive()//串口接收 { } 指导老师签字: 日期:
