📄 timer.c
字号:
/*---------------------------------------------------------------
井威改了
说明:一个可设定时间的时钟,外接12MHZ的晶振
4个button用来调节时间的
button0 小时加1
button1 小时减1
button2 分钟加1
button3 分钟减1
hs 小时十位
hg 小时个位
fs 分钟十位
fg 分钟个位
ms 秒钟十位
mg 秒钟个位
初始化时间为00:00:00
---------------------------------*/
#include <reg51.h>
#include <ds18b20.h>
#define uint unsigned int
#define uchar unsigned char
/*七段共阳管显示定义*/
uchar code SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//初始化变量
uchar hs=0,hg=0,fs=0,fg=0,ms=0,mg=0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_7=P1^7;
void delay(uchar k); //延时子程序
void time_pro(); //时间处理子程序
void display(); //显示子程序
//延时k ms的子程序
void delay(uchar k)
{
unsigned char j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
void time_pro(void)
{
if(mg==10) //秒钟设为60进制
mg=0,ms++;
if(ms==6)
ms=0,fg++;
if(fg==10) //分钟设为60进制
fg=0,fs++;
if(fs==6)
fs=0,hg++;
if(hs!=2&&hg==10) //时钟设为24进制
hg=0,hs++;
if(hs==2&&hg==4)
hg=0,hs=0;
}
void display(void)
{
P2=0x01;
P0=SEG7[hs]; //显示小时的十位
delay(4);
P2=0x02;
P0=SEG7[hg]; //显示小时的个位
delay(4);
P2=0x4;
P0=SEG7[fs]; //显示分钟的十位
delay(4);
P2=0x08;
P0=SEG7[fg]; //显示分钟的个位
delay(4);
P2=0x10;
P0=SEG7[ms]; //显示秒钟的十位
delay(4);
P2=0x20;
P0=SEG7[mg]; //显示秒钟的个位
delay(4);
//每次显示的延时4ms,这样可以保证动态扫描6个LED
/*本来显示的位段码应是从0x01到0x20的,但是这样设置的话,在P0显示
的顺序就向右移了一位,在其他IO口就不会哦,不知道是什么原因,
希望有人可以告诉我,Email:tian53169@163.com
为了在P0口中按正确的顺序显示,我把位段码向右移了一位,就是现在的顺序了
*/
}
void timer0(void) interrupt 1 using 1 //定时器0方式1,50ms中断一次
{
P1_7=!P1_7; //当P_7=1启动T/C1的中断
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void timer1(void) interrupt 3 using 2 //计数器1方式2,1s中断一次
{
mg++; //秒钟加1
}
void button0(void) //按键0的子程序
{
if(P1_0==1)
{
delay(50); //延时50ms去抖动,再扫描
if(P1_0==1)
hg++;
}
}
void button1(void) //按键1的子程序
{
if(P1_1==1)
{
delay(50);
if(P1_1==1)
{
if(hs==0&&hg==0) //为00时减1为23
hs=2,hg=3;
else if(hg==0)
hs--,hg=9;
else
hg--;
}
}
}
void button2(void) //按键2的子程序
{
if(P1_2==1)
{
delay(50);
if(P1_2==1)
fg++;
}
}
void button3(void) //按键3的子程序
{
if(P1_3==1)
{
delay(50);
if(P1_3==1)
{
if(fs==0&&fg==0) //当为00时减1为59
fs=5,fg=9;
else if(fg==0)
fs--,fg=9;
else
fg--;
}
}
}
void main(void)
{
P1_7=1;
P1=0x00; //初始化p1口,全设为0
TMOD=0x61; //time1为计数器,方式2,time0为定时器,方式1
TH0=(65536-50000)/256; //预置计数初值
TL0=(65536-50000)%256;
TH1=256-10;
TL1=256-10;
EA=1; //开cpu中断
ET0=1; //T/C0开中断
ET1=1; //T/C1开中断
TR0=1; //启动T/C0开始计时
TR1=1; //启动T/C0开始计时
do
{
button0(); //扫描按键0
button1(); //扫描按键1
button2(); //扫描按键2
button3(); //扫描按键3
time_pro(); //时间处理
display(); //显示时间
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -