电子万年历需要具有现实年、月、日、时、分、秒的功能,并且因断电或其它因素引起时间误差时能对时间进行校正,同时要求具有闹钟功能和显示环境温度的功能。
3。3 用户需求来自优I尔Q论T文D网WWw.YoueRw.com 加QQ7520~18766
用户给电子万年历单片机上电后就会在LCD屏幕上显示出时间信息和温度信息,初始的时间信息为系统设置的默认值。用户需要根据实际的时间进行修改。
单片机共有4个按键,按键key1为修改时间模式,key3、key4对时间进行加减;
按键key2为修改闹钟模式,key3、key4对闹钟时间进行加减。
4 系统功能介绍
采用裸机程序,while循环结构:
图4。1系统运行流程图
4。1 功能简介
(1)程序入口:实现所有硬件的配置,以及初始化。
(2)屏幕显示:硬件配置初始化完成后进入循环,直接显示时间温度信息。
(3)按键扫描:对每一个键值进行判断,是否有按键按下。
(4)逻辑判断:如果有按键按下进入对应子程序,进行对应操作。
(5)闹钟判断:判断是否设置闹钟,如果设置了闹钟,则进行时间匹配,如果匹配完成,则进行一分钟响铃
(6)屏幕显示:更新显示时间、温度。
4。2硬件配置以及初始化模块
硬件初始化模块包含了按键初始化模块、IIC初始化模块、LCD初始化模块、
PCF8583初始化模块,DS18B20温度采集初始化模块。
4。3硬件初始化
//按键配置和初始化
sbit key1=P1^4;
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
char get_key(void)
{
if(key1==0)
{
return 1;
}
else if(key2==0)
{
return 2;
}
else if(key3==0)
{
return 3;
}
else if(key4==0)
{
return 4;
}
else return 0;
}
char key_scan(void )//按键消抖模块,供实际硬件操作使用
{
char key_retur1=0,key_retur2=0;
if(get_key())
{
key_retur1=get_key();
delay_ms(15);
if(get_key())
{
key_retur2=get_key();
}
}
if(key_retur1==key_retur2)
return key_retur1;
}
//lcd配置和初始化
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
void delay_us(uint t) //延时约10t us
{
while(t--);
}
void delay_ms(uint x)
{
uint i;
while(x--)
{
for(i=0;i<120;i++) ;
}
}
void busy_wait()
{
uchar busy;
do
{
P0=0xff;
E=0;
RS=0;
RW=1;
delay_us(5);
E=1;
busy=P0;
E=0;
}while(busy & 0x80);
}
void write_command(uchar cmd)
{
busy_wait();
RS=0;
RW=0;