找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1839|回复: 8
收起左侧

帮忙分析一下为何单片机流水灯程序貌似不执行呢?流水灯只在初始状态,不会流动

[复制链接]
ID:904095 发表于 2022-5-1 12:15 | 显示全部楼层 |阅读模式
单片机源程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit aa=P2^0;
sbit bb=P2^1;
sbit cc=P2^2;//74HC138位扫描控制位
uchar cnt=0;//定时器0中断计数
uchar i=0;//位扫描索引
uint sum=0;//定时器1中断计数
uchar k;
uchar temp=0xfe;//流水灯赋初值,第1个灯点亮
unsigned long  sec=765432;
uchar code Ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码表
uchar Ledbuff[]={0x00,0x00,0x00,0x00,0x00,0x00};//启动时数码管不亮
void Leddisplay();
void LedSL();

void main()
{
TMOD=0x11;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;

ET1=1;
TR1=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;

P3=temp;
while(1)
         {
         Leddisplay();
         LedSL();
        }
}
void Leddisplay()
{
if(cnt==10)//每0.1s刷新一次
                 {
                 cnt=0;
                 sec--;
                 if(sec==765398) //当sec=765398时关闭定时器0
                         {
                         TR0=0;
                        }
                 }
         Ledbuff[0]=Ledchar[sec%10];
         Ledbuff[1]=Ledchar[sec/10%10];
         Ledbuff[2]=Ledchar[sec/100%10];
         Ledbuff[3]=Ledchar[sec/1000%10];
         Ledbuff[4]=Ledchar[sec/10000%10];
         Ledbuff[5]=Ledchar[sec/100000%10];
}

void LedSL()//流水灯程序
{
         if(sum==1000)
                {
                 sum=0;
                 temp=temp<<1;
                 P3=temp;
                }
        
}
void T0_time() interrupt 1//定时10ms
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
cnt++;
}


void T1_time() interrupt 3//定时1ms
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
sum++;
P0=0x00;
switch(i)
                 {
                 case 0 :aa=1;bb=1;cc=1;i++;P0=Ledbuff[0];break;
             case 1 :aa=0;bb=1;cc=1;i++;P0=Ledbuff[1];break;
             case 2 :aa=1;bb=0;cc=1;i++;P0=Ledbuff[2];break;
             case 3 :aa=0;bb=0;cc=1;i++;P0=Ledbuff[3];break;
             case 4 :aa=1;bb=1;cc=0;i++;P0=Ledbuff[4];break;
             case 5 :aa=0;bb=1;cc=0;i=0;P0=Ledbuff[5];break;
             default:break;
                }
}
回复

使用道具 举报

ID:930066 发表于 2022-5-1 12:31 来自手机 | 显示全部楼层
电路看看
回复

使用道具 举报

ID:121859 发表于 2022-5-1 15:21 | 显示全部楼层
if(sum==1000)改为 if(sum>=1000)试试。
回复

使用道具 举报

ID:979299 发表于 2022-5-1 22:26 | 显示全部楼层
void LedSL()//流水灯程序
{
        P3=temp;
        if(sum==1000)
        {
                sum=0;
        }
        temp=~(1<<k++);
        if(k==8)
        k=0;
}
回复

使用道具 举报

ID:213173 发表于 2022-5-2 07:40 | 显示全部楼层
由于主循环周期远大于中断周期1ms,sum不知是什么数了。if(sum==1000)会跑飞,改if(sum>=1000)。temp=temp<<1;后低位要补1,否则一轮就全亮了。

  1. void LedSL()//流水灯程序
  2. {
  3.         if(sum>=1000)
  4.         {
  5.                 sum=0;
  6.                 temp=temp<<1|1;
  7.                 if(temp==0xff)
  8.                         temp=0xfe;
  9.                 P3=temp;
  10.         }  
  11. }
复制代码
回复

使用道具 举报

ID:904095 发表于 2022-5-2 07:57 | 显示全部楼层

开发板  流水灯 很久才动
回复

使用道具 举报

ID:161164 发表于 2022-5-2 15:33 | 显示全部楼层
8051只是8位单片机
没有硬件乘除法的情况下
计算32位(Long)的乘除取余需要另外附加很多的步骤
2022-05-02_150556.png

单单以上几句在12Mhz的速度运行下就要6.822毫秒
令主循环的时间超出了定时器1的中断时间
于是在第N个循环sum=997
在第N+1个循环sum=1003了
sum==1000就永不成立了


回复

使用道具 举报

ID:904095 发表于 2022-5-2 22:07 | 显示全部楼层
多谢大师的分析
回复

使用道具 举报

ID:904095 发表于 2022-5-2 22:26 | 显示全部楼层
wulin 发表于 2022-5-2 07:40
由于主循环周期远大于中断周期1ms,sum不知是什么数了。if(sum==1000)会跑飞,改if(sum>=1000)。temp=temp

嗯嗯  对
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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