14667|12

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机串口通信以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来 [复制链接]


  1. /*以16进制发送一个0-65536之间的任一数,
  2. *当单片机收到后在数码管上动态显示出来,波特率自定。      
  3. */
  4. //我写的程序发送第一个数便成功显示,此后但不行了。。
  5. /*比如说我发fffe  数码管显示65534
  6.   之后再发fffe..只有第5个数码管有显示4,其他几个都不亮了。
  7.   我得这样子输ff  发送,,再输ff。发送。。这样子才可以显示
  8. 很奇怪。为什么从第二次开始就不能直接发送2个字节的数据。
  9. */

  10. #include
  11. #define UCHAR unsigned char
  12. #define UINT unsigned int
  13. sbit dula = P2^6;
  14. sbit wela = P2^7;
  15.                      /*0     1      2     3     4    5     6
  16.                       *7    8       9     A     b    C      d
  17.                       *E     F     H      L     P    U      .
  18.                       */
  19. UCHAR code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
  20.                       0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x37, 0x5e,
  21.                       0x79, 0x71, 0x76, 0x38, 0x73, 0x3e, 0x80,
  22.                       0x00};
  23. bit flag;

  24. void main()
  25. {
  26.     void display(UCHAR first, UCHAR second, UCHAR third, UCHAR fourth, UCHAR fifth);
  27.     void init();
  28.     char times;
  29.     UINT temp;
  30.     UCHAR first, second, third, fourth, fifth;

  31.     init();
  32.     while(1)
  33.     {
  34.         if(flag)
  35.         {  
  36.             flag = 0;
  37.             if(++times == 1)
  38.                 temp = SBUF * 256;
  39.             /*//读入两次数据时才把temp值显示出来
  40.              *因为一次只能收1个字节的数据*/
  41.             else if(times == 2)              
  42.             {
  43.                 temp += SBUF;
  44.                 times = 0;
  45.                 first = temp % 10;
  46.                 second = temp % 100 / 10;
  47.                 third = temp % 1000 / 100;
  48.                 fourth = temp % 10000 / 1000;
  49.                 fifth = temp / 10000;
  50.                 display(fifth, fourth, third, second, first);
  51.                 ES = 0
  52.                 SBUF = temp;
  53.                 while(!TI)
  54.                     ;
  55.                 TI = 0;
  56.                 ES = 1;   
  57.             }                        
  58.         }   
  59.     }      
  60. }

  61. void init()
  62. {
  63.     TMOD = 0x20;
  64.     TH1 = 0XFD;
  65.     TL1 = 0XFD;
  66.     SM0 = 0;
  67.     SM1 = 1;
  68.     EA = 1;
  69.     TR1 = 1;
  70.     ES = 1;
  71.     REN = 1;
  72.     wela = 1;
  73.     P0 = 0xff;
  74.     wela = 0;
  75. }

  76. void delay(UINT ms)
  77. {
  78.     UINT x, y;

  79.     for(x = ms; x; x--)
  80.         for(y = 197; y; y--)
  81.             ;
  82. }

  83. void port() interrupt 4
  84. {
  85.     RI = 0;
  86.     flag = 1;
  87. }



  88. void display(UCHAR first, UCHAR second, UCHAR third, UCHAR fourth, UCHAR fifth)
  89. {   
  90.     char i;
  91.    
  92.     while(!flag)
  93.     {
  94.         for(i = 1; i <= 5; i++)
  95.         {
  96.             P0 = 0xff;
  97.             wela = 1;
  98.             switch(i)
  99.             {
  100.                 case 1: P0 = 0xfe;break;
  101.                 case 2: P0 = 0xfd;break;
  102.                 case 3: P0 = 0xfb;break;
  103.                 case 4: P0 = 0xf7;break;
  104.                 case 5: P0 = 0xef;break;
  105.             }
  106.             wela = 0;            
  107.             dula = 1;
  108.             switch(i)
  109.             {
  110.                 case 1: P0 = table[first];break;
  111.                 case 2: P0 = table[second];break;
  112.                 case 3: P0 = table[third];break;
  113.                 case 4: P0 = table[fourth];break;
  114.                 case 5: P0 = table[fifth];break;
  115.             }
  116.             dula = 0;
  117.             delay(1);
  118.         }  
  119.     }      
  120. }

复制代码

最新回复

  详情 回复 发表于 2011-8-27 16:17
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这程序能显示我也觉得奇怪。。。
显示扫描要经过了2个条件:flag=1,times == 2;
当串口没数据来的时候,显示部分还能工作吗?(应该就第五位在亮吧)
扫描部分要放在主循环里,可选择用不用定时器作为显示延时。
display()里的次序不好,一般是:关闭所有位选,输出段数据,输出位选。方法也不太好,一般不用switch()
其它的再说吧。。。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ES = 0
                SBUF = temp;
                while(!TI)
                    ;
                TI = 0;
                ES = 1;   
