目录
实验目的
实验设备
实验代码
实验结果
实验目的
利用51单片机定时器0的方式1来制作时、分、秒的计时器?
用独立按键k1控制秒表启动和暂停,用k2控制归零
实验设备
普中51-单核-A2(芯片 stc89c52)
keil c51
stc-isp 烧录软件
实验代码
#include<reg52.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1; //独立按键控制
sbit k2=P3^0;
unsigned char DisplayData[8];
unsigned char hour,min,sec,se;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(unsigned int z)//延时函数
{
while(z--);
}
void display()//数码管函数
{
char i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
case(4):
LSA=1;LSB=1;LSC=0; break;
case(5):
LSA=0;LSB=1;LSC=0; break;
case(6):
LSA=1;LSB=0;LSC=0; break;
case(7):
LSA=0;LSB=0;LSC=0; break;
}
P0=DisplayData[i];
delay(100);
P0=0x00;
}
}
void Timer0Init()//定时器的初始化
{
TMOD=0X01;//设置定时器0为工作方式1
TL0 = 0x00; //设置定时初值
TH0 = 0xDC;
EA=0;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
//定时器每10毫秒溢出一次se+1
void fuzhi(unsigned char hour,min,sec)//给数码管赋值函数
{
DisplayData[0]=table[hour/10];
DisplayData[1]=table[hour%10];
DisplayData[2]=0x40;
DisplayData[3]=table[min/10];
DisplayData[4]=table[min%10];
DisplayData[5]=0x40;
DisplayData[6]=table[sec/10];
DisplayData[7]=table[sec%10];
}
void kaiguan() //按键控制启动暂停和归零
{
if(k1==0)//启动与暂停
{
delay(100);
EA=~EA;
}
if(k2==0)//归零
{
hour=0;
min=0;
sec=0;
se=0;
}
}
void dingshi() //秒 分 时转化函数
{
if(se>=100)
{
se=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
}
}
}
}
void exter0() interrupt 1 //定时器0的中断
{
TL0 = 0x00; //设置定时初值
TH0 = 0xDC;
se++;
dingshi();
}
void main()//主函数
{
Timer0Init();
while(1)
{
fuzhi(hour,min,sec);
display();
kaiguan();
}
}
实验结果
初始状态
?开始计时
|