用单片机判漏含的定时器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
}
}
仿真图如下
void Delay1000us() { unsigned char i, j//延时等等1毫秒i = 2j = 239//下面需要做双咐握重循环,其中外循环2次,内循环239次
do{
while(--j)//每次内循环做一次减法和一次判断
} while(--i)//每次外循环做一次减法和一次判断
}
正如函数名写明的大体上可以认为,在当前的时钟频率下,经过衡橘庆测试,做上述这么多次的运算(执行语句次数)会耗时伍皮1毫秒。
只需要将单片机的P2端口输出数字对应的段码即可。继电器的电压选择和可以为5V的用一个三极管做电流竖消放大控制,毕竟单片机的输出能力不够驱动继电器,三极管选择8050系列或8550系列,基极电阻可选用2K的。5V/2K=2.5mA足够使三极管饱和导通输出最大800mA的电流(自然散热情况下,继电器的电流余和知在100mA左右)。
数码管两位的采用共阳,同样使用三极管控制共阳位(占用两个I/O口)数码段及小数点占用8个I/O口采用500欧姆电阻。数码管以至少250HZ的频率棚蠢轮显,每次停留1mS这样才能感觉不闪烁,并且亮度也够。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)