如果TI只是由于查询(即发送是非中断方法),不要关串口中断
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
解决问题的原则是:排除问题,然后锁定问题所在。

你发送出去的数据,然后显示,显然数据经过了两个门口,所以,要锁定问题,你发送数据后,仿真环境下,看看接收到的数据是否正确,而且发送多次,不同数据,看看接收是否正常,假如正常,锁定问题在显示部分。假如不正常,那么先将串口部分调试好。。。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 pandafeng 的回复:
这程序能显示我也觉得奇怪。。。
显示扫描要经过了2个条件:flag=1,times == 2;
当串口没数据来的时候,显示部分还能工作吗?(应该就第五位在亮吧)
扫描部分要放在主循环里,可选择用不用定时器作为显示延时。
display()里的次序不好,一般是:关闭所有位选,输出段数据,输出位选。方法也不太好,一般不用switch()
其它的再说吧。。。

嗯。问题就是display()没有放外面。。为什么要:关闭所有位选,输出段数据,输出位选。方法也不太好,一般不用switch()

为什么不能用switch()呢?用了switch的话代码少了一些哦。dula = 1;dula = 0;wela = 1;wela = 0;这些就不用重复写了。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 peasant_lee 的回复:
解决问题的原则是:排除问题,然后锁定问题所在。

你发送出去的数据,然后显示,显然数据经过了两个门口,所以,要锁定问题,你发送数据后,仿真环境下,看看接收到的数据是否正确,而且发送多次,不同数据,看看接收是否正常,假如正常,锁定问题在显示部分。假如不正常,那么先将串口部分调试好。。。

嗯。谢谢你的指导
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 peasant_lee 的回复:
解决问题的原则是:排除问题,然后锁定问题所在。

你发送出去的数据,然后显示,显然数据经过了两个门口,所以,要锁定问题,你发送数据后,仿真环境下,看看接收到的数据是否正确,而且发送多次,不同数据,看看接收是否正常,假如正常,锁定问题在显示部分。假如不正常,那么先将串口部分调试好。。。

嗯。谢谢你的指导
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
另外还有个问题。。SBUF一次只能接收1个字节的数据。。如果我要发送好几个字节数据。怎么把这些数据在单片机下存起来呢。。。 在这里先谢谢大家了。。。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
呵呵,平时做到项目,有显示部分的时候,要确定显示在该更新的时候能调用到它。

另外,不用switch,并不是说其他其他,而是就你现在的代码,应该不需要switch。你现在这样写,让人感觉代码很臃肿。首先,你在前面有个for循环,for(i = 1; i <= 5; i++),循环变量是i。下面你来了两个switch 开关判断。变量还是i。相当于一个for循环下,加了若干个if判断语句,而且都是针对i的。本来你大可以 不要switch,因为for循环已经可以限定i的值,在每次for循环下,i的值是一定的。无需再判断,你可以直接赋值给P0,前提是根据i来选择赋的是什么值,举例:去掉switch。P0 = table即可,当然,假如不是这样,i+1,-1都是可以的。前面一个P0赋值,你就可以用掩码的方式,异或一下就可以了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 peasant_lee 的回复:
呵呵,平时做到项目,有显示部分的时候,要确定显示在该更新的时候能调用到它。

另外,不用switch,并不是说其他其他,而是就你现在的代码,应该不需要switch。你现在这样写,让人感觉代码很臃肿。首先,你在前面有个for循环,for(i = 1; i <= 5; i++),循环变量是i。下面你来了两个switch 开关判断。变量还是i。相当于一个for循环下,加了若干个if判断语句,而且都是……
  1. switch(i)
  2.             {
  3.                 case 1: P0 = 0xfe;break;
  4.                 case 2: P0 = 0xfd;break;
  5.                 case 3: P0 = 0xfb;break;
  6.                 case 4: P0 = 0xf7;break;
  7.                 case 5: P0 = 0xef;break;
  8.             }
  9.             wela = 0;            
  10.             dula = 1;
  11.             switch(i)
  12.             {
  13.                 case 1: P0 = table[first];break;
  14.                 case 2: P0 = table[second];break;
  15.                 case 3: P0 = table[third];break;
  16.                 case 4: P0 = table[fourth];break;
  17.                 case 5: P0 = table[fifth];break;
  18.             }
复制代码

第一个swithc中以用table来搞定。第二个呢。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 7 楼 a006045 的回复:
另外还有个问题。。SBUF一次只能接收1个字节的数据。。如果我要发送好几个字节数据。怎么把这些数据在单片机下存起来呢。。。 在这里先谢谢大家了。。。


是第二个可以,第一个的话,假如不费什么脑袋的话,你也可以想、预先定义好一个数组,值分别为0xfe,0xfd。。。。。。就如第二个一样,用数组作为一张表格来查阅。

你可以定义一个数组来存储啊,接收到一个存储在数组里面,你需要保存多少个数据,就定义多大,
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢了。。。
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

13
 
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表