基于16F887单片机数字钟课设设计报告word格式_第1页
基于16F887单片机数字钟课设设计报告word格式_第2页
基于16F887单片机数字钟课设设计报告word格式_第3页
基于16F887单片机数字钟课设设计报告word格式_第4页
基于16F887单片机数字钟课设设计报告word格式_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、xxxxxx基于PIC16F887单片机的数字钟课程设计报告学生姓名: _学 号: _ 专业班级: _ _ 指导教师: _ _年 月 日目 录 1.功能介绍31.1 PIC16F887介绍31.2 DS1307介绍31.3 TC74介绍31.4 LM1602L介绍31.5蜂鸣器介绍32.硬件原理框图43.模块介绍43.1 单片机最小系统模块43.2时间和温度通讯模块53.3 按键模块53.4 蜂鸣器和液晶显示器模块54.软件框图75.软件功能介绍75.1 端口LCD和IIC初始化及端口若上拉75.2 显示预显示的数字和字母85.3 根据闹钟按键判断95.4 写入初值到时钟芯片95.5 时间加减

2、设置105.6 显示时间读和显示温度显示字母星期116.个人心得体会126.1 关于PIC课设126.2 课设过程遇到的问题及解决措施126.3 我的建议14附录1:数字钟的全部C程序15附录2:Proteus完整仿真图441.功能介绍1.1 PIC16F887介绍PIC16F887单片机共有40个引脚,其中有33个端口引脚,7个电源地和复位引脚。外部晶振设为4MHz,引脚1接复位按键。此数字钟用到单片机的B端口中断功能,端口若上拉,电平变化下降沿中断。1.2 DS1307介绍DS1307时钟芯片是实时时钟芯片,它提供秒分时日月年和星期等数据,有备用电源,主电源掉电备用,时钟晶振是32.768

3、kHz。其控制寄存器的地址为07,其值0b11010000,代表允许其7脚输出每秒1Hz的方波。其秒分时日月年和星期分别存在地址为00010204050603中。其与单片机的通讯为IIC通讯。1.3 TC74介绍 温度传感器TC74是感测周围温度值。TC74芯片的默认值为0b1001101(实验板上芯片调试时的地址为0b1001000,此为仿真时用的地址)。单片机首先向TC74改善地址,地址在字节的高7位,最低位为0表示为写。接着单片机向TC74发送第二个数据,即读温度命令字RTR,即8位0;然后重新开始,单片机再向TC74发送地址,但此时的最低位为1,表示接下来是要读TC74的温度值。最后单

4、片机接收TC74发出的温度值。TC74与单片机的通讯也为IIC通讯。1.4 LM1602L介绍 字符型LM016L液晶显示器。要求用4位数据线通讯,传送命令也传送地址。其初始化的格式是固定的,不能更改的,初始化见后面所示。输入到液晶显示器的是所示字符的ASCII码,液晶才能正确显示。1.5蜂鸣器介绍 蜂鸣器是用来设置闹钟用的。当设定闹钟的时间到时,蜂鸣器响,按键按下,停止响。按键模块是用来进行年月日秒分时和星期加减及设定闹钟用的。采用的是电平变化的中断模式。2.硬件原理框图 220V变压器变压CUP模块液晶显示按键输入DS1307和TC74市电220V电压经变压器变压供CPU使用的低压。DS1

5、307和TC74经CPU显示在液晶上。按键控制DS1307的时间加减和闹钟设置,实现闹钟功能。先在液晶上定位要显示数据的位置,然后将要显示的字符的ASCII码输入到液晶,即可正确数据。.模块介绍3.1 单片机最小系统模块此单片机的外部晶振为4MHz,引脚1接有高电平和复位按钮。端口B口用来进行电平变化中断,端口RC3和RC4用来进行IIC通讯,RC1用来输出高电平给蜂鸣器。端口D端口用来输出命令和数据给液晶显示器。3.2时间和温度通讯模块DS1307时间芯片可根据输入的数据自动走时。单片机不断地访问DS1307芯片,将访问得到的数据显示在液晶显示器上。其中芯片上读出来的星期是数字星期(01即代

6、表星期一),软件部分将数字星期转换成字母星期(如Wed为星期三)。单片机也访问TC74温度传感器,要得到的数据显示在液晶上。温度传感器小数后面有一位,但是设计时只显示到个位,不显示小数点后面的数字。3.3 按键模块按键S1是用来定位时间加减用的,来回按7下,分别对秒分时,星期和日月年。S2可以对时间进行加运算即每按一下,相应的时间加1;S3可以时间进行减运算即每按一下,相应的时间减1;S4是闹钟按键,按第一下,进入闹钟设置模式,此时再按S2或S3可以对时间进行设定。按第二下时,CPU进入比较模式,即把DS1307的时间和设定保存好的时间进行比较,等待设定的时间到时,蜂鸣器开始响。当按第三下时,

