找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2294|回复: 5
打印 上一主题 下一主题
收起左侧

求助各位大佬,这是用单片机定时器控制跑马灯程序,不知道问题出在哪?

[复制链接]
跳转到指定楼层
楼主
ID:695565 发表于 2020-3-1 00:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
#include<reg52.h>


typedef unsigned char u8;
typedef unsigned int u16;


void main(void)
{
        u8 led;
        u8 cnt;
        u8 num;

        TMOD=1;
        TH0=0XB8;    //20ms
        TL0=0X00;
        TR0=1;        //定时器开启

        led=0xfe;
        num=8;
        while(num>0)
        {
                if(1==TF0)
                {
                        TF0=0;
                        TH0=0XB8;
                        TL0=0X00;
                        cnt++;
                        if(cnt>=50)
                        {
                                cnt=0;
                                P2=led;
                                led=led<<1;                //左移
                                led=led|0x01;
                                num--;
                                if(num==1)               
                                {
                                         num--;                 //8个led移动完毕,跳出while循环
                                }
                        }
                }
        }
        
        num=8;
        while(num>0)                                 //烧录到开发板,现象也只运行的上面一段while循环
        {
                if(1==TF0)                                //调试到这里就进不去if判断了,为什么?
                {
                        TF0=0;
                        TH0=0XB8;
                        TL0=0X00;
                        cnt++;
                        if(cnt>=50)                //1s移动一次
                        {
                                cnt=0;
                                P2=led;
                                led=led>>1;                //右移
                                led=led|0xfe;
                                num--;
                                if(num==1)
                                {
                                         num--;
                                }
                        }
                }
        }               
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 3#
ID:213173 发表于 2020-3-1 07:06 | 只看该作者
楼主的核心错误在这一条 led=led|0xfe; 如果改成 led=led|0x80; 右移后最高位补1就可以正常显示。但总体来说程序结构明显不合理。初始化完成以后所有程序都要约束在主循环while(1)中运行。改这样试试:
  1. #include<reg52.h>

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. #define led P2 //宏定义led=P2

  5. void main(void)
  6. {
  7.         u8 cnt,num;

  8.         TMOD=1;
  9.         TH0=0XB8;    //20ms
  10.         TL0=0X00;
  11.         TF0=0;
  12.         TR0=1;       //定时器开启
  13.         led=0xfe;

  14.         while(1)
  15.         {
  16.                 if(TF0)
  17.                 {
  18.                         TF0=0;
  19.                         TH0=0XB8;
  20.                         TL0=0X00;
  21.                         cnt++;
  22.                         if(cnt>=50)
  23.                         {
  24.                                 cnt=0;
  25.                                 if(led==0xfe)
  26.                                 {
  27.                                         num=1;
  28.                                 }
  29.                                 if(led==0x7f)
  30.                                 {
  31.                                         num=0;
  32.                                 }
  33.                                 if(num==1)
  34.                                 {
  35.                                         led=led<<1|0x01;
  36.                                 }
  37.                                 if(num==0)
  38.                                 {
  39.                                         led=led>>1|0x80;
  40.                                 }
  41.                         }
  42.                 }
  43.         }
  44. }
复制代码
回复

使用道具 举报

沙发
ID:695565 发表于 2020-3-1 00:53 | 只看该作者
为啥表情包变这样了……,跪求大佬帮帮忙
回复

使用道具 举报

地板
ID:342451 发表于 2020-3-1 09:50 | 只看该作者
为啥你不直接用定时器中断服务函数么?你这种用查询的方式不断查询TF0着实没有必要,在中断服务函数里想写什么就写什么了。你整个程序没有while(1),走一遍main就停了
回复

使用道具 举报

5#
ID:695565 发表于 2020-3-1 10:47 | 只看该作者
wulin 发表于 2020-3-1 07:06
楼主的核心错误在这一条 led=led|0xfe; 如果改成 led=led|0x80; 右移后最高位补1就可以正常显示。但总体来 ...

非常感谢,我明白了
回复

使用道具 举报

6#
ID:695565 发表于 2020-3-1 10:49 | 只看该作者
之一知足 发表于 2020-3-1 09:50
为啥你不直接用定时器中断服务函数么?你这种用查询的方式不断查询TF0着实没有必要,在中断服务函数里想写 ...

我想先用定时器写一遍,再加中断,这两我刚学,都不太熟练,非常感谢你的回答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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