用单片机的定时器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=400j>0j--)
}
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
}
}
仿真图如下
#include "STC12C54.H"#define uchar unsigned char
#define uint unsigned int
#define dataport P1//P1直接驱动数码管的8个阳极
sbit wei1=P3^3//再有三个管脚接3个三极管驱动数码管的阴极
sbit wei2=P3^4
sbit wei3=P3^5
uint a=0//中断次数计数,一次50ms,20次为1 秒
//共阴数码管七段码
uchar TABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
//延时子程序
void delay1ms(uint t)
{
uint i,j,k
for(i=ti>0i--)
for(j=15j>0j--)
for(k=27k>0k--)
}
//显示子程序
void display(uint n)
{
uchar a1,a2,a3
a1=n/100%10
a2=n/10%10
a3=n%10
wei1=1
dataport=TABLE[a1]
delay1ms(1)
wei1=0
dataport=0x80|TABLE[a2]//这里多个小数点
delay1ms(1)
wei3=1
dataport=TABLE[a3]
delay1ms(1)
wei3=0
}
void init(void)
{
TMOD=0X01
TH0=(655536-50000)/256//定时50ms
TL0=(655536-50000)%256
EA=1
ET0=1
TR0=1
P1M0=0
P1M1=0xff//P1口设为推挽输出,驱动能力强
P3M0=0
P3M1=0x38//P3.3P3.4 P3.5口设为推挽输出
}
void main(void)//主程序
{
init()//初始状态设定
while(1)
{
display(a/2)//显示计数值,以十分之一秒为单位
}
}
void timer0(void)interrupt 1//中断子程序
{
TH0=(655536-50000)/256
TL0=(655536-50000)%256
a++;
if(a==1980)a=0//1980次是99秒
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)