7、蜂鸣器停止响,相应的变量清零,从重新开始。3.4 蜂鸣器和液晶显示器模块 当定时时间到,RC1输出高电平,二极管导通,蜂鸣器开始响。当RC1输出低电平时,二极管截止,蜂鸣器停止响。液晶显示器用来显示时间,星期和温度,首先要进行显示时间定位,即写入命令。然后进行显示数据输入,即定稿数据。VEE和VSS都拉低,VDD拉高电平。RS为0时,写命令,为1时写数据;R/为1时表示读,0时表示写;E数据使能端,下降沿送入有效。RD0RD3,数据输入端,使用液晶显示器端口的高4位。 4.软件框图端口LCD和IIC初始化及端口若上拉 显示预显示的数字和字母延迟2秒写入初值到时钟芯片显示时间读和显示温度显示字母

8、星期时间加减设置闹钟设置和进行比较蜂鸣器响C=0或2C=1C=2S4第三次按下蜂鸣器不响C=3根据闹钟按键判断该功能在中断程序段中5.软件功能介绍5.1 端口LCD和IIC初始化及端口若上拉/初始化端口void CSH(void)TRISB=0b11111111; /端口B全为输入 TRISC=0b00011000; /端口C中RC3和RC4为输入,其余为输出 ANSELH=0b00000000; /选择I/O口 ANSEL=0; /选择I/O口 OPTION=0b00000000; /允许若上拉,下降沿中断 WPUB=0b11111111; /B口若上拉 TRISA4=1; /A口第5引脚为

9、输入 TRISD=0b00000000;/控制LCD1604,全为输出 IOCB=0b00001111; /允许电平变化中断 INTCON=0b11001000; /允许全局中断,B口电平变化中断 FMQ=0; /蜂鸣器不响LCD_CSH(); /LCD初始化 IIC_CSH(); /IIC初始化此为对端口LCD和IIC的初始化,上面均有详细的说明,在此不做过多的重复。LCD的初始化,上电时需要延时15ms及以上,此为延时20ms,其C程序见附录。IIC的初始化,初始化过程实际上是对几个相关的寄存器设置的过程,其C程序见附录。5.2 显示预显示的数字和字母const char MENU0217

10、=" 010900628 "," linyixing "/完全按照数组中的字符显示整屏void DISP_MENU(const char *A) char i,j;for (i=0;i<2;i+) for (j=0;j<16;j+) DDj=*A+; A+; /因为未尾还有结束字符 DISP_C(LINEi); /在line行显示整行,共16个字符,字符在数组DD中,注意显示字符直接将字符放入DD数组/而显示数字时则要将数值转换成显示的ASC码void DISP_C(char line)char i;LCD_WRITE(line,COM);/

11、写行命令for (i=0;i<16;i+)LCD_WRITE(DDi,DAT);/写16个数据,即显示1行/写一字节数R1,FLAG为写命令或数据选择,0为写命令,1为写数据/写之前先检查是否忙,写完后延时100us,分二次写4位数据/命令void LCD_WRITE(char R1,char FLAG)char R2;LCD_BUSY(); /忙检测R2=R1 & 0xF0;/低4位清0R2=R2>>4;/取高4位LCD_WRITE_4(R2,FLAG);/先写高4位R2=R1 & 0x0F;/高4位清0,取低4位LCD_WRITE_4(R2,FLAG);/

12、再送低4位DELAY_US(10);/延时100us/写R1的低4位,FLAG为寄存器选择,1为命令,0为数据void LCD_WRITE_4(char R1,char FLAG)LCD_RW=0;NOP();/写模式LCD_RS=FLAG;NOP(); /寄存器选择PORTD &= 0xf0;NOP();/RD高4位先清0LCD_E=1;NOP();/使能 PORTD |=R1;NOP();/送4位LCD_E=0;NOP();/数据送入有效LCD_RS=0;NOP();PORTD &= 0x0F;/RD高4位清0此程序的功能的把给定的字符显示到LCD液晶显示器上,字符串有两行

