#define uchar unsigned char
sbit HC573A=P2^6; //段控制锁存器的使能端
sbit HC573B=P2^7; //位控制锁存器的使能端
sbit WE1=P0^0;
sbit WE2=P0^1;
sbit WE3=P0^2;
sbit WE4=P0^3;
sbit WE5=P0^4;
sbit WE6=P0^5;
uchar String_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};
8
欧启标 单片机讲义
uchar String[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
uchar count;
uchar hour=22,minute=38,second=30;//设置时间初值,这里为11点56分57秒
void Second_Display(uchar);
void Minute_Display(uchar);
void Hour_Display(uchar);
void Time0_Init();
//定义延时函数
void Delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=10;k>0;k--);
9
欧启标 单片机讲义
}
//主函数
void main()
{
Time0_Init();
P2=0x10; //对P2口进行初始化
P0=0xFF; //对P0口进行初始化
while(1)
{
if(count==20)//满50ms*20=1s,second++
{
second++;
count=0;
10
欧启标 单片机讲义
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
hour++;
minute=0;
if(hour==24)
{
hour=0;
}
}
11
欧启标 单片机讲义
}
}
Second_Display(second);
Minute_Display(minute);
Hour_Display(hour);
}
}
//用数码管5和6显示秒的函数
void Second_Display(uchar second)
{
//个位数据送P0口
HC573A=1;
P0=String[second%10];//秒的个位,送第六个数码管显示
12
欧启标 单片机讲义
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE6=0;
HC573B=0;
Delay(10);
//十位数据送P0口
HC573A=1;
P0=String[second/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
13
欧启标 单片机讲义
HC573B=1;
WE5=0;
HC573B=0;
Delay(10);
}
//用数码管3和4显示分的函数
void Minute_Display(uchar minute)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
14
欧启标 单片机讲义
//打开位使能端
HC573B=1;
WE4=0;
HC573B=0;
Delay(10);
//十位数据送P0口
HC573A=1;
P0=String[minute/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE3=0;
15
欧启标 单片机讲义
HC573B=0;
Delay(10);
}
//用数码管1和2显示小时的函数
void Hour_Display(uchar hour)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
16
欧启标 单片机讲义
WE2=0;
HC573B=0;
Delay(10);
//十位数据送P0口
HC573A=1;
P0=String[hour/10];//秒的个位,送第六个数码管显示HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE1=0;
HC573B=0;
Delay(10);
17
欧启标 单片机讲义
}
//初始化定时器0
void Time0_Init()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TF0=0;
TR0=1;
}
//定时器中断函数,每次中断计时50ms
18
欧启标 单片机讲义
void Time0() interrupt 1 //50ms
{
TH0=0X3C;
TL0=0XB0;
count++;
}
三、按键调节时间
#include #define uchar unsigned char
#define uint unsigned int
sbit HC573A=P2^6; //段控制锁存器的使能端sbit HC573B=P2^7; //位控制锁存器的使能端
sbit WE1=P0^0;
19
欧启标 单片机讲义
sbit WE2=P0^1;
sbit WE3=P0^2;
sbit WE4=P0^3;
sbit WE5=P0^4;
sbit WE6=P0^5;
sbit KEY1=P3^2; //KEY1用于设定小时
sbit KEY2=P3^3; //KEY2用于设定分钟
sbit KEY3=P3^4; //KEY3用于设定秒
uchar String_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar String[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar count;
uchar hour=8,minute=15,second=50;//设置时间初值,这里为11点56分57秒
void Second_Display(uchar);
20
欧启标 单片机讲义
void Minute_Display(uchar);
void Hour_Display(uchar);
void Time0_Init();
//定义延时函数
void Delay2us(uint i)
{
while(--i);
}
//主函数
void main()
{
Time0_Init();
P2=0x10; //对P2口进行初始化
21
欧启标 单片机讲义
P0=0xFF; //对P0口进行初始化
KEY1=1;
KEY2=1;
KEY3=1;
while(1)
{
if(!KEY1)
{
Delay2us(5000);
if(!KEY1) //单片机上电后所有IO口都为高电平,由于按键另一端接地,故按下按键对应引脚肯定为低电平
{
hour++;
if(hour==24)
22
欧启标 单片机讲义
{
hour=0;
}
}
while(KEY1==0);
}
if(!KEY2)
{
Delay2us(5000);
if(!KEY2)
{
minute++;
if(minute==60)
23
欧启标 单片机讲义
{
minute=0;
}
}
while(KEY2==0);
}
if(!KEY3)
{
Delay2us(5000);
if(!KEY3)
{
second++;
if(second==60)
24
欧启标 单片机讲义
{
second=0;
}
}
while(KEY3==0);
}
if(count==20)//满50ms*20=1s,second++
{
second++;
count=0;
if(second==60)
{
second=0;
25
欧启标 单片机讲义
minute++;
if(minute==60)
{
hour++;
minute=0;
if(hour==24)
{
hour=0;
}
}
}
}
Second_Display(second);
26
欧启标 单片机讲义
Minute_Display(minute);
Hour_Display(hour);
}
}
//用数码管5和6显示秒的函数
void Second_Display(uchar second)
{
//个位数据送P0口
HC573A=1;
P0=String[second%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
27
欧启标 单片机讲义
HC573B=1;
WE6=0;
HC573B=0;
Delay2us(80);
//十位数据送P0口
HC573A=1;
P0=String[second/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE5=0;
HC573B=0;
28
欧启标 单片机讲义
Delay2us(80);
}
//用数码管3和4显示分的函数
void Minute_Display(uchar minute)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE4=0;
29
欧启标 单片机讲义
HC573B=0;
Delay2us(80);
//十位数据送P0口
HC573A=1;
P0=String[minute/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE3=0;
HC573B=0;
Delay2us(80);
}
30
欧启标 单片机讲义
//用数码管1和2显示小时的函数
void Hour_Display(uchar hour)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE2=0;
HC573B=0;
Delay2us(80);
31
欧启标 单片机讲义
//十位数据送P0口
HC573A=1;
P0=String[hour/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE1=0;
HC573B=0;
Delay2us(80);
}
//初始化定时器0
void Time0_Init()
32
欧启标 单片机讲义
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TF0=0;
TR0=1;
}
//定时器中断函数,每次中断计时50ms
void Time0() interrupt 1 //50ms
{
TH0=0X3C;
33
欧启标 单片机讲义
TL0=0XB0;
count++;
}
34