单片机三级项目报告

上传人:su****e 文档编号:144594532 上传时间:2022-08-27 格式:DOC 页数:26 大小:652.65KB
收藏 版权申诉 举报 下载
单片机三级项目报告_第1页
第1页 / 共26页
单片机三级项目报告_第2页
第2页 / 共26页
单片机三级项目报告_第3页
第3页 / 共26页
资源描述:

《单片机三级项目报告》由会员分享,可在线阅读,更多相关《单片机三级项目报告(26页珍藏版)》请在装配图网上搜索。

1、燕山大学 基于单片机的智能电子钟系统仿真设计Design and Simulation Of Electronic Clock Based on Single-chip System 教 务 处 2015年 10 月26基于单片机的智能电子钟系统仿真设计(燕山大学 信息科学与工程学院)摘 要摘要:本课程三级项目是基于MCS-51系列单片机利用Protues软件仿真设计一个简单的电子钟系统。以MCS-51系列单片机为核心,通过时钟芯片DS1302提供实时时间数据,通过温度传感器DS18B20提供实时温度数据,通过LCD1602液晶显示屏显示时间温度等信息,以及蜂鸣器、指示灯等提供闹钟和上下午、半

2、秒闪烁等信息。我们采用C语言,利用keil软件编写C语言程序并生成HEX文件,用Protues设计电路,将程序在Protues中仿真,最终实现电子钟的设计。关键词:89c51单片机、闹钟报警、Proteus、DS1302、时钟前 言本三级项目要求基于MCS-51系列单片机利用Protues软件仿真设计一个具有时间显示、按键调时、闹钟报警、温度测量等功能的电子钟系统。我们对电子钟的开发手段进行了分析,最终决定采用51系列单片机技术实现多功能智能电子钟系统,这种实现方法的优点是电路简单、性能可靠、实时性好、时间精确、操作简单、编程容易。我们利用Proteus软件进行仿真设计,这样不用制作实际电路便

3、可以得出结果,便于检验电路及软件正确性,可以为以后制作实际电路做准备。另外这样制作出的电子钟系统可以应用到日常工作和生活中,也可以通过改装来提高性能或者进行功能扩充等操作。 该项目预期完成温度实时测量显示、时间实时显示、可设定闹钟、可调时、上下午指示、半秒指示等功能。1、课程设计题目与要求1.1 设计题目基于单片机的简单电子钟系统仿真设计。1.2 设计要求要求基于51系列单片机利用Protues软件仿真设计一个具有时间显示、按键调时、闹钟报警、温度测量等功能的电子钟系统,可实现六项基本功能分别如下:1) 时间显示:显示当前时间:小时、分钟、秒。2) 温度显示:显示当前环境温度。3) 上下午指示

4、:采用两个发光二极管来指示上下午。4) 半秒提示:采用两个发光二极管,每隔半秒闪烁。5) 调时功能:采用三个按键(K1-K3)来调整时间,步骤如下:a)按下K1键,开始调小时,同时2个小时数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好后,再按下K1键,开始调分钟,同时分钟数码管闪烁。d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K1键,调时结束。6) 闹钟功能:采用三个按键(K2-K4)来调整闹钟,步骤如下:a)按下K4键,开始调小时,同时2个小时数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好,再按下K4键,开始调分钟,同时

5、分钟数码管闪烁。d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K4键,定闹结束。闹钟定时的时间到后,蜂鸣器/扬声器发出提示音。用户需按K2-k4键来取消闹钟警告。2、系统的功能分析与设计2.1 系统的主要功能利用51单片机内部的定时/计数器、中断系统、以及按键和时钟芯片DS1302、DS18B20温度传感器、LCD1602液晶显示屏等元件,利用Protues软件仿真设计一个具有时间显示、按键调时、闹钟报警、温度测量等功能的电子钟系统。2.2 系统的设计方案整个系统采用应用广泛的AT89C51作为控制芯片,利用DS1302获取时间,采用DS18B20实现温度的测量,利用LC

6、D1602液晶显示屏显示温度,时间等参数,利用单片机内部的定时器来实现数据的定时刷新。它的处理过程如下:首先初始化定时器以及温度传感器和时钟芯片,设定单片机内部的一个定时器为50ms产生一次中断,对时间和温度参数实现周期性刷新,然后读取温度,将温度值与设置的闹钟值等参数进行比较,并做出相应的动作。然后读取按键值,如果是设置键,则改变标志位,并进入相应项进行设置,若标志位为初始状态,则显示时间及温度参数。在程序中,定时器采用中断方式工作,在中断服务程序中实现时间获取、温度获取、上下午判断、闹钟报警、以及半秒闪烁等功能。在主程序中需要对定时器、DS1302、DS18B20、LCD1602进行初始化