13、,分行显示。先是对要显示的位置进行定位,如第一行第0位。然后将一个字符的高低4位分别送入显示,显示时送入的是ASCII码。5.3 根据闹钟按键判断 此为根据c=0,1,2来判断的。为0或2时,显示的是时钟芯片的时间,其中为2时,时钟有在比较时间;为1时显示的时闹钟设定的时间。c为3 时蜂鸣器不响。其C程序详见附录。5.4 写入初值到时钟芯片LCD_WRITE(0b00000001,COM); /清屏WRITE_DS1307(0x07,0x10);/写控制字到LCDWRITE_DS1307(0x00,0x00);/0秒WRITE_DS1307(0x01,0x00);/00分WRITE_DS130

14、7(0x02,0x11); /11hWRITE_DS1307(0x03,0x03);/星期3WRITE_DS1307(0x04,0x08);/8日WRITE_DS1307(0x05,0x05);/5月WRITE_DS1307(0x06,0x12);/12年/写ds1307,地址为address,数为datavoid WRITE_DS1307(char ADDRESS,char da) START_BIT; IIC_SEND(ADDR); IIC_SEND(ADDRESS); IIC_SEND(da); STOP_BIT;/发送数R并等待发送完成,收到从机的应答信号,中断用void IIC_SE

15、ND_interrupt(char R)SSPBUF=R;/发送 SSPIF=0;while (RW=1);/在主动模式下,判断发送是否完成while (SSPIF=0);/等待发送完成while (ACKSTAT=1);/等待从机发送应答信号 NOP(); NOP(); 写入初值到时钟芯片时,要用到IIC通讯,即IIC发送。先送时钟地址,再送要写入数据的地址,再送入数据。此可对时钟芯片的年月日,秒分时和星期进行设定初值。5.5 时间加减设置/校正时候实现“加”功能子程序void INC(void) if(a=7) /年部分校正 AAAA6+=1; /如果a=7,则数组6自动加1 if(AAA

16、A6&0x0F)>9) AAAA6=AAAA6&0xF0; AAAA6=AAAA6+0x10; /数组6元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA6>0x99) AAAA6=AAAA6&0x00;/如果数组6元素值大于0x99,则整个数都清零 if(c=0) WRITE_DS1307_interrupt(0x06,AAAA6);/将经过修改的数组元素写入 if(c=1) LCD_WRITE_interrupt(LINE1+4,COM); DISP_HEX_interrupt(AAAA6); 此功能从DS1307中读出时间数据,然后对数据

17、进行加减运算,再把修改后的时间写入到时钟芯片中,即可实现对时间的加减运算。由于程序篇幅较长,在此只列出部分加的C程序,其余加C程序及减C程序详见附录。5.6 显示时间读和显示温度显示字母星期READ_DS1307(0x00,0x07); /读时钟芯片 (设置闹钟时间是没有这一行指令)DISP_TIME(*AAAA); /实时显示时间 (具体C程序见附录)R1=READ_T(); /读温度传感器的值DISP_T(R1); /显示温度值 DISP_XINGQI(AAAA3); /显示字母星期 /显示字母星期void DISP_XINGQI(char b)if(b=1) /如果b=1,则显示Mon

18、LCD_WRITE(LINE1+13,COM);/第二行第13位 LCD_WRITE('M',DAT); LCD_WRITE('o',DAT); LCD_WRITE('n',DAT);/13、14、15分别显示M、o、nelse if(b=2) /如果b=2,则显示Tue LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('T',DAT); LCD_WRITE('u',DAT); LCD_WRITE('e',DAT);/同上 其完整程序详见附录,在此只给出其中的一部分。/读

19、TC74的温度值signed char READ_T(void) signed char R2; SEN=1;/开始条件while (SEN=1);/检测开始条件是否完成?IIC_SEND(TC74_ADD<<1);/送TC74地址(写)IIC_SEND(RTR);/写RTR命令(写)RSEN=1;/重新开始条件while (RSEN=1);/等待重新开始条件结束IIC_SEND(TC74_ADD<<1)+1); /发送TC74地址(读)RCEN=1;/接收使能while (RCEN=1);/等待接收完成R2=SSPBUF;/接收数据存入R1PEN=1;/停止位whil

