//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar count=0 //对50ms定时时间进行计数
uchar miao=0 //秒计数器
//函数名:timer_1()
//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256 //重新设置T1计数初值高8位
TL1=(65536-50000)%256 //重新设置T1计数初值低8位
count++ //50ms计数器加1
if(count==20) //1s时间到
{
count=0 //50ms计数器清0
miao++ //秒计数器加1
if(miao==100)miao=0 //miao计数到100,则从0开始计数
}
}
bit b=0
void int_0() interrupt 0
{
if(b == 0){TR1 = 0b = 1}
else
{
b = 0
TR1 = 1
}
}
void int_1() interrupt 2
{
miao=0
count = 0
TH1=(65536-50000)/256
TL1=(65536-50000)%256
TR1=1
}
//函数名:disp
//函数功能:将i的值显示在两个静态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
//定义0~9显示码,共阳极数码管
P1=led[i/10] //显示i高位
P2=led[i%10] //显示i地位
}
void main()
{
TMOD=0x10 //设置T1在工作方式1
TH1=(65536-50000)/256 //设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256 //设置T1计数初值低8位
ET1=1 //开放T1中断允许
EX0 = 1
IT0 = 1
EX1 = 1
IT1=1
EA=1 //开放总中断允许
TR1=1 //启动T1开始计时
while(1)
{
disp(miao) //显示秒计数器值
}
}
这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。
#include <reg51.H>
sbit P3_5 =P3^5
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}
unsigned char second
unsigned char keycnt
unsigned int tcnt
void main(void)
{
unsigned char i,j
TMOD=0x02
ET0=1
EA=1
second=0
P1=dispcode[second/10]
P2=dispcode[second%10]
while(1)
{
if(P3_5==0)
{
for(i=20i>0i--)
for(j=248j>0j--)
if(P3_5==0)
{
keycnt++
switch(keycnt)
{
case 1:
TH0=0x06
TL0=0x06
TR0=1
break
case 2:
TR0=0
break
case 3:
keycnt=0
second=0
P1=dispcode[second/10]
P2=dispcode[second%10]
break
}
while(P3_5==0)
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++
if(tcnt==4000)
{
tcnt=0
second++
if(second==100)
{
second=0
}
P1=dispcode[second/10]
P2=dispcode[second%10]
}
}
方法:首先:要学会数码管的显示程序然后:按键的 *** 作,注意软件的消抖(具体的是延时,10ms左右)。
假设有k1~停表,k2~复位,k3~继续运行
先说停表和继续运行的
停表:如果k1按下,TR0=0
继续运行:如果k3按下,TR0=1
复位:直接用硬件复位单片机或者k2按下,数据清零。
要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)