5166|7

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机 串行口通信 数码管显示问题 [复制链接]

小弟初学单片机 在学习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);
}
}

最新回复

继续谢谢~正在研究大侠们的分析~  详情 回复 发表于 2010-1-11 20:23
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
2 为何发送两位以上的数字 确只显示一位数字(举例 我发送3456 确只显示0006  发送2345 只显示0005);

这个问题应该是楼主控制LED显示时,没有采用动态扫描,或者动态扫描的程序中,延时控制出错。


另外的问题,楼主GOOGLE与百度吧
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主的问题多了点。
4 为何在中断程序中dat = SBUF的后面加一条 SBUF = dat 的指令时(想让串口调试助回传发送的数据)数码管会闪烁(因为是动态扫描 我个人感觉是延时时间过长 但是为何不加这条指令的时候不会出现这个问题?)  

因为SBUF = DAT 会产生串口发送中断,而你没有清除TI,造成不断进入串口中断,延长了LED扫描时间造成闪烁。将LED扫描放入定时器中执行稳定性更高些。
另外,串口发送需要判断TI位,如产生发送中断,需清降TI。

3 请问51 串行口的 查询方式 和中断方式的区别 优缺点;
中断的优点在于少占CPU等待时间,但程序结构会复杂些。不过一般我是用中断方式接收,查询方式发送。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
嘿嘿,非常感谢楼上的回答。受益匪浅~
 
 
 

回复

173

帖子

0

TA的资源

一粒金砂(高级)

5
 
引用 1 楼 kyzf 的回复:
2 为何发送两位以上的数字 确只显示一位数字(举例 我发送3456 确只显示0006? 发送2345 只显示0005);



你显示的数据都是小于10的,所以只有最后一位,用串口接收的数据-48就是ascii码的转变。
你可以先把接收的数据和位置做个程序。

  1. void display(unsiged char index,unsigned char  k) //显示函数
  2. {
  3. if (index==0)
  4.   P2 = 0xfe;
  5. else if (index==1)
  6.   P2 = 0xfd;
  7. else if (index==2)
  8.   P2 = 0xfb;
  9. else if (index==3)
  10.   P2 = 0xf7;
  11. P0 = Tab[k&0x0f]; //确保不溢出,只显示0--f
  12. delayms(5);
  13. }

  14. void main(void)
  15. {
  16.    while(1)
  17.    {
  18.      display(address,dat);//address 是显示的位
  19.    }
  20. }
复制代码
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
显示最后一位,因为你显示的sbuf,那肯定是最新的。

 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
SBUF只能收一个字节!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
继续谢谢~正在研究大侠们的分析~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表