lCD时钟日历设计报告Word下载.docx
《lCD时钟日历设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《lCD时钟日历设计报告Word下载.docx(30页珍藏版)》请在冰点文库上搜索。
![lCD时钟日历设计报告Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/0ae0ae36-5396-49c5-9fd2-ff1faee62696/0ae0ae36-5396-49c5-9fd2-ff1faee626961.gif)
另外它们在价格上差距很大,考虑成本我们首选162。
所以选择方案2。
2.4报警系统的方案比较
用单片机板上长鸣的蜂鸣器实现定时闹钟功能。
用喇叭加语音芯片实现定时闹钟功能。
用喇叭加语音芯片成本很高,但声音还不错,再有喇叭体积庞大。
用用单片机板上蜂鸣器,节约了成本和设计的时间。
限于设计所需要的功能,用蜂鸣器是最佳选择。
所以我们采用方案1.
2.5键盘控制方案选择
采用矩阵键盘,采用矩阵形式连接。
采用单片机实验板上固有的按键作为校时调整控制。
虽然矩阵键盘调整简单快速,考虑到程序设计的便捷但我们觉得还是用方案2。
二、硬件系统方框图
三、硬件电路设计
硬件系统设计电路图如(a)所示,单片机的P1口为LCD液晶显示的引脚接口。
单片机的P2^0~P^3、P3^3引脚作为按键接口,其中P2^0为设置闹钟项选择键,P2^1为调整时间项选择键,P2^2为调整时间或设置闹钟加1键,P2^3为调整时间或设置闹钟减1键,P3^3为闹钟停止键。
Reset为复位键,P1-0为蜂鸣器接口,高电平驱动蜂鸣器鸣叫,模拟闹钟起闹。
LCD162的相关说明
(LCD液晶显示的资料介绍和外观图形,)
四、软件系统程序设计流程图
(自己参考书本P245~P251及参考资料)
五、调试结果分析及使用操作说明
1)软件调试
软件调试,我是在keil软件平台和单片机学习板上来完成的。
当我写部分程序在keil软件经过调试,开始出现很多错误和警告。
通过逐个错误排错及修改。
得出下列经验,
(1)调用函数最好在头文件中进行申明,主函数写在最后;
(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题。
经过一系列排错,最后文件没有错误但还有警告。
由于c语言中有警告是没关系的,我将HEX文件下在到单片机竟显示一些乱码。
我有回到文件,经过对警告的分析及上网查阅。
将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码。
经过分析,叠屏现象是没有对液晶清平所致。
于是我又在不同界面程序前加入调用填充空格函数,然后又下载,结果与前面一样。
经过几个小时后,无意间我去掉调用函数前void,结果叠屏现象解决。
还有在定时计数时出现了计数不准确,通过修改定时器部分程序,问题也得到了解决。
还另外在闹钟部分不能起闹,原因是由于LCD液晶函数部分和闹铃比较函数出现了小问题,经过不断调试才得已解决。
调试正确后,第一行显示年月日星期和"
@_@"
,第二行显示时分秒和"
TuNian"
,并且能正常行走,按下相应键能实现相应的功能。
2)使用操作说明
程序修改编译无误后,将HEX文件下在到单片机,按下单片机电源开关键,刚开始如出现乱码,按一下复位键,LCD液晶显示屏正常显示。
当按下P2^0键时,设置闹钟功能,第一次调整时,第二次调整分,第三次调整秒,调整完3秒后恢复正常模式,闹铃设鸣叫5s;
当按下P2^1键时,对应调整项闪烁,定时器停止计数,开始对日历和时间调整,前三次为年月日星期调整,后三次为时分秒调整;
当按下P2^2键时,设置日历时间或闹钟加1,加1调整完3秒后恢复正常行走;
当按下P2^3键时,设置日历时间或闹钟减1,减1调整完3秒后恢复正常行走;
当按下P3^3键时,可对闹钟终止鸣叫。
源程序:
#include<
AT89X52.h>
#include<
INTRINS.H>
#defineucharunsignedchar
#defineuintunsignedint
//#defineLCD_EN_PORTP1
//#defineLCD_RS_PORTP1
#defineLCD_DATA_PORTP1
#defineLCD_ENP1_3
#defineLCD_RSP1_2
/**********************函数声明***************************/
voidLCD_write_char(unsignedcharData,unsignedcharcommand);
//写命令或写数据函数
voidLCD_init(void);
//液晶初始化函数
voidLCD_en_write(void);
//液晶使能函数
voidLCD_write_char(ucharcommand,ucharData);
voidLCD_set_xy(ucharx,uchary);
//设置显示位置函数
voidLCD_write_string(ucharX,ucharY,uchar*s);
//写字符串函数
voiddelay_nus(uintn);
//延时函数
voiddelay_nms(uintn);
//延时函数
voidSet_Time(ucharsel,ucharsel_1);
voidset_alarm(ucharsel,ucharsel_1);
externvoiddelay_nms(unsignedintn);
ucharData1[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharData2[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharData3[9]={0,0,0,0,0,0,0,0,0};
uintrun_nian();
//判断是否为闰年
unsignedchartab[]="
;
unsignedchartab0[]="
uintcount=0;
ucharcount1=0;
uintcount2=0;
ucharh,msec;
ucharSJ=0;
//调整时间选择
ucharNZ=0;
//设置闹钟选项
uintnian=2011;
//年初始值
ucharyue=4,ri=8,xq=5,hour=0,min=0,sec=0;
//月、日。
时。
分。
秒初始值
ucharalarm_hour=0,alarm_min=0,alarm_sec=0;
//闹钟时。
bitclear_flag=0;
//液晶清除屏幕标志
bitFlicker;
//调整时间及设置闹钟位闪烁标志
bitalarm_flag=0;
//闹钟起闹标志
bitflag=0;
//显示屏幕切换标志
bitstart_alarm_flag=0;
//
sbitkey_alarm=P2^0;
//设置闹钟项选择键
sbitkey_moda=P2^1;
//调整时间项选择键
sbitkey_up=P2^2;
//调整时间或设置闹钟加1键
sbitkey_Down=P2^3;
//调整时间或设置闹钟减1键
sbitalarm_stop=P3^3;
//闹钟停止键
/********************液晶初始化函数************************/
voidLCD_init(void)
{
delay_nms(5);
LCD_write_char(0x28,0);
//4位显示
LCD_write_char(0x0c,0);
//显示开
LCD_write_char(0x06,0);
LCD_write_char(0x01,0);
//清屏
}
/********************液晶使能函数************************/
voidLCD_en_write(void)
{LCD_EN=0;
delay_nus
(2);
LCD_EN=1;
LCD_EN=0;
/*********************写命令或写数据函数*******************/
voidLCD_write_data(unsignedcharData_command)
{unsignedchartemp;
temp=Data_command;
LCD_DATA_PORT&
=0X0f;
//LCD_DATA_PORT=LCD_DATA_PORT&
0X0f
LCD_DATA_PORT|=temp&
0xf0;
//写高四位
LCD_en_write();
temp=temp<
<
4;
=0x0f;
//写低四位
/*********************写命令和写数据函数*******************/
//参数:
command=1,写数据,command=0写命令
voidLCD_write_char(unsignedcharData_or_command,unsignedcharcommand)
if(command==0)
{LCD_RS=0;
//RS=0,选择指令寄存器
LCD_write_data(Data_or_command);
}
else
{
LCD_RS=1;
//RS=1,选择数据寄存器
/**********************设置显示地址函数********************/
voidLCD_set_xy(unsignedcharx,unsignedchary)
unsignedcharaddress;
if(y==0)
address=0x80+x;
else
address=0xc0+x;
LCD_write_char(address,0);
/*********************写字符串函数************************/
X为显示在第几列,Y为显示在第几行,s为待显示字符串
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s)
{
LCD_set_xy(X,Y);
//写地址
while(*s)//写显示字符
LCD_write_char(*s,1);
s++;
/*******************延时函数*************************/
//系统时钟:
12MHZ
voiddelay_nus(uintn)//Nus延时函数
unsignedinti=0;
for(i=0;
i<
n;
i++)
_nop_();
voiddelay_nms(uintn)//Nms延时函数
uchari=0;
while(n--)
125;
i++);
/*******************定时器0初始化函数*********************/
voidTIMER0_init()
{TMOD=0x12;
//定时器T1方式1,定时器T0方式2
TH0=0x06;
//12MHz晶振,250us定时初值
TL0=0x06;
TH1=0x3c;
//12MHz晶振,50ms定时初值
TL1=0xb0;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
/********************定时器0中断函数************************/
unsignedintrun_nian()////判断是否为闰年
uintrun;
if((nian%4==0&
&
nian%100!
=0)||nian%400==0)//闰年的条件
run=1;
run=0;
returnrun;
voidTIMER0_OVER(void)interrupt1
{unsignedintcount;
//中断次数计数值
TH0=0x06;
TL0=0x06;
count++;
if(count==4000)
{count=0;
clear_flag=1;
//置液晶清除屏幕标志为1
sec++;
//秒加1
if(sec==60)
{sec=0;
min++;
//分加1
if(min==60)
{min=0;
hour++;
//时加1
if(hour==24)
{hour=0;
//时清0
ri++;
xq++;
if(xq>
7)xq=1;
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
if(ri>
31){ri=1;
yue++;
}//大月31天
if(yue==4||yue==6||yue==9||yue==11)
if(ri>
30){ri=1;
}//小月30天
if(yue==2)
{if(run_nian())//闰年的条件
{if(ri>
29){ri=1;
}}//闰年2月为29天
28){ri=1;
}}//平年2月为28天
}
if(yue>
12){yue=1;
nian++;
if(nian>
2100)nian=0;
//{if(xq=7)xq=1;
/***************年、月、日转换程序********************/
//作用:
处理显示数据年、月、日
voidRiQi_process(uchar*p1)
{p1[0]=((uchar)(nian/1000))+0x30;
p1[1]=((uchar)(nian%1000/100))+0x30;
if(SJ==1&
Flicker==1)
{p1[2]='
'
p1[3]='
}
{p1[2]=((uchar)(nian%1000%100/10))+0x30;
p1[3]=((uchar)(nian%1000%100%10))+0x30;
p1[4]='
-'
if(SJ==2&
{p1[5]='
p1[6]='
{p1[5]=yue/10+0x30;
p1[6]=yue%10+0x30;
p1[7]='
if(SJ==3&
{p1[8]='
p1[9]='
{p1[8]=ri/10+0x30;
p1[9]=ri%10+0x30;
p1[10]='
{p1[11]='
p1[12]='
{//p1[11]=xq/10+0x30;
p1[11]=xq%10+0x30;
\0'
//结束标示
/***************时、分、秒转换程序********************/
处理显示数据时、分、秒
voidShiJian_process(uchar*p2)
{if(SJ==4&
{p2[0]='
p2[1]='
{p2[0]=hour/10+0x30;
p2[1]=hour%10+0x30;
p2[2]='
:
'
if(SJ==5&
{p2[3]='
p2[4]='
{p2[3]=min/10+0x30;
p2[4]=min%10+0x30;
p2[5]='
if(SJ==6&
{p2[6]='
p2[7]='
{p2[6]=sec/10+0x30;
p2[7]=sec%10+0x30;
p2[8]='
//结束标示
/***************闹钟处理子程序********************/
处理设置闹钟时的显示数据时、分、秒
voidNaoZhong_process(uchar*p3)
{if(NZ==1&
{p3[0]='
p3[1]='
{p3[0]=alarm_hour/10+0x30;
p3[1]=alarm_hour%10+0x30;
p3[2]='
if(NZ==2&
{p3[3]='
p3[4]='
{p3[3]=alarm_min/10+0x30;
p3[4]=alarm_min%10+0x30;
p3[5]='
if(NZ==3&
{p3[6]='
p3[7]='
{p3[6]=alarm_sec/10+0x30;
p3[7]=alarm_sec%10+0x30;
p3[8]='
/*****************定时器1中断函数*****************/
voidtimer_1(void)interrupt3//中断入口,闪烁
{
TH1=0x3C;
//50ms定时晶振12M
TL1=0xB0;
if(count1++==10)//500ms
{count1=0;
Flicker=!
Flicker;
if(msec++==20)//1000ms
{msec=0;
if(h++==3)//3秒后进入正常走时。
{SJ=0;
h=0;
NZ=0;
TR0=1;
flag=0;
if(start_alarm_flag==1)
{if(count2++==100)//5秒后闹钟停止
{count2=0;
alarm_flag=0;
start_alarm_flag=0;
}
/*****************按键扫描程序****************************/
voidkey_scan()
{if(alarm_stop==0)//闹钟停止
delay_nms(10);
if(alarm_stop==0)
alarm_flag=0;
start_alarm_flag=0;
if(key_alarm==0)//设置闹钟
if(key_alarm==0)
{NZ++;
flag=1;
SJ=0;
if(NZ>
3)
{NZ=0;
flag=0;
clear_flag=1;
start_alarm_flag=1;
}
whi