7、,然后循环进行按键检测并执行相应的功能。2.3 系统硬件设计2.3.1 原理框图此设计原理框图如下图所示,此电路包括以下九个部分:单片机,时钟电路,测温电路,按键电路,LED指示灯,复位电路,晶振电路,显示电路及蜂鸣器。图2-3-1 电子钟系统硬件电路组成框图2.3.2 Proteus 电路图设计我们利用Proteus软件进行电路仿真。Proteus软件不仅具有其它EDA工具软件的仿真功能,而且还能仿真单片机及外围器件。是目前比较好用的仿真单片机及外围器件的工具。下图为我们设计的简单电子时钟的电路仿真图。图2-3-2 Proteus中设计的电子时钟系统原理图3、系统模块设计3.1 主控模块AT

8、89C51AT89C51是美国Atmel公司生产的低功耗,高性能CMOS八位单片机。片内ROM全部采用FLASH ROM技术,片内含4KB的可系统编程的Flash只读程序存储器,器件采用Atmel公司的高密度、非易失性存储技术生产,完全兼容Intel公司生产的MCS-51系列单片机的指令系统及引脚。图3-1-1 AT89C51单片机3.2 时钟模块我们采用DS1302实现时间显示,DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字

9、节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。芯片引脚及在系统中连接如下图 图3-2-1. DS1302芯片接线图3.3 温度显示模块此模块我们采用DS18B20温度传感器,它是美国DALLAS公司推出的DS系列数字温度传感器,每一个DSl8B20包括一个唯一的64位长的序号,该序号值存放在 DSl8B20内部的 ROM(只读存储器)中,开始8位是产品类型编码(DSl8B20编码均为10H),接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码,DSl8B20 中还有用于贮存测得的温度值的两个8位存储器RAM,编号为0号和

10、1号,1号存储器存放温度值的符号,如果温度为负,则1号存储器8位全为1,否则全为0 ;0号存储器用于存放温度值的补码,LSB(最低位)的1表示 0.5,将存储器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-55125 )。芯片引脚及在系统中连接如下图图3-3-1 DS18B20芯片接线图3.4 复位、指示灯和按键模块3.4.1 复位电路复位电路主要由型号为10uF的电解电容和220的电阻以及微动开关构成,当开关按下时引脚RST为高电平1,断开时引脚为低电平0。系统中复位电路连接如下图 图3-4-1 复位电路3.4.2 半秒显示和上下午显示电路指示灯电路主要由四个发光二极管组成,低

11、电平有效,灯的亮灭显示控制端,P3.0口控制上午指示灯,P3.1口控制下午指示灯,P3.6口控制前半秒指示灯,P3.7口控制后半秒指示灯。由于二极管压降小,承受电流能力弱。所以加上一个1K的限流电阻,防止二极管被烧坏。系统中指示灯电路连接如下图 图3-4-2 指示灯电路3.4.3 按键电路时钟、加、减、闹钟键分别接P3.2、P3.3 、P3.4、P3.5端,时钟键(K1)选择设置的年、月、日、时、分、秒、星期,闹钟键(K4)对闹钟的定时的时、分、秒进行设置,加键(K2)对选中的项的数据加1,减键(K3)对选中的项的数据减1。系统中按键电路连接如下图 图3-4-3按键电路3.5 闹钟模块此模块我

12、们利用扬声器电路为系统闹钟部分的发声部分,采用灌电流的方式,省去了外加驱动的麻烦,同时能够获得更大的驱动功率。扬声器电路连接如下图图3-5-1扬声器电路4、软件设计4.1 主程序设计在主程序中首先初始化定时器以及时钟芯片和温度传感器,设定单片机内部的一个定时器为50ms产生一次中断,以便对时间和温度参数实现周期性刷新。然后读取按键值,如果是设置键,则改变标志位,并进入相应的项进行设置,若标志位为初始状态,则显示时间及温度参数。 主程序流程图:图4-1-1 系统程序流程图4.2 定时器中断子程序设计定时器每隔50ms产生一次中断,调用一次中断子程序。程序首先获取温度、时间、然后将计数器值加1,判

