单片机课程设计--电子时钟实验可定时调闹钟用LCD显示

上传人:ra****d 文档编号:214834679 上传时间:2023-05-31 格式:DOC 页数:17 大小:811.50KB
收藏 版权申诉 举报 下载
单片机课程设计--电子时钟实验可定时调闹钟用LCD显示_第1页
第1页 / 共17页
单片机课程设计--电子时钟实验可定时调闹钟用LCD显示_第2页
第2页 / 共17页
单片机课程设计--电子时钟实验可定时调闹钟用LCD显示_第3页
第3页 / 共17页
资源描述:

《单片机课程设计--电子时钟实验可定时调闹钟用LCD显示》由会员分享,可在线阅读,更多相关《单片机课程设计--电子时钟实验可定时调闹钟用LCD显示(17页珍藏版)》请在装配图网上搜索。

1、评阅单片机实验报告 姓名 学号 时间 2021.1.9 实验题目 电子数字钟 一、实验目的与要求1. 电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。用LCD显示。2.具有按键时间校正功能。3.具备设定闹钟和定时闹钟功能。二、实验环境硬件环境、软件环境1.硬件环境:单片机开发板一个,计算机一台,单片机主机电源线及与计算机的连接线各一条。2.软件环境:软件Keil C51和软件Flash Magic。三、实验电路P2口输入、P1口输出实验原理图 本次实验主要使用了开发板的4个板块,分别是单片机STC89C52如图2所示、矩阵键盘如图2所示、1206LCD显示器和蜂鸣器如图3所示。其中单片

2、机芯片通过P0口把总线和矩阵键盘连接;通过P2.2和蜂鸣器间接相连,因为蜂鸣器所在的电路已经连芯片ULN2003,因此用一根杜邦线把P2.2和芯片ULN2003的第一个输入口IN1连起来。而键盘显示这一块,由于内部已经把键盘显示的电路和单片机芯片连接起来了,所以不需要借助杜邦线了。图1为实物连线图。图1 实物连线图图2 单片机机座和矩阵键盘图3 蜂鸣器和1602液晶显示器四、程序流程图主要算法: 主函数中先定时中断初始化,利用定时器中断实现走时,调用LCD显示程序和按键处理子函数,再调用显示时间函数显示初始时间值。同时,在主函数中判断当前的小时和分钟值是否等于闹钟设定的时间,假设等于那么让蜂鸣

3、器响。主函数算法的框图如图4所示。按键处理函数算法:通过键盘扫描函数得到确定哪个键盘按下,得到键盘值,如果键0按下那么暂停时钟走时;键1按下那么在当前的光标所在的时间单元加1;键2按下那么开闹钟;键3按下那么实现当前的时间单元左移一位的功能;键4按下那么在当前的光标所在的时间单元减1。时间的年月日算法:通过定时器实现时钟的走时,秒满60,分钟加1;分满60,小时加1;小时满24,日加1;至于每个月的天数根据闰年和非闰年的表格确定当月天数。 图4 主函数算法框图五、程序测试报告:调试输入数据、结果数据或状态。1.输入:源代码1 输出结果:1 电子数字钟必须具有显示年、月、日和显示时、分、秒的功能

4、。用LCD显示2具有按键时间校正功能。3具备设定闹钟和定时闹钟功能。六、体会:碰到的问题、如何解决、有何体会。1.深入了解如何运用高级语言,此次实验运用C语言进行编程,使单片机开发板实现电子时钟的功能,对汇编语言和高级语言在实现单片机功能的特点也加深了认识。体会到C语言在编程时的灵活性和不用过多考虑硬件的方便。2.该实验中主要用到几个板块,单片机控制,键盘运用,LCD显示,蜂鸣器。掌握了键盘的工作方式和扫描的特点,懂得运用C语言进行编程键盘扫描的程序;掌握LCD显示的几种功能指令,尽管LCD显示的程序较多,但是工作原理弄清楚后就清晰很多;掌握如何把硬件和软件联系起来,特别是控制定时闹钟蜂鸣器的

5、程序,由于该片单片机开发板的蜂鸣器是和步进电机等电路连在一起的,所以需要把控制蜂鸣器的连接端口找到,并用指令“sbit BEEP=P22进行定义;对单片机的应用有了更深入的认识和了解。3.蒋老师在实验过程中一直强调程序的排版格式,让我从细节上更注意排版,收获了一个美观处理文档的习惯。在实验过程中遇到了调试失败的各种问题,除了得到老师的指导,自己也主动上网搜索发生错误的各种原因,培养了解决问题的能力。七、源程序代码#include #includesbit BEEP=P22; /喇叭端口sbit RS = P24; /定义端口 sbit RW = P25;sbit EN = P26;bit Al

6、; /闹钟标志位#define DataPort P0#define KeyPort P1#define uint unsigned int#define uchar unsigned charuchar code table=0123456789;/转换成液晶显示的字符uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年uint i,j,k;uint n_hour,n_minu; /闹钟时,分uint sec,minu,

7、hour,day,mon;/秒,分,时,日,星期uint count,key;unsigned long int year; /年uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg;uchar ms,mg,ds,dg;uchar yq,yb,ys,yg;uchar i_,j_,k_;/*- mS延时函数,这里使用单片机的晶振为12MHz-*/void DelayMs(uchar i_) for(j_=i_;j_0;j_-) for(k_=500;k_0;k_-)/*- 判忙函数-*/ bit LCD_Check_Busy(void) DataPort

8、= 0xFF; RS=0; RW=1; EN=0; _nop_(); EN=1; return (bit)(DataPort & 0x80); /*- 写入命令函数-*/ void LCD_Write_Com(uchar com) RS=0; RW=0; DataPort=com; DelayMs(5); EN=1; DelayMs(5); EN=0; /*- 写入数据函数-*/ void LCD_Write_Data(uchar Data) /while(LCD_Check_Busy(); /忙那么等待 DelayMs(5); RS=1; RW=0; EN=1;DataPort= Data;

9、 DelayMs(5); EN=0; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(uchar x,uchar y,uchar *s) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/ void LCD_Write_Char(uchar x,uchar y

10、,uchar Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及

11、光标设置*/ /*-按键扫描函数,返回扫描键值-*/unsigned char KeyScan(void) /键盘扫描函数,使用行列反转扫描法 unsigned char cord_h,cord_l;/行列值中间变量 KeyPort=0x0f; /行线输出全为0 cord_h=KeyPort&0x0f; /读入列线值 if(cord_h!=0x0f) /先检测有无按键按下 DelayMs(10); /去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&0x0f; /读入列线值 KeyPort=cord_h|0xf0; /输出当前列线值 cord_l=KeyPor

12、t&0xf0; /读入行线值 while(KeyPort&0xf0)!=0xf0);/等待松开并输出 return(cord_h+cord_l);/键盘最后组合码值 return(0xff); /返回该值/*-按键值处理函数,返回扫键值-*/unsigned char KeyPro(void) switch(KeyScan() case 0x7e:return 0;break;/0 暂停键 case 0x7d:return 1;break;/1 加 case 0x7b:return 2;break;/2 闹钟 case 0x77:return 3;break;/3 左移 case 0xbe:r

13、eturn 4;break;/4 减 case 0xbd:return 5;break;/5 case 0xbb:return 6;break;/6 case 0xb7:return 7;break;/7 case 0xde:return 8;break;/8 case 0xdd:return 9;break;/9 case 0xdb:return 10;break;/a case 0xd7:return 11;break;/b case 0xee:return 12;break;/c case 0xed:return 13;break;/d case 0xeb:return 14;break

14、;/e case 0xe7:return 15;break;/f default:return 0xff;break; /*- 键盘控制时间函数0键-暂停键,1键-加1键, 2键-开闹钟,3键-左移键,4键-减1键-*/void jianpan() key=KeyPro(); if(key!=0xff) if(key=0)/关中断,暂停时钟 EA=EA; if(EA=0)&(Al=0) /假设闹钟关且时间暂停,那么可以改动时间 if(key=3) / 左移,i为改动标志位,按顺序改动秒分时日月年 if(i6)i+;elsei=0; else if(key=1) /加1,根据i增加对应的数值 s

15、witch(i) case 0:if(sec59)sec+;elsesec=0;break; case 1:if(minu59)minu+;elseminu=0;break; case 2:if(hour23)hour+;elsehour=0;break; case 3:if(day31)day+;elseday=0;break; case 4:if(mon0)sec-;elsesec=60;break; case 1:if(minu0)minu-;elseminu=60;break; case 2:if(hour0)hour-;elsehour=23;break; case 3:if(day

16、1)day-;elseday=31;break; case 4:if(mon1)mon-;elsemon=12;break; case 5:if(year0)year-;break; if(key=2) /闹钟开关 Al=Al; if(Al=1) /闹钟开,显示闹钟,允许设定闹钟 if(key=3) /左移,设定标志位 if(j1) j+;else j=0;else if(key=1) /加1,根据l增减设定 switch(j) case 0:if(n_hour24)n_hour+;break; case 1:if(n_minu0)n_hour-;break; case 1:if(n_minu

17、0)n_minu-;break; else if(Al=0) LCD_Write_Char(15,0, ); LCD_Write_String(10,1, ); /*- 时间的年月日算法考虑闰年和非闰年-*/ void time() /计时函数 if(sec=60) sec=0; minu+; if(minu=60) minu=0; hour+; if(hour=24) hour=0; day+; if(year%4=0&year%100!=0|year%400=0) /闰年 if(day=table1mon+1) day=0;mon+;if(mon=13)mon=0;year+;else /

18、非闰年if(day=table2mon+1)day=0;mon+;if(mon=13) mon=0;year+;/*- 定时器中断控制时钟走动-*/void time0_to()interrupt 1TH0=(65536-49872)/256;TL0=(65536-49872)%256;count+;if(count=20)/中断20次为一秒 count=0; sec+; time(); /*- 时间显示函数-*/void DISPLAY() uchar KeyPro();yq=year/1000;yb=(year/100)%10;ys=(year/10)%10;yg=year%10;hg=h

19、our%10;mis=minu/10;mig=minu%10;ss=sec/10;sg=sec%10;mg=mon%10;ds=day/10;dg=day%10;nhg=n_hour%10;nms=n_minu/10;nmg=n_minu%10; /年显示 LCD_Write_Char(0,0,tableyq); LCD_Write_Char(1,0,tableyb); LCD_Write_Char(2,0,tableys); LCD_Write_Char(3,0,tableyg); LCD_Write_Char(4,0,-); /月显示 LCD_Write_Char(5,0,tablems)

20、; LCD_Write_Char(6,0,tablemg); LCD_Write_Char(7,0,-); /日显示 LCD_Write_Char(8,0,tableds); LCD_Write_Char(9,0,tabledg); /时显示 LCD_Write_Char(1,1,tablehs); LCD_Write_Char(2,1,tablehg); LCD_Write_Char(3,1,:); /分显示 LCD_Write_Char(4,1,tablemis); LCD_Write_Char(5,1,tablemig); LCD_Write_Char(6,1,:); /秒显示 LCD_

21、Write_Char(7,1,tabless); LCD_Write_Char(8,1,tablesg); if(Al=1) /闹钟开,显示闹钟,允许设定闹钟 LCD_Write_Char(15,0,*); LCD_Write_Char(10,1,tablenhs); LCD_Write_Char(11,1,tablenhg); LCD_Write_Char(12,1,:); LCD_Write_Char(13,1,tablenms); LCD_Write_Char(14,1,tablenmg);/*-主函数-*/ void main(void) EA=1; /开中断ET0=1;TR0=1;T

22、MOD=0x01;TH0=(65536-45872)/256; TL0=(65536-45872)%256; /定时器赋初值hour=23;minu=59;sec=49; /赋初值:11点59分49秒n_hour=18;n_minu=10; /闹钟赋初值18点10分year=2021;mon=1;day=1;/年月日赋初值LCD_Init(); LCD_Write_Com(0x0F);/光标开,光标闪烁开DelayMs(750);/延时0.75秒LCD_Clear(); while(1) jianpan(); /扫描键盘 DISPLAY(); /显示时间 if(Al=1)&(n_hour=hour)&(n_minu=minu) DelayMs(1);BEEP=!BEEP;/闹钟响

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!