
要求是能进行9999秒倒计时
用C语言实现
*************************************/
#include<at89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_bai,num_shi,num_ge//定义千位,百位,十位,个位。
uint time//要显示的时间0~9999
uint tcnt//计时单元
//*****************//
//以下是端口定义
//*****************//
sbit key_qian=P1^0//按键"千加1"
sbit key_bai =P1^2//按键让闹"百加1"
sbit key_shi =P1^4//按键"十加1"
sbit key_ge =P1^6//按键"个加1"
sbit laba =P3^1//喇叭
void delay(unsigned int z)//1毫秒延时子函数
{
unsigned int x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
//*****************//
//以下是七段数码管驱动程序
//*****************//
/**************************************************
** 功能描述: 中断接受字符串驱动程序
**占用引脚资源 P30
**占用系统资源 串口中断;中断向量4
***************************************************/
#define DUAN P0
#define WEI P2
unsigned char code dispcode[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
}//共阴段码表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-
uchar code dispbitcode[]=
{0xef,0xdf,0xbf,0x7f}//共阴位码表
uchar dispbuf[4],dispcount/枣模/开辟四个显示缓冲区
void ledinit()/***初始化子函数,定时器0刷新显示内容***/
{
TMOD|=0x01 // 定时器0方式1
TH0=(65536-5000)/256//定时器16位模式
TL0=(65536-5000)%256//溢出时间:5ms
TR0=1//开启定时器0
ET0=1//使能定时器0
EA=1 //系统使能
}
void leddisp()//固定显示某些数字
{
dispbuf[0]=time/1000
dispbuf[1]=time%1000/100
dispbuf[2]=time%100/10
dispbuf[3]=time%10
}
void keytest()//按键检测程序
{
if(!key_qian)/坦岩罩/如果千位按键
{
delay(5)//5毫秒延时去抖
if(!key_qian)//如果千位按键的确按下了
{
num_qian++//千位数字加一
while(!key_qian)//等待按键松开
}
time+=num_qian*1000//千位数字加1
}
if(!key_bai)//如果百位按键
{
delay(5)//5毫秒延时去抖
if(!key_bai)//如果百位按键的确按下了
{
num_bai++//百位数字加一
while(!key_bai)//等待按键松开
}
time+=num_bai*100//百位数字加1
}
if(!key_shi)//如果十位按键
{
delay(5)//5毫秒延时去抖
if(!key_shi)//如果十位按键的确按下了
{
num_shi++//千位数字加一
while(!key_shi)//等待按键松开
}
time+=num_shi*10//十位数字加1
}
if(!key_ge)//如果千位按键
{
delay(5)//5毫秒延时去抖
if(!key_ge)//如果个位按键的确按下了
{
num_qian++//千位数字加一
while(!key_ge)//等待按键松开
}
time+=num_ge//个位数字加1
}
}
void main()//主程序
{
ledinit()//数码管中断初始化,定时器0刷新显示内容
while(1)//大循环
{
if((!key_qian)||(!key_bai)||(!key_shi)||(!key_ge))//如果四个按键中的任何一个被按下
keytest()//执行按键检测程序
leddisp()//不断的刷新显示内容
}
}
//*************************************************
//以下是定时器0刷新数码管显示内容驱动程序
//*************************************************
/**************************************************
** 功能描述: 七段数码管驱动程序
**占用引脚资源: 数码管段选,数码管位选
**占用系统资源T0
***************************************************/
void t0(void) interrupt 1 //using 0
{
TH0=(65536-5000)/256 //5ms中断
TL0=(65536-5000)%256//16位定时器模式
WEI=0xff//关位选
DUAN=dispcode[dispbuf[dispcount]]//段选
WEI=dispbitcode[dispcount]//开位选
dispcount++
if(dispcount==5)
dispcount=0
tcnt++ //计数个数加一
if(tcnt==5*200)//满足1S了
{
tcnt=0//计数个数归零
time--//时间减一
if(time==0)//时间
while(1)
}
if(time<10)//时间小于10
laba=~laba//声音报警
}
这是9999秒倒计时的
99秒芹兄丛倒数的 楼主看嫌樱行不在写 很麻烦的
#include <reg51.h>
unsigned char table[]={0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0}
unsigned char int_time
unsigned char second
void delay(void)
{
unsigned char i,j
for(i=0i<200i++)
for(j=0j<20j++)
}
void DisplaySecond(unsigned char k)
{
P2=0xf7
P0=table[k/10]
delay()
P2=0xfb
P0=table[k%10]
delay()
P2=0xff
}
void main(void)
{
TMOD=0x01
TH0=(65536-50000)/尘友256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
int_time=0
second=0
while(1)
{
DisplaySecond(second)
}
}
void interserve(void ) interrupt 1
{
TR0=0
int_time++
if(int_time==20)
{
int_time=0
second++
if(second==99)
second=0
}
TH0=(65536-50000)/256
TL0=(65536-50000)%256
TR0=1
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)