大家好最近学习单片机串口通信,教材给出的例子是一个数字密码(935467)从甲传递给乙,再显示到数码管上。但通过Proteus仿真,一直显示“8.8.8.8.8.8”,看不出问题在哪里。
发送端代码如下:
- //程序:ex6_1.c
- //功能:甲机发送数据程序,采用查询方式实现
- #include <reg51.h> //包含头文件reg51.h,定义51单片机的专用寄存器
- void main() //主函数
- {
- unsigned char i;
- unsigned char send[]={9,3,5,4,6,7}; //定义要发送的动态密码数据
- TMOD=0x20; //定时器T1工作于方式2
- TL1=0xf4; //波特率为2400bps
- TH1=0xf4;
- TR1=1;
- SCON=0x40; //定义串行口工作于方式1
- for (i=0;i<6;i++)
- {
- SBUF=send[i]; // 发送第i个数据
- while(TI==0); // 查询等待发送是否完成
- TI=0; // 发送完成,TI由软件清0
- }
- while(1);
- }
复制代码
接收端代码如下:
- //程序:ex6_2.c
- //功能:乙机接收及显示程序,采用查询方式实现,采用中断方式实现的程序参见
- //6.3节中的ex6_5.c程序
- #include <reg51.h> //包含头文件reg51.h,定义51单片机的专用寄存器
- code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //定义0~9共阳极显示字型码
- unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定义接收数据缓冲区
- void disp(void); //显示函数声明
- void main() //主函数
- {
- unsigned char i;
- TMOD=0x20; //定时器T1工作于方式2
- TL1=0xf4; //波特率定义
- TH1=0xf4;
- TR1=1;
- SCON=0x40; //定义串行口工作于方式1
- REN=1; //接收允许
- for(i=0;i<6;i++)
- {
- while(RI==0); //查询等待,RI为1时,表示接收到数据
- buffer[i]=SBUF; //接收数据
- RI=0; //RI由软件清0
- }
- for(;;) disp(); //显示接收数据
- }
- //函数名:disp
- //函数功能:在6个LED上显示buffer中的6个数
- //入口参数:无
- //出口参数:无
- void disp()
- {
- unsigned char w,i,j;
- w=0x01; //位码赋初值
- for(i=0;i<6;i++)
- {
- P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
- P2=~w; // 送反相后的位码
- for(j=0;j<100;j++);// 显示延时
- w<<=1; // w左移一位
- }
- }
复制代码
因为乙的P2引脚电平一直没有变化,怀疑是延时和串口通信冲突,又重新加载了接收端为中断机制的程序:
奇怪的是,仿真结果成了这样,各位均为短横"-":
P2电平状态能正常切换,但字形依然不能正常显示,似乎并没有数据从甲成功传递。
各位大佬有知道的请指点一下,不胜感谢!
仿真程序.7z
(22.31 KB, 下载次数: 6)
|