利用单片机的定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及按键来设计计时器,具有00-99分
发布网友
发布时间:2022-05-09 18:45
我来回答
共1个回答
热心网友
时间:2023-10-13 08:02
#include"reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
#define SEG_OUT P2 //段码输出口
#define BIT_OUT P3 //扫描口
#define KEY_IO P0 //键盘接口
sbit dot=P2^7; //LED小数点控制
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar data dis_buff[6]={1,2,0,0,0,0}; //待显示单元数据,共6个数据
uchar data keytemp,key; //键值存放
uchar data t10ms=0,ts=0,tmin=0,thour=12,t50ms=0;
uchar data flag=0x00;
bit flag_key=0;
/*************1毫秒延时程序**************/
delay1ms(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
//
/***********LED显示动态扫描函数**********/
display()
{
char k;
char m=0xfe;
for(k=0;k<6;k++) //6位LED扫描控制
{ BIT_OUT=0xff;
SEG_OUT=tab[dis_buff[k]];
if(k==1|k==3) {dot=0;}
BIT_OUT=m;
if((flag!=0)&(t50ms>=10))
{
switch(flag)
{
case 1:BIT_OUT|=0x03;break;
case 2:BIT_OUT|=0x0c;break;
case 3:BIT_OUT|=0x30;break;
default:break;
}
}
delay1ms(3);
m=(m<<1)|0x01;
}
}
/***************按键扫描函数*************/
void keyscan()
{
uchar i,t=0xef; //1110 1111
KEY_IO=0x0f;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 0001;
{
delay1ms(1);
for(i=0;i<4;i++)
{
KEY_IO=t;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0&flag_key==0)
{
flag_key=1;
switch(keytemp)
{
case 0x08:key=0*4+i;break;
case 0x04:key=1*4+i;break;
case 0x02:key=2*4+i;break;
case 0x01:key=3*4+i;break;
default:break;
}
switch(key)
{
case 0:thour++;if(thour==24)thour=0;break;
case 1:tmin++;if(tmin==60)tmin=0;break;
case 2:ts++;if(ts==60)ts=0;break;
default:break;
}
}
t=(t<<1)|0x01;
}
}
else flag_key=0;
}
/**************初始化程序****************/
void initiation()
{
TMOD=0x11;
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
TH1=-25000/256;
TL1=-25000%256; //25MS定时初值(T1计时用)
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
/****************定时器0中断服务程序*****/
void init_timer0(void) interrupt 1
{
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
t10ms++;
if(t10ms==100)
{
t10ms=0;
ts++;
if(ts==60)
{
ts=0;
tmin++;
if(tmin==60)
{
tmin=0;
thour++;
if(thour==24)thour=0;
}
}
}
dis_buff[0]=thour/10;
dis_buff[1]=thour%10;
dis_buff[2]=tmin/10;
dis_buff[3]=tmin%10;
dis_buff[4]=ts/10;
dis_buff[5]=ts%10;
}
/****************主程序******************/
main()
{
initiation();
while(1)
{
display();
keyscan();
}
}
这是一个矩形按键控制6位数码管的一个时钟,里面都包含你所说的要求了,至于你说的哪个计数器可以通过TMOD寄存器来设置的。计数器跟定时器的区别是没有益出中断的功能。希望对你有帮助。