|
小弟初学单片机 在学习51的串行通信的时候遇到下面几个问题不明白,希望大家帮助,谢谢~! (硬件平台:伟纳ME300B开发板 )
1 为何在复位状态下 数码管显示的数字是(如图2)这个 ;我在主程序中给P2口位选端赋值是0xff;为何上电会有显示?(我个人认为刚开始上电应该是无显示)
2 为何发送两位以上的数字 确只显示一位数字(举例 我发送3456 确只显示0006 发送2345 只显示0005);
3 请问51 串行口的 查询方式 和中断方式的区别 优缺点;
4 为何在中断程序中dat = SBUF的后面加一条 SBUF = dat 的指令时(想让串口调试助回传发送的数据)数码管会闪烁(因为是动态扫描 我个人感觉是延时时间过长 但是为何不加这条指令的时候不会出现这个问题?)
5 用串口调试助手发送数据 另外回传显示的时候 为何在显示窗口会出现乱码状况那(此疑问与本题目不关联 如图4)
下面附相关图片与程序:
-----------------------------------------------------------------------------------------------------------------------------------------
(原文件名:图1 ME300B_V1.6_sch.jpg)
(原文件名:图2.jpg)
(原文件名:图3.jpg)
(原文件名:图4.jpg)
-------------------------------------------------------------------------------------------------------------------------------------------
#include
#define uchar unsigned char
#define uint unsigned int
uint dat;
uchar code Tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //定义共阳数码管断码表
void delayms(unsigned char xms) //延时函数
{
uint i ,j;
for(i = 0; i < xms; i++)
for(j = 0; j < 110; j++);
}
void Init_com() //串行口初始化
{
TMOD = 0x20; //定时器1工作方式2
SCON = 0x50; //串行口工作方式1 10位UART
PCON = 0x00; //波特率不倍增
TH1 = 0xfd; //波特率9600
TH1 = 0xfd;
TR1 = 1; //启动定时器1
}
void display(int k) //显示函数
{
P2 = 0xfe;
P0 = Tab[k/1000];
delayms(5);
P2 = 0xfd;
P0 = Tab[k%1000/100];
delayms(5);
P2 = 0xfb;
P0 = Tab[k%100/10];
delayms(5);
P2 = 0xf7;
P0 = Tab[k%10];
delayms(5);
}
void serial() interrupt 4 //串行口中断
{
if(RI)
RI = 0;
dat = SBUF;
}
void main()
{
P0 = 0xff;
P2 = 0xff;
EA = 1;
ES = 1;
Init_com();
while(1)
{
display(dat - 48);
}
}
|
|