❶ 基于51单片机的999倒计时C语言程序。
/*************************************
要求是能进行9999秒倒计时
用C语言实现
*************************************/
#include<at89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_,num_shi,num_ge;//定义千位,百位,十位,个位。
uint time;//要显示的时间0~9999
uint tcnt;//计时单元
//*****************//
//以下是端口定义
//*****************//
sbit key_qian=P1^0;//按键"千加1"
sbit key_ =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=z;x>0;x--)
for(y=110;y>0;y--);
}
//*****************//
//以下是七段数码管驱动程序
//*****************//
/**************************************************
** 功能描述: 中断接受字符串驱动程序
**占用引脚资源 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_)//如果百位按键
{
delay(5);//5毫秒延时去抖
if(!key_)//如果百位按键的确按下了
{
num_++;//百位数字加一
while(!key_);//等待按键松开
}
time+=num_*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_)||(!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秒倒计时的
❷ 单片机设计秒表倒计时
#include<reg51.h>
unsignedcharmsec,sec;
voiddelay()
{unsignedchari;
for(i=0;i<100;i++);}
voidT0_INT(void)interrupt1
{
TH0=0x3c;
TL1=0Xb0;
msec++;
if(msec==20)
{
msec=0;
sec++;
if(sec==60)
{
sec=0;
}
}
}
voidmain()
{
unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedchartemp;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
P3=0xff;
while(1)
{
P2=0x01;
P0=led[sec/10];
delay();
P2=0x02;
P0=led[sec%10];
delay();
temp=~P3;
temp=temp&0x07;
if(temp==0x01)
TR0=1;
if(temp==0x02)
TR0=1;
if(temp==0x04)
{TR0=0;sec=0;msec=0;}
}
}
❸ 采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数)
硬件电路 有2位数码管可以显示秒表的时间 0~10秒
有3个按键 K1为开始计时 K2为停止计时 K3为清零
软件设计:
K1按下则启动定时器定时 每到1秒 显示器缓冲单元内容加1
K2按下则停止定时器定时
K3按下则将显示器缓冲单元内容清零。
❹ 单片机 C语言秒表程序 求修改!倒计时结束后又开始计时了怎么停下来
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0-9段码
ucharcount,time;
sbitstart=P3^4;
sbitstop=P3^5;
sbitreset=P3^6;
/*****延时函数*****/
voiddelay(uchark)
{
uchari,j;
for(i=0;i<k;i++)
for(j=0;j<200;j++);
}
voidmain()
{
TMOD=0x01;//设置为定时器模式1
TH0=0x3c;//晶振6MHz,定时时间100ms
TL0=0xb0;
IE=0x82;//开全局中断和定时中断
time=24;
count=0;
while(1)
{
if(start==0)TR0=1;//启动开关
if(stop==0)TR0=0;//停止开关
含棚if(reset==0)time=24;//复位开关
P2=0xfe;//显示个位
谈高则P0=seg[time%10];//取计时值个位送P0口
delay(2);
P2=0xfd;//显示十位
P0=seg[time/10];//取计时值十位送P0口
delay(2);
}
}
voidtimer0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==10)//中断10次即1s=10×100ms
{
count=0;//计数次数清0
time--;//计时值减1
if(time==0)
{
time=24;//计时值减到念巧0则回初值
TR0=0;
}
}
}
❺ 编程实现倒计时的秒表,2位LED数码管显示,延时采用硬件延时的方法
编程实现倒计时的秒表,2位LED数码管显示,延时埋闭采用硬件延时的方法
用单片机的定时器T0定时,计时1秒,实现倒计时的秒表的功能。
程序如下
#include<reg51.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码表
unsigned char second;//秒倒计时变量
unsigned char t0n;//T0中断次数计数
sbit k1=P3^2;//定义按键
void delay()
{
unsigned int j;
for(j=400;j>0;j--);
}
void display()//显示子程序
{
P2=0x01;
P0=tab[second/10];//显示十位
delay();
P2=0x02;
P0=tab[second%10];//显示个位
delay();
}
void main()
{
TMOD=0x01;//用T0定时,中断方式
TH0 =0x3C;//晶振12M,定时50ms
TL0 =0xB0;
IE =0x82;
while(1)
{
display();//调显示子程序
if(k1==0)//按键按下
{
if(TR0==0)
{
TR0=1;//启动开始计时
second=60;//从60秒开始倒计时
}
else
TR0=0;
while(k1==0);/渗哗/等待按键释放
}
}
}
//T0中断程序
void T0_int() interrupt 1
{
TH0 =0x3C;
TL0 =0xB0;
t0n++;
if(t0n>=20)/弯喊裂/1秒到
{
t0n=0;
second--;//减1秒
if(second==0)TR0=0;
}
}
❻ 用单片机制作倒计时秒表的发现
显示子程序中,有些语句逻辑不顺畅,改了一些,如下:
;显示倒计时器:
;入口:30H单元BCD码十位数
; 31H单元BCD码个位数
DIS:
MOV DPTR,#TAB
MOV A, 30H
MOVC A, @A+DPTR
CLR P3.0
CLR P3.1
MOV P1, A ;显示十位
SETB P3.0
ACALL DELAY10
MOV A, 31H
MOVC A, @A+DPTR
CLR P3.0
MOV P1, A ;显示个位
SETB P3.1
ACALL DELAY10
CLR P3.0
CLR P3.1
RET