找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1980|回复: 5
收起左侧

单片机串口流水灯时间问题

[复制链接]
ID:100982 发表于 2021-10-9 14:38 | 显示全部楼层 |阅读模式
现在串口发送一个1 流水灯时间按道理应该是1s 一个啊,实际很快,奇怪了,头大了

单片机源程序如下:
  1. #include <reg52.h>

  2. void config_uart(unsigned int baud);
  3. void config_time0(unsigned char ms);
  4. void ledscan();

  5. unsigned char code ledchar[] = { 0xfc,0xc,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
  6.                                                                       0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e };
  7. unsigned char ledbuf[] = {0x00,0x00};

  8. unsigned char rxd = 0;
  9. unsigned char th0 = 0;
  10. unsigned char tl0 = 0;
  11. unsigned char flag = 0;

  12. int main()
  13. {
  14.         unsigned char tmp = 0x01;
  15.         EA = 1;

  16.         config_time0(1);
  17.         config_uart(9600);
  18.       
  19.         P0 = 0x00;

  20.         while(1)
  21.         {               
  22.                 if( flag )
  23.                 {
  24.                         P0 = rxd;
  25.                         flag = 0;
  26.                         rxd <<= 1;
  27.                         if(rxd == 0x80)
  28.                         {
  29.                                 rxd = 0x01;
  30.                         }
  31.                 }
  32.                
  33.         }
  34.         return 0;
  35. }

  36. void config_time0(unsigned char ms)
  37. {
  38.         TL0 = 0x66;               
  39.         TH0 = 0xFC;

  40.         TMOD &= 0xf0;
  41.         TMOD |= 0x01;

  42.         ET0 = 1;
  43.         TR0 = 1;
  44. }

  45. void config_uart(unsigned int baud)
  46. {
  47.         SCON = 0x50;
  48.         TMOD &= 0xf0;
  49.         TMOD |= 0x20;

  50.         TH1 = 256 - (11059200/12/32)/baud;
  51.         TL1 = TH1;

  52.         ES = 1;
  53.         ET1 = 0;
  54.         TR1 = 1;
  55. }

  56. void interrupt0() interrupt 1
  57. {
  58.         static unsigned long tmp = 0;

  59.         TL0 = 0x66;               
  60.         TH0 = 0xFC;
  61.                
  62.         tmp++;
  63.         if(tmp >= 1000)
  64.         {
  65.                 flag = 1;
  66.                 tmp = 0;
  67.       
  68.         }      
  69. }

  70. void uart() interrupt 4
  71. {
  72.         if(RI)
  73.         {
  74.                 RI = 0;
  75.                 rxd = SBUF;
  76.                 SBUF = rxd;      
  77.         }
  78.         if(TI)
  79.         {
  80.                 TI = 0;
  81.         }      

  82. }
复制代码


回复

使用道具 举报

ID:624769 发表于 2021-10-9 15:45 | 显示全部楼层
              if( flag )
                {
                        P0 = rxd;
                        flag = 0;
                        rxd <<= 1;
                        if(rxd == 0x80)
                        {
                                rxd = 0x01;
                        }
                }
这里有个 逻辑问题,
rxd  是 SBUF 赋值获得,
如果 SBUF  是 0x80
那么,你这个主程序里面  P0 = 0x80 之后
后面移位rxd 就 变成了 0x00
下面的 if 也不会 执行,灯就彻底灭了。

然后很快的问题,应该是定时器设定问题吧。
回复

使用道具 举报

ID:100982 发表于 2021-10-9 16:21 | 显示全部楼层
188610329 发表于 2021-10-9 15:45
if( flag )
                {
                        P0 = rxd;

先不考虑这个,因为我只给值1  定时器我看了,没有问题啊
回复

使用道具 举报

ID:624769 发表于 2021-10-9 16:32 | 显示全部楼层
wifen 发表于 2021-10-9 16:21
先不考虑这个,因为我只给值1  定时器我看了,没有问题啊

这样吧,既然暂时找不出问题。就多做实验。

比如:        static unsigned long tmp = 0;
把这句,去掉 static, 把  long 变成 short 然后放到  第10行,或者第15行?
回复

使用道具 举报

ID:624769 发表于 2021-10-9 16:36 | 显示全部楼层
找到了,

void config_uart(unsigned int baud)
{
        SCON = 0x50;
        TMOD &= 0xf0;                <==  这里错了, 应该:  TMOD &= 0x0f;
        TMOD |= 0x20;

所以,你定时器都乱了。
回复

使用道具 举报

ID:100982 发表于 2021-10-11 08:27 | 显示全部楼层
188610329 发表于 2021-10-9 16:36
找到了,

void config_uart(unsigned int baud)

哈,感谢,确实是这个问题,解决了,谢谢,太粗心了。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表