标题: 求单片机大神帮忙 这个程序怎么改成 第一次中断显示999,第二次中断开始倒计时 [打印本页]
作者: a15783369 时间: 2016-6-23 16:12
标题: 求单片机大神帮忙 这个程序怎么改成 第一次中断显示999,第二次中断开始倒计时
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
code unsigned char LED[] = { // 八段数码管字形码 (共阴极)
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //显示字符0,1,2,3,4,5,6,7
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, //显示字符8,9,A,B,C,D,E,F
};
sbit key=P3^3;
int flag; //标志位
uint Count=0;//初始值
void delay(uchar z)
{
uchar x,y;
for(x=0;x<z;z++)
{
for(y=13;y>0;y--);
{ ;
}
}
}
void Timer0() interrupt 1
{
static uchar Count_50;//
TH0=0xb1;
TL0=0xdf;//定时时间为20ms,每20ms中断一次
Count_50--;
if(Count_50==50)//20ms*50=1秒
{
Count_50=0;
Count--;
}
}
void init()//初始化
{
TMOD=0x01;
TH0=0xb1;
TL0=0xdf;//定时时间为20ms,每20ms中断一次
ET0=1; //开T1中断
EA=1; //开总中断
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;// TR1=1; //T1开始运行
delay(14);
delay(15);
}
void display()
{
if(key==0)
{ delay(15);
if(key==0)
{
flag++;
if(flag==4)
{
flag=1;
}
while(!key);
}
}
switch(flag)
{
case 1:
Count=999;//恢复初值
ET0=0; //关T0中断
EA=0; //关总中断
TR0=0; //T1不运行
P2=0xef; //百位
P0=LED[Count/100];
delay(50);
P2=0xef; //十位
P0=LED[Count%100];
delay(50);
P2=0xef;//个位
P0=LED[Count%10];
delay(50);
break;
case 2:
ET0=1; //开T1中断
EA=1; //开总中断
TR0=1; //T1开始运行
if(Count>0)
{
P2=0xef; //百位
P0=LED[Count / 100];
delay(50);
P2=0xef; //十位
P0=LED[Count % 100 / 10];
delay(50);
P2=0xdf;//个位
P0=LED[Count % 10];
delay(50);
}
else
{
P2=0xef; //百位
P0=LED[Count / 100];
delay(50);
P2=0xef; //十位
P0=LED[Count%100/10];
delay(50);
P2=0xdf;//个位
P0=LED[Count%10];
delay(50);
}
break;
case 3:
ET0=0; //关T1中断
EA=0; //关总中断
TR0=0; //T0不运行
delay(5);
P2=0x76;
P0=LED[3];
delay(5);
P2=0x76;
P0=LED[2];
delay(5);
P2=0x76;
P0=LED[1];
delay(5);
break;
}
}
void main()
{
init();
P2=0Xff; //开数码管
while(1)
{
display();
}
}
这个程序怎么改成 第一次中断显示999,第二次中断开始倒计时,第三次中断显示HHH。然后一直循环。
第一和第三个中断程序我改好了,倒计时那个怎么改啊!!!
作者: ahshmj 时间: 2016-6-23 20:18
本帖最后由 ahshmj 于 2016-6-23 20:22 编辑
错误的地方太多。没有改完。你自己再看看吧。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
code unsigned char LED[] = { // 八段数码管字形码 (共阴极)
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //显示字符0,1,2,3,4,5,6,7
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, //显示字符8,9,A,B,C,D,E,F
};
sbit key=P3^3;
uchar flag=3; //标志位
uint Count=999;//初始值
uchar Count_50;//
void delay(uchar z)
{
uchar x,y;
for(x=0;x<z;z++)
{
for(y=13;y>0;y--);
{ ;
}
}
}
void Timer0() interrupt 1
{
// static uchar Count_50;//
TH0=0xb1;
TL0=0xdf;//定时时间为20ms,每20ms中断一次
Count_50--;
if(Count_50==0)//20ms*50=1秒
{
Count_50=20;
Count--;
}
if(Count==0)//
{
Count=999;
flag--;
}
if(flag==1)//
{
flag=3;
}
}
void init()//初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;// TR1=1; //T1开始运行
//TH0=0xb1;
//TL0=0xdf;//定时时间为20ms,每20ms中断一次
ET0=1; //开T1中断
EA=1; //开总中断
TR0=1;
Count_50=20;
delay(14);
delay(15);
}
void display()
{
if(key==0)
{ delay(15);
if(key==0)
{
flag++;
if(flag==4)
{
flag=1;
}
while(!key);
}
}
switch(flag)
{
case 1:
Count=999;//恢复初值
// ET0=0; //关T0中断
// EA=0; //关总中断
// TR0=0; //T1不运行
P2=0xef; //百位
P0=LED[Count/100];
delay(50);
P2=0xef; //十位
P0=LED[Count%100];
delay(50);
P2=0xef;//个位
P0=LED[Count%10];
delay(50);
break;
case 2:
// ET0=1; //开T1中断
// EA=1; //开总中断
// TR0=1; //T1开始运行
// if(Count>0)
// {
P2=0xef; //百位
P0=LED[Count / 100];
delay(50);
P2=0xef; //十位
P0=LED[Count % 100 / 10];
delay(50);
P2=0xdf;//个位
P0=LED[Count % 10];
delay(50);
// }
/* else
{
P2=0xef; //百位
P0=LED[Count / 100];
delay(50);
P2=0xef; //十位
P0=LED[Count%100/10];
delay(50);
P2=0xdf;//个位
P0=LED[Count%10];
delay(50);
}
break; */
case 3:
// ET0=0; //关T1中断
// EA=0; //关总中断
// TR0=0; //T0不运行
delay(5);
P2=0x76;
P0=LED[3];
delay(5);
P2=0x76;
P0=LED[2];
delay(5);
P2=0x76;
P0=LED[1];
delay(5);
break;
}
}
void main()
{
init();
P2=0Xff; //开数码管
while(1)
{
display();
}
}
作者: zl2168 时间: 2016-6-24 16:35
很佩服ahshmj,改这些程序是很吃力的,先要揣摩原编程者什么意图。有改的功夫,自己编程都编好了。
作者: zl2168 时间: 2016-6-24 20:03
本帖最后由 zl2168 于 2016-6-24 20:06 编辑
其实该案例可参考倒计时秒表
实例96 能预置初值的倒计时秒表
先Proteus仿真一下,确认有效。
实例96 能设置初值的倒计时秒表.rar
(40 KB, 下载次数: 4)
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |