lCD时钟日历设计报告Word下载.docx

上传人:b****4 文档编号:7944592 上传时间:2023-05-09 格式:DOCX 页数:30 大小:58.34KB
下载 相关 举报
lCD时钟日历设计报告Word下载.docx_第1页
第1页 / 共30页
lCD时钟日历设计报告Word下载.docx_第2页
第2页 / 共30页
lCD时钟日历设计报告Word下载.docx_第3页
第3页 / 共30页
lCD时钟日历设计报告Word下载.docx_第4页
第4页 / 共30页
lCD时钟日历设计报告Word下载.docx_第5页
第5页 / 共30页
lCD时钟日历设计报告Word下载.docx_第6页
第6页 / 共30页
lCD时钟日历设计报告Word下载.docx_第7页
第7页 / 共30页
lCD时钟日历设计报告Word下载.docx_第8页
第8页 / 共30页
lCD时钟日历设计报告Word下载.docx_第9页
第9页 / 共30页
lCD时钟日历设计报告Word下载.docx_第10页
第10页 / 共30页
lCD时钟日历设计报告Word下载.docx_第11页
第11页 / 共30页
lCD时钟日历设计报告Word下载.docx_第12页
第12页 / 共30页
lCD时钟日历设计报告Word下载.docx_第13页
第13页 / 共30页
lCD时钟日历设计报告Word下载.docx_第14页
第14页 / 共30页
lCD时钟日历设计报告Word下载.docx_第15页
第15页 / 共30页
lCD时钟日历设计报告Word下载.docx_第16页
第16页 / 共30页
lCD时钟日历设计报告Word下载.docx_第17页
第17页 / 共30页
lCD时钟日历设计报告Word下载.docx_第18页
第18页 / 共30页
lCD时钟日历设计报告Word下载.docx_第19页
第19页 / 共30页
lCD时钟日历设计报告Word下载.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

lCD时钟日历设计报告Word下载.docx

《lCD时钟日历设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《lCD时钟日历设计报告Word下载.docx(30页珍藏版)》请在冰点文库上搜索。

lCD时钟日历设计报告Word下载.docx

另外它们在价格上差距很大,考虑成本我们首选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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2