zl2168 发表于 2018-6-7 20:47 谢谢帮助 |
wulin 发表于 2018-6-7 15:51 大神 你这是直接帮我写出了吗 辛苦了 还打好了备注 ![]() |
liyongan_1985 发表于 2018-6-7 18:09 额 第一次发帖见谅见谅 谢谢大佬的帮助 |
本帖最后由 zl2168 于 2018-6-7 20:49 编辑 介绍你一个参考案例 实例96 能预置初值的倒计时秒表 ![]() 先Proteus仿真一下,确认有效。 ![]() 以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。 |
啥问题也没有说明白。再说这是你的全部程序吗?如果是,你的程序计时是不会对的,因为你的定时器在初始化的时候就已经开始计数了,会产生计时不准确的。 |
这个论坛没人的吗 |
#include <AT89X52.H> #define uchar unsigned char #define uint unsigned int sbit key1=P2^0; sbit key2=P2^1; uchar code table[]={ //共阳数码管段码"0~f-." 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; uchar Cnt50ms = 0; uchar Cnt1s = 24; void display()//显示程序 { static uchar count=0; //计数变量 static uchar count1=0; count1++; //动态显示计数延时 if(count1>=50) { count1=0; P1=0xff; //消隐 switch(count) { case 0: P3=0x01; //秒十位位码 P1=table[Cnt1s/10];//秒十位段码 count=1; break; case 1: P3=0x02; //秒个位位码 P1=table[Cnt1s%10];//秒个位段码 count=0; break; } } } void Timer0Init() //50毫秒@12.000MHz { TMOD= 0x01; //设置定时器模式 TL0 = 0xB0; //设置定时初值 TH0 = 0x3C; //设置定时初值 TF0 = 0; //清除TF0标志 // TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } void keyscan() //按键扫描 { static uchar count1=0,count2=0; //计数变量 static bit key_sign1=0,key_sign2=0; //按键状态标志 if(key1==0) //检测输入如果为0 { count1++; //计数延时消抖 if((count1>=250)&&(key_sign1==0)) { key_sign1=1; //按键状态标志置1,防止重复响应 TR0 = 1; //定时器0开始计时 } } else //按键抬起 { count1=0; //计数变量清0 key_sign1=0; //按键状态标志清0 } if(key2==0) //检测输入如果为0 { count2++; //计数延时消抖 if((count2>=250)&&(key_sign2==0)) { key_sign2=1; //按键状态标志置1,防止重复响应 Cnt1s=24; TR0 = 0; //定时器0停止计时 } } else //按键抬起 { count2=0; //计数变量清0 key_sign2=0; //按键状态标志清0 } } /***************主程序****************/ void main() { Timer0Init(); //定时器初始化 while(1) { keyscan(); //按键扫描 display(); //显示程序 } } /**************中断服务程序*****************/ void timer0() interrupt 1 { TL0 = 0xB0; //设置定时初值 TH0 = 0x3C; //设置定时初值 Cnt50ms++; if(Cnt50ms>=20) //1s { Cnt50ms=0; Cnt1s--; if(Cnt1s==0) { Cnt1s=0; TR0 = 0; //定时器0停止计时 } } } |