20、e(PEN=0);return(R2);/显示温度值 void DISP_T(char R1)/温度为R1 BCD(R1); LCD_WRITE(0xc0+11,COM);/DDRAM地址,第2行的第12个字符LCD_WRITE('T',DAT);LCD_WRITE(SW+0x30,DAT);/显示十位LCD_WRITE(GW+0x30,DAT);/显示个位LCD_WRITE(0xDF,DAT);/°LCD_WRITE('C',DAT); 读温度值并显示,具体解释见上,此不再重复。关于延时程序蜂鸣器响和不响,由于功能设置比较简单,在此不列出,可详见附录

21、。6.个人心得体会6.1 关于PIC课设之前我对PIC课设感到担心害怕,因为我以前没有做过课设,不知道该怎么去做。再者,我的单片机基础是零,以前没有接触到过单片机,我心里就更没底了。不过事情还好,没有我想像的那么难!有课本可以参考,有同学可以请教。我觉得我之前的恐慌是出于对课设的过度担心,对自己的低估。然而课设中遇到的难题也是不少的,当中我免不了焦燥和泄气。通过课设,我觉得解决遇到难题的方法是找出问题所在,根据问题判断出是软件问题还是硬件问题,然后再对软件或硬件进行一一更改。即提出问题,分析问题和解决问题。做完课设,我觉得单片机也不是那么难学了。6.2 课设过程遇到的问题及解决措施我就按我做课

22、设过程的顺序来说明一下我遇到的问题和解决方案。1.我第一个遇到的问题是,液晶显示器能显示第一行,却显示不了第二行。我之前有问过同学,他们两行都有显示出来。我反复把书上的程序对了好几遍,都没有错的。后来,我把电脑直接搬到单片机比较强的同学宿舍,他反复帮我查找,最后终于找到问题所在了。我用的液晶是显示两行的,书上的例题液晶是显示四行的。我在输入书上程序时把控制显示行数的位由1改为0,书上1代表显示四行,0代表显示两行。我错误地认为把1改为0就行了,正是这个想法,让我在这问题上花了不少时间。我用的是LM1602L液晶,显示行数控制位N为1表示显示两行,为0表示显示1行,即第一行。2.我遇到的第二个问

23、题是TC74温度传感器不应答。之前问过同学,他说是传感器的地址输入错了才不应答的,我反复地把程序和地址对了好几遍,还是都没有错。我搞了好几个小时还是没有搞出来,后来我硬是请班上的高手帮我查看。他确定软件问题没有,就果断把我Proteus图上的TC74温度传感器重新换一个,然后再编译,结果能显示出来,这很神奇吧!我问他为什么会这样,他跟我说要去各种尝试。我想说的是IIC中应答不了有可能是软件问题,也有可能是硬件问题的。3.显示时钟芯片时间。液晶显示器上的时间是要求走动的,即一秒一秒地增加。我在循环里把时钟芯片的时间不断读出来,再把时间显示在液晶上,这样时间就可以一直走了。但是我那液晶上的时间一直

24、在闪烁,经我同学指导,才发现原来我把清屏的命令放在循环里了。等我把清屏命令移到循环外面,再试一下,果然不会闪。4.按下来是关于OPTION这个寄存器的问题。我之前在MPLAB上编译写好的端口设置,寄存器设置。编译时发现OPTION这个寄存器编译不能识别,我就纳闷了。我问过同学,他说他的编译器能识别OPTION这个寄存器。我再次看我的编译情况,发现我的编译器的版本是V9.83,我脑中闪过一个念头,会不会是编译版本问题。我把V9.83版本的编译器卸载掉,重新安装了一个V9.80版本的编译器,再次编译,OPTION寄存器可以识别了。但是接下来问题又出现了。按照我OPTION寄存器的设置情况,即B口有

25、若上拉,但是仿真时就是低电平,都出现不来高电平。然后我到实验室问老师这个是什么缘故造成的,老师给了我提示。由于仿真软件还不是非常完善,端口的若上拉使能和端口的方向寄存器的设置、引脚的模拟口和I/O口选择和OPTION寄存器设置即端口若上拉设置的先后顺序有关。按照老师的提醒,我重新排了一下顺序,B口出现了高电平,也就是若上拉使能了。即先设置端口方向输入输出寄存器,再设置引脚的模拟口和I/O口,再设置B口若上拉。5.接下来是闹钟问题。即我的本意是要闹钟设定的时间到时,蜂鸣器才响的。我的程序是把闹钟设定的时间放在一个数组CCCC【】中。在闹钟键按第二下时,数组AAAA【】将时间值送给数组CCCC【】

26、。程序中当AAAA【2】=CCCC【2】&&AAAA【1】=CCCC【1】时蜂鸣器响。问题是闹钟键按第二下的同时蜂鸣器也响了,而不是等待定时时间到才响。我觉得这可能是程序的竞争问题,我寻思着在按第二下时,当数组AAAA赋值给数组CCCC后,再赋新值给数组AAAA。我再次仿真一下,这次闹钟键第二次按下时,蜂鸣器不直接响了,而是在定时时间到时才响的。6.显示时如果遇到时间静止不动,有可能是软件原因也胡可能是硬件原因。软件原因是一直把同一数值写到液晶LM1602L中,即不断显示同一时间;硬件原因是时钟芯片不应答,软件程序不能进行下去,即程序停滞不前。当然课设过程中也有我的马虎问题让我

27、费了不少时间,这里就不一一列出,上面是让我印象比较深刻的几个。6.3 我的建议我觉得老师你上课的时候,上课的前二十分钟给我们讲这次课的内容,如端口的区分和使用,中断的掌握与功能,定时器的功能与使用方法,然后接下来的二十五分钟结合书上的程序给我们讲它们的具体应用,可以在上课演示给我们看。还可以给我们讲解软件的使用。因为MPLAB软件和Proteus软件对于我们当中相当的一部分人是不熟悉的,甚至是刚接触的。老师要教我们如何安装软件,也可给我们视频让我们回去自己看看,这样就不会占用上课时间。不仅要教我们软件的基本使用方法,也要教我们如何用软件查编程序中出现的错误。班上的高手是有限的,高手的耐心也是有

28、限的,问题问多了自己也会觉得不好意思再问的。如在MPLAB中编译C程序查错误,编写程序,运行出错了,可能是哪些原因出现问题,是软件还是硬件出错呢?然后尝试修改程序,看看到底哪里出现了问题。这样的话我们在编译程序时出错时也可以按着老师的步骤一步一步地查程序。这对我们做课设是相当有利的。参考书目: 江和,PIC16系列单片机C程序设计与PROTEUS仿真.,北京航空航天大学出版社,2010年6月。附录1:数字钟的全部C程序#include <pic.h>_CONFIG(0x20F1);/调试用_CONFIG(0x3FFF);#defineLCD_ERD6/LCD E 读写使能控制#de

29、fineLCD_RWRD5/LCD 读(1)/写(0)控制线#define LINE10b10000000#define LINE20b11000000#defineLCD_RSRD4/LCD 寄存器选择数据(1)指令(0) /RD4-RD7分别接DB4-DB7,RD7为忙标志#define COM0/在LCD_WRITE()中的第2参数为0表示写命令#define DAT1/在LCD_WRITE()中的第2参数为1表示写数据#define TC74_ADD 0b1001101 /TC74的7位地址#define RTR0b00000000 /TC74的读温度命令#define ADDR 0b

30、11010000 /时钟芯片的地址#define YEAR_P LINE1+2 /年的显示位置#define HOUR_P LINE2+2 /时的显示位置#define KEY_DEC RB2#define KEY_INC RB1#define FMQ RC1/产生起始位,检测完成起始位?#define START_BIT SEN=1;while(SEN=1)/停止位,检查至停止位结束#define STOP_BIT PEN=1; while(PEN=1)/发送重复开始,确定重复开始已完成?#define RE_START_BIT RSEN=1;while(RSEN=1)/接收使能模式,确定接

31、收使能?#define RECEIVE_ENABLE_BITRCEN=1;while(RCEN=1)/自动应答,检查是否完成应答?#define ACK_BITACKDT=0;ACKEN=1;while(ACKEN=1)/不应答,检查是否完成无应答?#define NOT_ACK_BITACKDT=1;ACKEN=1;while(ACKEN=1)bank1 char DD16;/一行LCD显示数据暂存bank1 char AAAA7; /存放时钟芯片读出来的数据bank1 char CCCC7; /存放闹钟设定的时间void CSH(void);/初始化void LCD_CSH(void);/