13、断计数器值是否等于10,如果等于则清空计数器并将半秒指示灯取反。然后判断时间是否等于定时时间,如果等于则使蜂鸣器响,否则关闭蜂鸣器。然后判断是否为下午,如果为下午,则关闭上午指示灯,打开下午指示灯,否则关闭下午指示灯打开上午指示灯,之后返回主程序。图4-2-1为中断子程序流程图。图4-2-1 中断子程序流程图5、系统调试5.1 软件调试Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的

14、完整开发方案,通过一个集成开发环境(Vision)将这些部分组合在一起。如果使用C语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会使得编程效率大大提高。KeilC51进行程序编写调试图5-1-1 软件调试图在软件调试上既没有错误也没有警告,说明我们的程序没有语法错误,逻辑问题需要进行软硬件联调仿真后可知。5.2 Proteus进行系统仿真在Proteus ISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如下图所示:图5-2-1 系统联调仿真结果图实验结果基本按照预期实现要求,在系统的显示中我们没有利用数码管,而是利用LCD1602进行显示。虽然LCD1602驱动起

15、来更加麻烦,但它显示的字符多,而且清晰,功能较为齐全,所以我们使用LCD1602进行显示。6、设计总结 经过几周时间对单片机的知识学习及总结,通过该项目的实施使我们加深对单片机基础知识的理解,并初步具备运用所学知识进行电子钟系统设计的能力,相关标准、手册的查阅能力等,通过团队合作与沟通,培养我们的责任感和团队合作精神,以及项目组织与管理、交流表达能力。在此过程中我们把项目分成了硬件和软件两大模块分工合作。硬件部分好入手,电路也较简单,主要涉及的是简单的核心电路以及DS1302、DS18B20、LCD1602电路,连接起来并不复杂。整个设计过程中遇到的最大问题是软件的编写,软件部分细分为了时钟芯

16、片驱动程序、温度传感器驱动程序、显示模块驱动程序等几大难点,最后把几个模块整合在主程序模块中,最终实现了电子时钟的功能。在此次过程中,我们将在课程中学到的理论知识运用到实际作品设计、操作中,更进一步地熟悉了单片机芯片的结构及掌握了其工作原理和具体的使用方法与相关元器件的参数计算方法、使用方法,了解了电路的开发和制作及课程设计报告的编写。加深了对相关理论知识及专业知识的掌握度,增强自身的动手能力,锻炼及提高了理解问题、分析问题、解决问题的能力,更深刻的体会到了理论联系实际的重要性,在整个设计过程中还学到了团体合作精神和分析、解决问题的重要性。7 参考文献1 黄正谨综合电子设计与实践M东南大学出版

17、社2002-32 张毅刚 新编MSC-51单片机应用设计,哈尔滨工业大学出版社,20033 蔡希彪,曹洪奎;单片机电子时钟系统的设计与仿真J;中国科技信息;2007年04期4 杨欣等,电子设计从零开始,清华大学出版社,20055胡汉才单片机原理及其接口技术M.北京:清华大学出版社,1996.89110.8 程序#include reg52.h#include intrins.h#include math.h#define uchar unsigned char#define uint unsigned int#define LCD_DB P0 /LCD1602液晶数据/地址引脚sbit LCD

18、_RS=P20; /LCD1602读sbit LCD_RW=P21; /LCD1602写sbit LCD_EN=P22; /LCD1602使能sbit DSA=P13; / DS18B20温度传感器引脚/时钟芯片引脚定义sbit IO=P10;sbit SCLK=P11;sbit RST=P12;/独立按键引脚定义sbit Key_Chosen=P32;sbit KEY_ADD=P33; sbit KEY_SUB=P34;sbit Key_Alarm=P35;/第0位 第八位 位操作sbit ACC0=ACC0;sbit ACC7=ACC7;/报警指示引脚定义sbit Red=P36;/半秒指

19、示灯sbit Green=P37;sbit led_red=P30;/上下午指示灯sbit led_green=P31;sbit Beep=P14;/闹钟/时钟芯片寄存器定义#define write_second 0x80#define write_minute 0x82#define write_hour 0x84#define write_day 0x86#define write_month 0x88#define write_week 0x8a#define write_year 0x8cenum KEYSTART/按键状态KEY_DOWN,KEY_UP,;enum KEYCONFI

