找回密码
 立即注册

QQ登录

只需一步,快速开始

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

两个按键分别控制T0和T1倒计时5分钟,且两个四位数码管显示,T1为什么倒计时比T0快...

[复制链接]
跳转到指定楼层
楼主
ID:108715 发表于 2016-5-2 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={     //共阴数码管编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,     //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit duan=P2^6;    //段码
sbit wei=P2^7;     //位码
sbit D1=P3^6;      //输出1
sbit D2=P3^7;      //输出2
sbit key1=P1^0;    //按键1
sbit key2=P1^1;    //按键2
uint num1,num2,num3,num4,numdis;
void delayms(uint);      //定义延时时间变量
void display1(uint numdis1)  //第一个四位数码管显示
{
uint bai1,shi1,ge1;
bai1=numdis1/100;
shi1=numdis1%100/10;
ge1=numdis1%10;
duan=1;
P0=table[bai1];
duan=0;
P0=0xff;       //百位
wei=1;
P0=0xfd;
wei=0;
delayms(3);
duan=1;
P0=table[shi1];
duan=0;
P0=0xff;      //十位
wei=1;
P0=0xfb;
wei=0;
delayms(3);
duan=1;
P0=table[ge1];
duan=0;
P0=0xff;     //个位
wei=1;
P0=0xf7;
wei=0;
delayms(3);
}
void display2(uint numdis2)  //第二个四位数码管显示
{
uint bai2,shi2,ge2;
bai2=numdis2/100;
shi2=numdis2%100/10;
ge2=numdis2%10;
duan=1;
P0=table[bai2];
duan=0;
P0=0xff;        //百位
wei=1;
P0=0xdf;
wei=0;
delayms(3);
duan=1;
P0=table[shi2];
duan=0;
P0=0xff;        //十位
wei=1;
P0=0xbf;
wei=0;
delayms(3);
duan=1;
P0=table[ge2];
duan=0;
P0=0xff;        //个位
wei=1;
P0=0x7f;
wei=0;
delayms(3);
}
void delayms(uint z)           //延时函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void init()
{
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
}
void keyscan()
{
if(key1==0)
{
  delayms(10);
  if(key1==0)       //按键1按下,启动定时器0同时输出1接通,
  {                 //且数码管005分钟倒计时
   while(!key1);
   TR0=1;
   D1=0;
   num2=5;        //数码管显示005分钟
  }
}
if(key2==0)
{
  delayms(10);
  if(key2==0)       //按键2按下,启动定时器1同时输出2接通,
  {                 //且数码管005分钟倒计时
   while(!key2);
   TR1=1;
   D2=0;
   num4=5;        //数码管显示005分钟
  }
}
}

void main()
{
init();
while(1)
{
  keyscan();
  display1(num2);
  display2(num4);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;      //重装初值
TL0=(65536-45872)%256;
num1++;
if(num1==1200)        //如果到了1200次,说明1分钟时间到
{
  num1=0;             //num1清零
  num2--;
  if(num2==0)        //如果计时到零
  {
   TR0=0;          //定时器0关闭
   D1=1;           //输出关闭
  }
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;  //重装初值
TL1=(65536-45872)%256;
num3++;
if(num3==1200)        //如果到了1200次,说明1分钟时间到
{
  num3=0;              //num3清零
  num4--;
  if(num4==0)        //如果计时到零
  TR1=0;           //定时器0关闭
  D2=1;           //输出关闭
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:108715 发表于 2016-5-2 13:01 | 只看该作者
自己找到原因了,应该TMOD=0x11;最后自己又发现个小问题也解决了,就是最后的TR1=0和D2=1应该放在大括号里,没加夸好按键按下就有输出,过一分钟后关闭了

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:97438 发表于 2016-5-3 08:56 | 只看该作者
不用看程序都知道是定时器寄存器的设置问题啦。。。一般来说片内硬件很少出问题,排除硬件问题的话可以用替换法。然后就是检查程序了~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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