32、LCD初始化void LCD_BUSY(void);/检测LCD是否忙char LCD_READ(void);/读LCD,忙检测用void LCD_WRITE(char,char);/LCD写1字节,命令或数据void LCD_WRITE_4(char,char);/LCD写半字节void DISP_C(char);/在指定行中显示字符,字符在数组DD中void DISP_MENU(const char *);/由常数数组显示整屏字符signed char READ_T(void); /读温度传感器的温度值void IIC_CSH(void); /IIC的初始化void IIC_SEND(ch

33、ar); /IIC的发送与接收void DISP_T(char); /显示温度值void BCD(char); /BCD码转换void DELAY_US(char); /延迟程序,10uS级void DELAY(unsigned int); /延迟程序,mS级void DELAY_I(unsigned int); /中断用的延迟程序,mS级void DISP_TIME(char *); /显示时钟的时间void DISP_HEX(char); /将一个字节分两个字节显示void READ_DS1307(char,char); /读时钟芯片void WRITE_DS1307(char,char)

34、; /向时钟芯片写入值void interrupt ISR(void); /按键中断程序void DISP_XINGQI(char); /星期转换,显示字母星期void INC(void); /按键加1void DEC(void); /按键减1void IIC_SEND_interrupt(char); /中断用IIC发送和接收void WRITE_DS1307_interrupt(char,char); /中断用写时钟芯片/void READ_DS1307_interrupt(char,char);void LCD_WRITE_interrupt(char,char); /中断用写LCDvo

35、id DISP_HEX_interrupt(char); /中断用将一个字节显示成两个字节 /整屏界面,每行16个字符,最后加一个结束符const char MENU0217=" 010900628 "," linyixing "/定义常数const char LINE2=LINE1,LINE2; /定义数组和变量char SW,GW,a=0,c=0,d,i; /主程序main(void) signed char R1; /DELAY(100);CSH(); /端口,LCD和IIC初始化 DISP_MENU(*MENU0);/显示整屏 DELAY(200

36、0); /延迟2秒,看清显示是什么 LCD_WRITE(0b00000001,COM); /清屏 WRITE_DS1307(0x07,0x10);/写控制字到LCD WRITE_DS1307(0x00,0x00);/0秒WRITE_DS1307(0x01,0x00);/00分 WRITE_DS1307(0x02,0x11); /11hWRITE_DS1307(0x03,0x03);/星期3WRITE_DS1307(0x04,0x08);/8日WRITE_DS1307(0x05,0x05);/5月WRITE_DS1307(0x06,0x12);/12年 while(1) if(c=0)|(c=2

37、) /当C=0或C=2时执行 READ_DS1307(0x00,0x07); /读时钟芯片 DISP_TIME(*AAAA); /实时显示时间 R1=READ_T(); /读温度传感器的的值 DISP_T(R1); /显示温度值 DISP_XINGQI(AAAA3); /显示字母星期 if(c=1) /C=1时执行 DISP_TIME(*AAAA); /显示闹钟修改的时间 R1=READ_T(); /同上 DISP_T(R1); /同上 DISP_XINGQI(AAAA3); /同上 if(CCCC2=AAAA2)&&(CCCC1=AAAA1)&&(c=2) F

38、MQ=1; /当设定的时间到时,蜂鸣器响 ; /显示字母星期void DISP_XINGQI(char b)if(b=1) /如果b=1,则显示Mon LCD_WRITE(LINE1+13,COM);/第二行第13位 LCD_WRITE('M',DAT); LCD_WRITE('o',DAT); LCD_WRITE('n',DAT);/13、14、15分别显示M、o、nelse if(b=2) /如果b=2,则显示Tue LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('T',DAT); LCD_WRI

39、TE('u',DAT); LCD_WRITE('e',DAT);/同上else if(b=3) /如果b=3,则显示Wed LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('W',DAT); LCD_WRITE('e',DAT); LCD_WRITE('d',DAT);/同上 else if(b=4) /如果b=4,则显示Thu LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('T',DAT); LCD_WRITE('h',DA

40、T); LCD_WRITE('u',DAT);/同上 else if(b=5) /如果b=5,则显示Fri LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('F',DAT); LCD_WRITE('r',DAT); LCD_WRITE('i',DAT);/同上 else if(b=6) /如果b=6,则显示Sat LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('S',DAT); LCD_WRITE('a',DAT); LCD_WRITE(&#

41、39;t',DAT);/同上 else if(b=7) /如果b=7,则显示Sun LCD_WRITE(LINE1+13,COM);/同上 LCD_WRITE('S',DAT); LCD_WRITE('u',DAT); LCD_WRITE('n',DAT);/同上 /中断子程序void interrupt ISR(void) DELAY_I(30); /按键去抖 RBIF=0; /标志位清零 if(RB3=0) /闹钟键按下 a=0;c+=1;d+=1; if(RB0=0&&c=0) /无闹钟键按下的定位 a+; if(a

42、=8) a=1; if(RB1=0&&c=0) /加1 INC(); if(RB2=0&&c=0)/减1 DEC(); if(c=1) /闹钟键按下 if(RB0=0) /闹钟键按下的定位 a+; if(a=8) a=1; if(RB1=0) /同上 INC(); if(RB2=0)/同上 DEC(); for(i=0;i<7;i+) /将时间存在数组中 CCCCi=AAAAi; if(c=2) /防止竞争现象 /READ_DS1307(0x00,0x07); for(i=0;i<7;i+) AAAAi=4; if(c=3) /闹钟按第三下时,蜂鸣器