20、G/按键键值KEY_INIT,KEY_YEAR,KEY_MONTH,KEY_DAY,KEY_WEEK,KEY_HOUR,KEY_MINTH,KEY_ALARH,KEY_ALARM,;/*逻辑变量定义*/uint TempVal=0,num=0,flag=0;/定义温度值变量uchar YearData=0,MonthData=0,DayData=0,WeekData=0,HourData=0,MinuteData=0,AlarmH=0,AlarmM=0;/定义闹钟变量uchar miao=0,shi=0,fen=0,ri=0,yue=0,nian=0,week=0;/定义时间变量/*延时函数部

21、分*/void Delayus(uint n) /12MHz晶振,n微秒精确软件延时 uint i=0; for(i=n;i0;i-) _nop_();_nop_();_nop_();_nop_(); void Delayms(int n)/12MHz晶振,n毫秒精确软件延时int i,j;for(i=n;i0;i-) i=12;j=169;dowhile (-j);while (-i);/*LCD1602函数部分*/void LCD_wcmd(uchar dat) /LCD1602写命令函数Delayus(100);LCD_RS=0; LCD_RW=0; LCD_EN=1; LCD_DB=d

22、at;Delayus(100); LCD_EN=0;Delayus(100); void LCD_wdata(uchar dat) /LCD1602写数据函数Delayus(100);LCD_RS=1; LCD_RW=0; LCD_EN=1; LCD_DB=dat;Delayus(100);LCD_EN=0;Delayus(100);void LCD_disp_char(uchar x,uchar y,uchar dat)/LCD1602写字符函数 X:015 Y:1,2uchar address=0;if(y=1)address=0x80+x;elseaddress=0xc0+x;LCD_w

23、cmd(address);LCD_wdata(dat);void LCD_disp_str(uchar x,uchar y,uchar *str)/LCD1602写一串字符 X:015 Y:1,2uchar address=0;if(y=1)address=0x80+x;elseaddress=0xc0+x;LCD_wcmd(address);while(*str!=0) LCD_wdata(*str); str+;void LCD_init(void)/LCD1602液晶初始化Delayus(100);LCD_wcmd(0x38);Delayus(100);LCD_wcmd(0x0c);De

24、layus(100);LCD_wcmd(0x06);Delayus(100);LCD_wcmd(0x01);Delayms(1); /*温度传感器函数部分*/void DS18B20_Delay(uint n)/温度传感器最小单位延时int i=0,j=0;for(i=n;i0;i-)for(j=120;j0;j-);void DS18B20_Reset() /温度传感器复位操作int i=0;DSA=0;i=103;while(i0)i-;DSA=1;i=4;while(i0)i-;bit DS18B20_Readbit() /读温度传感器一位数据信息uint i=0;bit dat=0;D

