找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1031|回复: 3
收起左侧

单片机60秒倒计时显示程序哪里错误?

[复制链接]
ID:72649 发表于 2023-9-3 19:23 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define guan P1
#define wei  P3  
#define uchar unsigned char
#define uint  unsigned int

uint m=0;
uchar a1,a0,k=0,j,k,s=60;
sbit beep=P3^7;
unsigned char code weiyu[]={0xdf,0xf1,0xfd}; //代码与P3对应做位处理,显示相应的位
                                            //ge = P3^1; 1111  1101 // shi = P3^0;1111  1110//bai = P3^6;1011  1111
unsigned char code table[]={0xFC, 0x60, 0xDA, 0x8F, 0xCC, 0xED, 0xFD, 0x07, 0xFF, 0xEF};//共阴极数码管码表

void delay(unsigned char xms)
{
  for(j=xms;j>0;j--)
     for(k=125;k>0;k--);
}

void display1(uchar wei1,uchar shu)
{
  wei=0xff;
  P1=table[shu];
  wei=wei&weiyu[wei1];
  delay(5);
}

void display(uchar a,uchar b)
{
display1(2,a);
display1(3,b);
}

void main()
{
  TMOD=0x01;
  ET0=1;
  TR0=1;
        EA=1;
while(1)
{
  if(m==20)
  {
   m=0;
   s--;
  }
  a1=s/10;
  a0=s%10;
  display(a1,a0);
  if(s==0)
  {
  TR0=0;
  beep=0;
  }
  }
}                                                                                 
void TO_TIMER () interrupt 1
{
  TH0=(65536-46080)/256;
  TL0=(65536-46080)%256;
  m++;
}

回复

使用道具 举报

ID:1085441 发表于 2023-9-4 00:35 | 显示全部楼层
我没全部看您的程序,我觉得应该这样写
while(1)
{
    if(m > 49)        // 假设定时器0中断20mS,计数50次为1S,
    {
         m=0;
         s--;
        if(s==0)
        {
           // TR0=0;    不用关闭定时器0
           beep=0;
           // s = xx;        这里可以重新给倒计时赋值,如果需要的话
        }
        a1=s/10;         // 假设每秒显示一次
        a0=s%10;
        display(a1,a0);
    }
  }
}
回复

使用道具 举报

ID:332444 发表于 2023-9-4 07:56 | 显示全部楼层
位控制直接wei=weiyu[wei1];显示函数的wei在哪里声明?
回复

使用道具 举报

ID:161164 发表于 2023-9-4 09:28 | 显示全部楼层
一个delay(5)耗时大约15ms
一个display耗时大约30ms
定时中断时间大约20ms
就会出现m==20时,程序阻塞在display里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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