43、响 FMQ=0;c=0;a=0; RBIF=0;/校正时候实现“加”功能子程序void INC(void) if(a=7) /年部分校正 AAAA6+=1; /如果a=7,则数组6自动加1 if(AAAA6&0x0F)>9) AAAA6=AAAA6&0xF0; AAAA6=AAAA6+0x10; /数组6元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA6>0x99) AAAA6=AAAA6&0x00;/如果数组6元素值大于0x99,则整个数都清零 if(c=0) WRITE_DS1307_interrupt(0x06,AAAA6);/将经过修

44、改的数组元素写入 if(c=1) LCD_WRITE_interrupt(LINE1+4,COM); DISP_HEX_interrupt(AAAA6); /月部分校正if(a=6) AAAA5+=1; if(AAAA5&0x0F)>9) AAAA5=AAAA5&0xF0; AAAA5=AAAA5+0x10; /数组5元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA5>0x12) AAAA5=AAAA5&0x00; AAAA5=AAAA5+0x01;/如果数组5元素值大于0x12,则整个数都清零再加1 if(c=0) WRITE_DS1307

45、_interrupt(0x05,AAAA5);/将经过修改的数组元素写入 else if(c=1) LCD_WRITE_interrupt(LINE1+7,COM); DISP_HEX_interrupt(AAAA5); /日部分校正if(a=5) AAAA4+=1; if(AAAA4&0x0F)>9) AAAA4=AAAA4&0xF0; AAAA4=AAAA4+0x10;/数组4元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA4>0x31) AAAA4=AAAA4&0x00; AAAA4=AAAA4+0x01;/如果数组4元素值大于0x31

46、,则整个数都清零再加1 if(c=0) WRITE_DS1307_interrupt(0x04,AAAA4);/将经过修改的数组元素写入 else if(c=1) LCD_WRITE_interrupt(LINE1+10,COM); DISP_HEX_interrupt(AAAA4); /星期部分校正if(a=4) AAAA3+=1; if(AAAA3>7) AAAA3=1; /如果数组3的元素大于7时,则复位到1 if(c=0) WRITE_DS1307_interrupt(0x03,AAAA3);/将经过修改的数组元素写入 else if(c=1) LCD_WRITE_interru

47、pt(LINE1+13,COM); DISP_HEX_interrupt(AAAA3); /时部分校正if(a=3) AAAA2+=1; if(AAAA2&0x0F)>9) AAAA2=AAAA2&0xF0; AAAA2=AAAA2+0x10;/数组2元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA2>0x23) AAAA2=AAAA2&0x00;/如果数组2元素值大于0x24,则整个数都清零 if(c=0) WRITE_DS1307_interrupt(0x02,AAAA2);/将经过修改的数组元素写入 else if(c=1) LCD_W

48、RITE_interrupt(LINE2+2,COM); DISP_HEX_interrupt(AAAA2); /分部分校正if(a=2) AAAA1+=1; if(AAAA1&0x0F)>9) AAAA1=AAAA1&0xF0; AAAA1=AAAA1+0x10;/数组1元素的低四位大于9时,则低四位清零而高四位进1位 if(AAAA1>0x59) AAAA1=AAAA1&0x00; /如果数组1元素值大于0x59,则整个数都清零 if(c=0) WRITE_DS1307_interrupt(0x01,AAAA1);/将经过修改的数组元素写入 else if(c=1) LCD_WRITE_interrupt(LINE2+5,COM); DISP_HEX_

温馨提示

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

评论

0/150

提交评论