25、SA=0;i+; DSA=1;i+;i+;dat=DSA;i=8;while(i0)i-;return (dat);uchar DS18B20_Read() /读温度传感器八位数据信息 uchar i=0,j=0,dat=0; for(i=1;i=8;i+) j=DS18B20_Readbit(); dat=(j1); return(dat);void DS18B20_Writebyte(uchar dat) /写温度传感器八位数据信息uint i=0;uchar j=0;bit testb=0;for(j=1;j1;if(testb) /写1DSA=0;i+;i+;DSA=1;i=8;whi

26、le(i0)i-;elseDSA=0; /写0i=8;while(i0)i-;DSA=1;i+;i+;void DS18B20_Change() /温度转换DS18B20_Reset();DS18B20_Delay(1);DS18B20_Writebyte(0xcc); DS18B20_Writebyte(0x44); uint DS18B20_Get() /读取温度寄存器转换数据 float tt=0;uchar a=0,b=0;uint tempA=0;DS18B20_Reset();DS18B20_Delay(1);DS18B20_Writebyte(0xcc);DS18B20_Writ

27、ebyte(0xbe);a=DS18B20_Read();b=DS18B20_Read();tempA=b;tempA0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC1;uchar DS1302_rbyte()/读时钟芯片八位数据信息uchar a=0;RST=1;for(a=8;a0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC1;return (ACC);void DS1302_write(uchar add,uchar dat)/在时钟芯片指定位置写指定数据RST=0;SCLK=0;RST=1;DS1302_wbyte(add);DS1302_wb

28、yte(dat);SCLK=1;RST=0;uchar DS1302_read(uchar add)/读取时钟芯片指定地址的数据信息uchar temp;RST=0;SCLK=0;RST=1;DS1302_wbyte(add);temp=DS1302_rbyte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/时钟芯片数据转换uchar Decimal;Decimal=bcd4;return(Decimal=Decimal*10+(bcd&=0x0F);void DS1302_Init() /时钟芯片初始化操作RST=0;SCL

29、K=0;DS1302_write(0x8e,0x00); DS1302_write(0x8e,0x80); void DS1302_Set(uchar address,uchar temp) /设置时钟芯片参数信息uchar tmp=0; tmp=temp/10;temp=temp%10;temp=temp+tmp*16;DS1302_write(0x8E,0X00);DS1302_write(address,temp&0x7f); DS1302_write(0x8E,0x80);void DS1302_GetTime()/提取时钟芯片时间信息miao=BCD_Decimal(DS1302_r

30、ead(0x81);fen=BCD_Decimal(DS1302_read(0x83);shi=BCD_Decimal(DS1302_read(0x85);ri=BCD_Decimal(DS1302_read(0x87);yue=BCD_Decimal(DS1302_read(0x89);nian=BCD_Decimal(DS1302_read(0x8d);week=BCD_Decimal(DS1302_read(0x8b);/*显示函数函数部分*/void show_Data()/ 年月日信息显示uchar dis_Data16=0;dis_Data0=2;dis_Data1=0;dis_D

31、ata2=(nian/10)+0x30;dis_Data3=(nian%10)+0x30;dis_Data4=-; dis_Data5=(yue/10)+0x30;dis_Data6=(yue%10)+0x30;dis_Data7=-;dis_Data8=(ri/10)+0x30;dis_Data9=(ri%10)+0x30;dis_Data10= ;dis_Data11=W;dis_Data12=126;dis_Data13=;LCD_disp_str(0,1,dis_Data);void show_Time(void)/时分秒温度信息显示uchar dis_Time16=0;dis_Tim

32、e0= ;dis_Time1=(shi/10)+0x30;dis_Time2=(shi%10)+0x30;dis_Time3=:; dis_Time4=(fen/10)+0x30;dis_Time5=(fen%10)+0x30;dis_Time6=:;dis_Time7=(miao/10)+0x30;dis_Time8=(miao%10)+0x30;dis_Time9= ;dis_Time10=TempVal/100+0;dis_Time11=TempVal%100/10+0;dis_Time12=.;dis_Time13=TempVal%10+0;dis_Time14=223;dis_Tim

33、e15=C;LCD_disp_str(0,2,dis_Time);/*参数设置函数部分*/void Set_Year()/设置年参数YearData=DS1302_read(0x8D);YearData=(YearData4)*10+(YearData&0x0f);if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(YearData=99)YearData=98;YearData+=1;DS1302_Set(write_year,YearData);LCD_disp_str(0,1, S

34、ET YEAR );LCD_disp_char(4,2,2);LCD_disp_char(5,2,0);LCD_disp_char(6,2,YearData/10+0x30);LCD_disp_char(7,2,YearData%10+0x30);void SetMonth()/设置月参数MonthData=DS1302_read(0x89);MonthData=(MonthData4)*10+(MonthData&0x0f);if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(Mont

35、hData=12)MonthData=11;MonthData+=1;DS1302_Set(write_month,MonthData);LCD_disp_str(0,1, SET MONTH );LCD_disp_char(6,2,MonthData/10+0x30);LCD_disp_char(7,2,MonthData%10+0x30);void SetDay()/设置日参数DayData=DS1302_read(0x87);DayData=(DayData4)*10+(DayData&0x0f);if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=K

36、EY_DOWN)while(KEY_SUB=KEY_DOWN);if(DayData=30)DayData=29;DayData+=1;DS1302_Set(write_day,DayData);LCD_disp_str(0,1, SET DAY );LCD_disp_char(6,2,DayData/10+0x30);LCD_disp_char(7,2,DayData%10+0x30);void SetWeek()/设置周期参数WeekData=DS1302_read(0x8b);WeekData=(WeekData4)*10+(WeekData&0x0f);if(KEY_SUB=KEY_D

37、OWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(WeekData=7)WeekData=6;WeekData+=1;DS1302_Set(write_week,WeekData);LCD_disp_str(0,1, SET WEEK );LCD_disp_char(6,2,WeekData/10+0x30);LCD_disp_char(7,2,WeekData%10+0x30);void SetHour()/设置小时参数HourData=DS1302_read(0x85);HourData=(HourData4)*

38、10+(HourData&0x0f);if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(HourData=23)HourData=22;HourData+=1;DS1302_Set(write_hour,HourData);LCD_disp_str(0,1, SET HOUR );LCD_disp_char(6,2,HourData/10+0x30);LCD_disp_char(7,2,HourData%10+0x30);void SetMinute()/设置分钟参数MinuteDat

39、a=DS1302_read(0x83);MinuteData=(MinuteData4)*10+(MinuteData&0x0f);if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(MinuteData=59)MinuteData=58;MinuteData+=1;DS1302_Set(write_minute,MinuteData);LCD_disp_str(0,1, SET MINUTE );LCD_disp_char(6,2,MinuteData/10+0x30);LCD_dis

40、p_char(7,2,MinuteData%10+0x30);void SetHourAlarm()/设置闹钟小时参数if(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(AlarmH=23)AlarmH=22;AlarmH+=1;LCD_disp_str(0,1, SET ALARMH );LCD_disp_char(6,2,AlarmH/10+0x30);LCD_disp_char(7,2,AlarmH%10+0x30);void SetMinuteAlarm()/设置闹钟分钟参数 i

41、f(KEY_SUB=KEY_DOWN)Delayus(500);if(KEY_SUB=KEY_DOWN)while(KEY_SUB=KEY_DOWN);if(AlarmM=59)AlarmM=58;AlarmM+=1;LCD_disp_str(0,1, SET ALARMM );LCD_disp_char(6,2,AlarmM/10+0x30);LCD_disp_char(7,2,AlarmM%10+0x30);/*读取按键值函数部分*/uchar KeyProcess()/读取按键键值static uchar KeyVal=KEY_INIT;if(Key_Chosen=KEY_DOWN)De

42、layus(500);if(Key_Chosen=KEY_DOWN)while(Key_Chosen=KEY_DOWN);if(KeyValKEY_ALARM-2)KeyVal=KEY_INIT;LCD_disp_str(0,1, );LCD_disp_str(0,2, );KeyVal+;if(KeyValKEY_ALARM-2)KeyVal=KEY_INIT;if(Key_Alarm=KEY_DOWN)Delayus(500);if(Key_Alarm=KEY_DOWN)while(Key_Alarm=KEY_DOWN);if(KeyValKEY_ALARM)KeyVal=KEY_ALAR

43、M-2;return KeyVal;/*中断配置部分*/void Init() /定时器、计数器设置函数TMOD=0x01; /指定定时/计数器的工作方式为3,50MSTH0=0x3c; /定时器T0的高四位=0TL0=0xb0; /定时器T0的低四位=0EA=1; /系统允许有开放的中断ET0=1; /允许T0中断TR0=1; /开启中断,启动定时器void timer0() interrupt 1 /中断函数,取得并显示日历和时间TH0=0x3c; /定时器T0的高四位=0TL0=0xb0; /定时器T0的低四位=0DS18B20_Change(); TempVal=DS18B20_Get

44、(); DS1302_GetTime();num+;if(num=10)num=0;flag=flag;Red=flag;Green=flag;HourData=DS1302_read(0x85);HourData=(HourData4)*10+(HourData&0x0f);MinuteData=DS1302_read(0x83);MinuteData=(MinuteData4)*10+(MinuteData&0x0f);if(HourData=AlarmH)&(MinuteData=AlarmM)Beep=1;/Beep=!Beep;elseBeep=0;if(shi=12)led_red

45、=0;led_green=1;elseled_red=1;led_green=0;/*初始化函数部分*/void HandInit()/外围硬件初始化 LCD_init();DS1302_Init();Init();Red = 1;Green = 0;/*主程序部分函数*/void main()HandInit();while(1)uchar StartChange=KEY_INIT;StartChange=KeyProcess();switch(StartChange)case KEY_INIT:show_Data();show_Time();break;case KEY_YEAR:Set_Year();break;case KEY_MONTH:SetMonth();break;case KEY_DAY:SetDay();break;case KEY_WEEK:SetWeek();break;case KEY_HOUR:SetHour();break;case KEY_MINTH:SetMinute();break;case KEY_ALARH:SetHourAlarm();break;case KEY_ALARM:SetMinuteAlarm();break;default:break;

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