您的当前位置:首页51单片机课程设计报告

51单片机课程设计报告

2023-07-16 来源:乌哈旅游
- 0 - 重庆科技学院《单片机系统综合训练》课程设计报告

重庆科技学院

学生实习(实训)总结报告

学 院:_电气与信息工程学院_ 专业班级:_XXXXXX_ 学生姓名:____XXX _ 学 号:_2011XXXXXX_ 实习(实训)地点:______逸夫科技楼(I512)_ _ 报告题目:_ 单片机万年历系统设报告__ _ 报告日期: 2013年 9月 13日 指

:

____________

___________________________

__________________________________________________________________________________________________________________________________________________________________

______________________________________ _____

成绩(五级记分制):___________________

指导教师(签字):____________________- 0 -

0 重庆科技学院《单片机系统综合训练》课程设计报告 目录

一、实训目的意义及任务要求 ..................................................................................... 0 1.1目的意义 .............................................................................................................. 0

1.2任务要求 .............................................................................................................. 0 二、实训方案 ................................................................................................................. 0 2.1 系统分析 .............................................................................................................. 0 2.2 器件选择 .............................................................................................................. 1 三、系统硬件设计 ......................................................................................................... 1 3.1 单片机最小系统 .................................................................................................. 1 3.2 数码管、独立按键及DS1302时钟芯片电路的设计 .................................... 2 3.3 其他附属电路设计 .............................................................................................. 4 四、软件设计 ................................................................................................................. 4 4.1主程序设计 .......................................................................................................... 4 4.2 DS1302子程序设计 ......................................................................................... 5 4.3时间调整子程序 .................................................................................................. 5 五、调试及性能分析 ..................................................................................................... 8 5.1软件测试 .............................................................................................................. 8 5.2测试结果分析与结论 .......................................................................................... 8 5.3 测试结论 .............................................................................................................. 9 六、心得体会 ............................................................................................................... 10 参考文献 ....................................................................................................................... 10 附录一 硬件电路接线图 ......................................................................................... 11 附录二 软件程序 ................................................................................................... 12

0

0 重庆科技学院《单片机系统综合训练》课程设计报告 多功能电脑时钟设计报告

一、实训目的意义及任务要求 1.1目的意义

单片机的使用领域已十分广泛,如智能仪器仪表、实时工控、通讯设备、导

航系统、家用电器等。“学好单片机,工作就不成问题了。”老师说,可见学好单片意义之重大。单片机作为一门基础学科,既是对前期学习C语言的综合运用,也是理论与实践相结合的一大体现。电脑时钟有效地检验了对DS1302时钟芯片,STC89C52单片机中断,独立键盘,数码管,蜂鸣器,LED灯的控制,同时提高了学生的工程系统设计能力。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。 所以,电子万年历无论作为比赛题目还是练习题目都是很有价值。通过此次单片机系统综合训练,不仅要让学生认识了解它,而且增强学生学科积极性。

1.2任务要求

要求设计的电脑时钟完成以下功能: 1.基本功能

①实时显示当前时间(4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭)。

②能用一按键依次切换显示年及月日。 ③能修改当前时钟。

④具有秒表功能,显示秒和百分秒。 2. 扩展功能

①单片机与PC机的通讯(可选)

②可设定初值的倒计时功能(可选)③闹钟及报时功能(可选)。④显示星期(可选)。

二、实训方案

2.1 系统分析

根据系统功能要求,可将系统组成结构分成四大部分:DS1302时钟芯片读数据写数据模块,数码管显示模块,按键设置调节时间模块,秒表功能模块,。硬件

0

1 重庆科技学院《单片机系统综合训练》课程设计报告 电路接线图如后图,本系统采用DS1302时钟芯片,四位数码管显示年月,日星期,时分,以及秒和百分秒。其中年月日,时分秒和星期采用DS1302的数据显示,秒表采用单片机定时中断实现。本系统共用到四个按键,且均为独立对地按键,分别用于显示切换,修改切换,修改加一,修改减一,秒表启动暂停和数据清零。

2.2 器件选择

选用STC89C52芯片,频率为11.0592MHz;由于系统要求显示年月日小时和分钟,采用四位LED数码管显示即可;按键是用来设置北京时间或闹钟时间或启动秒表等功能的,设置三个按键:显示切换模式键(key3)、修改数据键(key0)、加一键(key1)、减一键(key2)。DS1302时钟芯片。

常见的LED显示具有清晰明亮的特点。是显示接口也是绝大多数单片机应用

系统必备的部件之一。

发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。 1. 显示器的结构

常用的7段显示器的结构如图所示,发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。1位显示器由8个发光二极管组成,其中7个发光二极管a~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的七段显示器能显示的字符较少,字符的形状有些失真,但失控简单,使用方便。

三、系统硬件设计

3.1 单片机最小系统

单片机功能系统图见附录 1,。单片机最小系统由STC89C51单片机、复位电路、晶振电路组成。如图3.1所示

1

2 重庆科技学院《单片机系统综合训练》课程设计报告

图3.1 单片机最小系统图

3.2 数码管、独立按键及DS1302时钟芯片电路的设计

系统仿真电路图

2

3 重庆科技学院《单片机系统综合训练》课程设计报告

系统仿真电路图 DS1302与单片机连线图

3

4 重庆科技学院《单片机系统综合训练》课程设计报告

3.3 其他附属电路设计

RS232串口通信及电源电路等设计,如图3.3所示

图3.3 附属电路设计图

四、软件设计

4.1主程序设计

主程序采用定时器0对程序进行扫描执行。分别执行

DS1302芯片初始化子程序,写数据子程序,将最初的值写入芯片中,采用while循环循环执行键盘扫描子程序。 main() {

TMOD=0x01; //使用模式1,16位定时器 TH0=(65536-10000)/256; //给定初值 TL0=(65536-10000)%256;

EA=1; //总中断打开 ET0=1; //定时器中断打开

4

5 重庆科技学院《单片机系统综合训练》课程设计报告 TR0=1; //定时器开关打开

Ds1302_Init();

Ds1302_Write_Time(); while(1) {

keyscan(); if(Btread==0) { Btread=1;

Ds1302_Read_Time(); }

display(); }

4.2 DS1302子程序设计

此子程序分为初始化程序,读数据程序,写数据程序,一些数据程序为例; void Ds1302_Write_Byte(unsigned char addr, unsigned char d) {

CE=0;_nop_(); SCLK=0; _nop_(); CE=1; _nop_(); Write1302(addr); Write1302(d); CE=0; _nop_(); IO=1; SCLK=1;

}分别写入地址,再写入数据。

4.3时间调整子程序

时间调整子程序采用的是对key1按的次数不同来进行对年月日时分及星期的设置。

void zongshi(void) {

if(!key) {

if(btx==0) {

if(!key)

5

6 重庆科技学院《单片机系统综合训练》课程设计报告 {

btx=1;k++; } } }else{btx=0;}} k=1时,调整年份,key1为加,key2为减 void keyscan() k=2时,调整月份,key1为加,key2为减 { k=3时,调整日份,key1为加,key2为减 display(); k=4时,调整星期,key1为加,key2为减 if(!key) {

if(btx==0) {

if(!key) {

btx=1; k++; } }

6

7 重庆科技学院《单片机系统综合训练》课程设计报告

7

8 重庆科技学院《单片机系统综合训练》课程设计报告 五、调试及性能分析

5.1软件测试

电子成年历是多功能的数字型,可以看当前日期(阴、阳历),时间,还有温

度的仪器。电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:

1.烧入程序后,LED数码管显示闪动,而且亮度不均匀。

解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。

2.修改时间、日期时没有农历没有自动对应上。

解决:把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.

5.2测试结果分析与结论

(1).在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2).LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。

(3).DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM 数据;D5~D1 指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。

在DS1302 的时钟日历或RAM 进行数据传送时,DS1302 必须首先发送命令字节。若进行单字节传送,8 位命令字节传送结束之后,在下2 个SCLK 周期的上升沿输入数据字节,或在下8 个SCLK 周期的下降沿输出数据字节。

DS1302 与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM 寄存器,在此方式下可一次性读、写所有的RAM 的31 个字节。

要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F 以上)。虽然DS1302 在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V 充电电池。如果断电时间

8

9 重庆科技学院《单片机系统综合训练》课程设计报告 较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF 就

可以保证1 小时的正常走时。DS1302 在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。

5.3 测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固

9

10 重庆科技学院《单片机系统综合训练》课程设计报告 六、心得体会

两周的单片机课程设计结束了,在这两周的时间里,我从最初的兴致勃勃,经历了写程序的艰苦奋战,也体验了调程序找不出为题所在时的苦恼,当然最终还是得到了成功时的喜悦。

从大一下期开始接触单片机,简单运用单片机,我初步认识了单片机。再经过这两周的单片机的专门学习,我对单片机有了进一步的学习和认识,加深了我对单片机理论知识的理解,提升了我个人理论结合实际的实践能力。从简单的单片机设计开始,一步一步的增加难度。刚开始设计时,老师给我们的任务很简单,可以轻松完成任务完成。单片机万年历的设计,是在秒表的基础上慢慢的添加一个又一个的功能,然后一个一个的调试。

在调试的过程中我们遇到了很多的问题,其中最让我懊恼的,话费我时间最多的一个问题就是,无法将修改的数据写入DS1302时钟芯片中去。为了解决这个问题我查了质料,也请教了老师。最后还是功夫不负有心人,花了我两天时间终于找出了问题所在。是因为我在写程序是把写地址排序搞错。

通过本次单片机系统课程设计,我对单片机的基础知识及基本的应用技术有了深刻的了解,提升了个人理论到实践的运用能力。对我以后从事单片机工作打下了坚实的基础。在此我得感谢李老师和王老师对我的精心指导,没有他们的指导我就不会懂得更多有用的单片机设计的技巧,也不可能在课程成设计结束前完善好程序。谢谢您们!

参考文献

张义辉,李家庆,单片机系统综合训练指导书.重庆科技学院

张毅刚.单片机原理及应用.北京:高等教育出版社,20

10

11 重庆科技学院《单片机系统综合训练》课程设计报告 附录一 硬件电路接线图

11

12 重庆科技学院《单片机系统综合训练》课程设计报告 附录二 软件程序

#include

#include

#define uchar unsigned char #define uint unsigned int

#define Write_Protect 0x8e //写保护 #define OutPut P0 //显示输出 //sbit DU=P2^6; //数码管段选 //sbit WE=P2^7; //数码管位选

sbit CE=P3^3; //复位端口定义在P0.2引脚 sbit IO=P2^4; //数据输出端定义在P0.4引脚 sbit SCLK=P3^2; //时钟输出端口定义在P0.3引脚 sbit key=P3^4; //时间调节控制键 sbit key1=P3^5; //每按一次位加一 sbit key2=P3^6; //每按一次位减一 sbit key3=P3^7; //显示切换

uchar code Wei[]={0xfe,0xfd,0xfb,0xf7,0xfd};// 位选数据0xef,0xdf,0xbf,0x7f

uchar code Duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0--9共阴代码

code uchar Waddr[]={0x8c,0x88,0x86,0x84,0x82,0x80,0x8a}; //寄存器写地址 code uchar Raddr[]={0x8d,0x89,0x87,0x85,0x83,0x81,0x8b}; // 寄存器读地址 uchar timeset[]={0x01,0x02,0x03,0x04,0x05,0x00,0x01}; /*设置初始时间*/ uchar time_buf[7]; /*存读到的时间*/ uchar time_disp[7];

uchar dispdat[5]; /*存储显示值的*/

uchar Btdis=0,k=0,z; bit btx,btx1,btx2,btx3,bt1,bt2,bt3; bit Btread; uint flag1;

/*================================================== 函数功能:延时n 毫秒 入口参数:n

====================================================*/ void Write1302(uchar dat); void delaynms(uchar n) {

uchar i,j;

for(i=n;i>0;i--) for(j=125;j>0;j--); }

/*============================================= 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,存储命令字;dat,存储待写的数据

12

13 重庆科技学院《单片机系统综合训练》课程设计报告 ==============================================*/

void Ds1302_Write_Byte(unsigned char addr, unsigned char d) {

CE=0;_nop_(); SCLK=0; _nop_(); CE=1;_nop_(); Write1302(addr); Write1302(d); CE=0; _nop_(); IO=1; SCLK=1; }

//从DS1302读出一字节数据

uchar Ds1302_Read_Byte(unsigned char addr) {

unsigned char i; unsigned char temp; CE=1;

addr = addr | 0x01;

for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO=1; } else {IO=0; } SCLK=1; SCLK=0;

addr = addr >> 1; }

//输出数据:temp

for (i = 0; i < 8; i ++) { temp = temp >> 1; if (IO)

{ temp |= 0x80; } else

{ temp &= 0x7F; } SCLK=1; SCLK=0; }

CE=0; //停止DS1302总线 return temp; }

/*=================================================== 函数功能:向1302日历时钟芯片写入一个字节的数据 入口参数:dat

13

14 重庆科技学院《单片机系统综合训练》课程设计报告 ====================================================*/

void Write1302(uchar dat) {

uchar i; //SCLK=0; CE=1;

for(i=0;i<8;i++) {

IO=dat&0x01; SCLK=0; SCLK=1; dat=dat>>1; } }

/*===================================================== 函数功能:根据命令字,从1302读取一个字节的数据 入口参数:Cmd 返回参数:dat

======================================================*/ uchar Readset1302(uchar Cmd) {

uchar dat; CE=0; SCLK=0; CE=1;

Write1302(Cmd); SCLK=1; CE=0;

return dat; }

void bcdpro(void) {

unsigned char i,tmp;

for(i=0;i<7;i++) //BCD处理 {

tmp=timeset[i]/10; //timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01} time_buf[i]=timeset[i]%10; //time_buf[7] time_buf[i]=time_buf[i]+tmp*16; } }

/*================================================ 向DS1302写入时钟数据

===================================================*/ void Ds1302_Write_Time(void)

14

15 重庆科技学院《单片机系统综合训练》课程设计报告 {unsigned int i;

uchar flag;

flag=Readset1302(0x81);

if(flag&0x80) //判断时钟芯片是否停止,为1时时钟停止 { //掉电保存 bcdpro();

for(i=0;i<7;i++)

{ Ds1302_Write_Byte(Waddr[i],time_buf[i]); }

Ds1302_Write_Byte(0x8e,0x80); //打开写保护 } }

/*=============================================== 从DS1302读出时钟数据

=================================================*/ void Ds1302_Read_Time(void) {

unsigned char i,tmp; for(i=0;i<7;i++)

{time_buf[i]=Ds1302_Read_Byte(Raddr[i]); } for(i=0;i<7;i++) //BCD处理 {

tmp=time_buf[i]/16; time_buf[i]=time_buf[i]%16;

time_disp[i]=time_buf[i]+tmp*10; } }

/*====================================================== DS1302初始化

===================================================*/ void Ds1302_Init(void) {

CE=0; //RST脚置低

SCLK=0; //SCK脚置低

Ds1302_Write_Byte(0x80,0x00); }

/*================================================== ==函数名: 时分秒显示子程序

==函数功能:将从DS1302读到的数据在8位共阴数码管上显示 ==返回参数:

===================================================*/ void display() {

uchar i;

15

16 重庆科技学院《单片机系统综合训练》课程设计报告 if(Btdis==0)

{ if(bt2==0)

{ dispdat[0]=Duan[time_disp[3]/10]; //时 dispdat[1]=Duan[time_disp[3]%10];} else

{dispdat[0]=0x00; dispdat[1]=0x00; }

//dispdat[2]=0x40; //\"-\" if(bt3==0) {

dispdat[2]=Duan[time_disp[4]/10]; //分 dispdat[3]=Duan[time_disp[4]%10]; } else {

dispdat[2]=0x00; dispdat[3]=0x00; }

//dispdat[5]=0x40;

if(flag1<25)

dispdat[4]=0x80;

else

dispdat[4]=0x00; }

if(Btdis==3) {

dispdat[0]=Duan[time_disp[5]/10]; //秒 dispdat[1]=Duan[time_disp[5]%10]; dispdat[2]=0x40; dispdat[3]=0x40; }

if(Btdis==1) { if(bt1==0) {

dispdat[0]=Duan[time_disp[0]/10]; //年 dispdat[1]=Duan[time_disp[0]%10]; } else {

16

17 重庆科技学院《单片机系统综合训练》课程设计报告 dispdat[0]=0x00;

dispdat[1]=0x00; }

//dispdat[2]=0x40; //\"-\" if(bt2==0) {

dispdat[2]=Duan[time_disp[1]/10]; //月 dispdat[3]=Duan[time_disp[1]%10]; } else {

dispdat[2]=0x00; dispdat[3]=0x00; }

dispdat[4]=0x00; }

if(Btdis==2) {

//dispdat[0]=0x40; if(bt1==0) {

dispdat[3]=Duan[time_disp[6]%10]; //周 } else {

dispdat[3]=0x00; }

dispdat[2]=0x40; if(bt3==0) {

dispdat[0]=Duan[time_disp[2]/10]; //日 dispdat[1]=Duan[time_disp[2]%10]; } else {

dispdat[0]=0x00; dispdat[1]=0x00; }

if(dispdat[3]==7) {

dispdat[3]=0x7f;

17

18 重庆科技学院《单片机系统综合训练》课程设计报告 }

}

if(Btdis==4) { }

for(i=0;i<5;i++) {

OutPut=dispdat[i];

P1=Wei[i];

delaynms(1); OutPut=0x00; } }

/*================================================== ==函数名: 按键

==函数功能:显示模式,调时模式 ==返回参数:

===================================================*/ void zongshi(void) {

if(!key) {

if(btx==0) {

if(!key) {

btx=1; k++; } } } else {btx=0;} }

void keyscan() {

display();

18

19 重庆科技学院《单片机系统综合训练》课程设计报告 if(!key)

{

if(btx==0) {

if(!key) {

btx=1; k++; } }

/*================================================= k=1时,调整年份,key1为加,key2为减

==================================================*/ while(k==1) {

Btdis=1; display(); zongshi(); if(!key1) {

if(btx1==0) {

if(!key1) {

btx1=1;

if(time_disp[0]<99) {

time_disp[0]++; } else

{time_disp[0]=0;} } } } else

{btx1=0; } if(!key2) {

if(btx2==0) {

if(!key2) { btx2=1;

if(time_disp[0]>0)

19

20 重庆科技学院《单片机系统综合训练》课程设计报告 {time_disp[0]--;}

else

{time_disp[0]=99;} } } } else

{btx2=0;} }

/*================================================= k=2时,调整月份,key1为加,key2为减

==================================================*/ while(k==2) {

Btdis=1; display(); zongshi(); if(!key1) {if(btx1==0) {

if(!key1) {btx1=1;

if(time_disp[1]<12) {

time_disp[1]++; if(time_disp[1]==2)

{if(time_disp[0]%4==0) {

if(time_disp[2]>29) {time_disp[2]=29;}

}else if(time_disp[2]>28) {time_disp[2]=28;} } } else

{ time_disp[1]=1;} } }

}else

{ btx1=0; } if(!key2) {

if(btx2==0)

20

21 重庆科技学院《单片机系统综合训练》课程设计报告 {if(!key2)

{ btx2=1;

if(time_disp[1]>1) {

time_disp[1]--; if(time_disp[1]==2) {if(time_disp[0]%4==0) {

if(time_disp[2]>29) {time_disp[2]=29;}

}else if(time_disp[2]>28) { time_disp[2]=28; } } }else

{ time_disp[1]=12; } } } }else

{ btx2=0; } }

/*================================================= k=3时,调整天,key1为加,key2为减

==================================================*/ while(k==3) {

Btdis=2; display(); zongshi(); if(!key1) {

if(btx1==0) {

if(!key1) {

btx1=1;

if(time_disp[1]==2) {

if(time_disp[0]%4==0) {

if(time_disp[2]<29) { time_disp[2]++; } else

21

22 重庆科技学院《单片机系统综合训练》课程设计报告 { time_disp[2]=1; }

}

else if(time_disp[2]<28) {

time_disp[2]++; } else

time_disp[2]=1; }

else if(time_disp[1]<8) {

if(time_disp[1]%2==0) //小于8月的月份除以2的余数为0则为小月 {

if(time_disp[2]<30) { time_disp[2]++; } else

{ time_disp[2]=1; } }

else if(time_disp[1]%2==1) //小于8月的月份除以2的余数为1则为大月 {

if(time_disp[2]<31) { time_disp[2]++; } else

{ time_disp[2]=1; } } }

else if(time_disp[1]>7) {

if(time_disp[1]%2==0) {

if(time_disp[2]<31) {

time_disp[2]++; } else

{ time_disp[2]=1; } }

else if(time_disp[1]%2==1) {

if(time_disp[2]<30) { time_disp[2]++;} else

{ time_disp[2]=1; } }

22

23 重庆科技学院《单片机系统综合训练》课程设计报告 }

} } } else

{ btx1=0; } if(!key2)

{ if(btx2==0) {

if(!key2) {btx2=1;

if(time_disp[1]==2) {if(time_disp[0]%4==0) {if(time_disp[2]>1) { time_disp[2]--; } else

{ time_disp[2]=29; } }

else if(time_disp[2]>1) { time_disp[2]--; } else

{ time_disp[2]=28; } }

else if(time_disp[1]<8) {if(time_disp[1]%2==0) {if(time_disp[2]>1) { time_disp[2]--; } else

{ time_disp[2]=30; } }

else if(time_disp[1]%2==1) {

if(time_disp[2]>1) {time_disp[2]--;} else

{ time_disp[2]=31; } }

}else if(time_disp[1]>7) {if(time_disp[1]%2==0) {if(time_disp[2]>1) {time_disp[2]--; }else

{ time_disp[2]=31; } }else if(time_disp[1]%2==1)

23

24 重庆科技学院《单片机系统综合训练》课程设计报告 {if(time_disp[2]>1)

{time_disp[2]--; }else

{ time_disp[2]=30; } } } } }

}else

{ btx2=0; } }

/*================================================= k=4时,调整星期,key1为加,key2为减

==================================================*/ while(k==4) {

Btdis=2; display(); zongshi(); if(!key1) {

if(btx1==0) {

if(!key1) {

btx1=1;

if(time_disp[6]<=6) {time_disp[6]++; }else

{ time_disp[6]=1; } } }

}else

{ btx1=0;} if(!key2) {if(btx2==0) {if(!key2) { btx2=1;

if(time_disp[6]>1) { --time_disp[6]; } else

{ time_disp[6]=7; } }

24

25 重庆科技学院《单片机系统综合训练》课程设计报告 }

} else

{ btx2=0;} }

/*================================================= k=5时,调整小时,key1为加,key2为减

==================================================*/ while(k==5) {

Btdis=0; display(); zongshi(); if(!key1) {if(btx1==0) {if(!key1) {btx1=1;

if(time_disp[3]<23) {time_disp[3]++; } else

{ time_disp[3]=0; } } } } else

{ btx1=0; } if(!key2) {if(btx2==0) {if(!key2) {btx2=1;

if(time_disp[3]>0) { time_disp[3]--; } else

{ time_disp[3]=23; } } } } else

{ btx2=0; } }

/*================================================= k=6时,调整分钟,key1为加,key2为减

25

26 重庆科技学院《单片机系统综合训练》课程设计报告 ==================================================*/

while(k==6) {

Btdis=0; display(); zongshi(); if(!key1) {if(btx1==0) {if(!key1) {btx1=1;

if(time_disp[4]<59) {time_disp[4]++; } else

{ time_disp[4]=0; } } }

} else

{ btx1=0; } if(!key2)

{ if(btx2==0) { if(!key2) {btx2=1;

if(time_disp[4]>0) {time_disp[4]--; } else

{ time_disp[4]=59; } } } } else

{ btx2=0; } }

/*====================================================== k=7把调整后的数据转换成16进制写入1302

=======================================================*/ while(k==7) {

uchar i;

for(i=0;i<7;i++)

{ timeset[i]=time_disp[i]; } //将调整后的时候写入DS1302 bcdpro();

for(i=0;i<7;i++)

26

27 重庆科技学院《单片机系统综合训练》课程设计报告 { Ds1302_Write_Byte(Waddr[i],time_buf[i]); }

Ds1302_Write_Byte(0x8e,0x80); //打开写保护 k=0; } }else

{ btx=0; }

/*====================================================== key3为显示切换键,形成时分秒与年月日以及星期之前的切换 =======================================================*/ if(!key3)

{ if(btx3==0) { if(!key3) {btx3=1;

if(Btdis<3) {Btdis++; } else

{ Btdis=0; } } } } else

{ btx3=0; } }

/*====================================================== key3为显示切换键,形成时分秒与年月日以及星期之前的切换 =======================================================*/ void tiaoshidisplay() {

if(z==15) { z=0;

switch(k) {

case 1:bt1=~bt1;break; //年 case 2:bt2=~bt2;bt1=0;break; //月

case 3:bt3=~bt3;bt1=0;break; //日 case 4:bt1=~bt1;bt3=0;break; //周 case 5:bt2=~bt2;bt1=0;break; //时 case 6:bt3=~bt3;bt2=0;break; //分 default:bt3=0;break; } } }

/*==================================================

27

28 重庆科技学院《单片机系统综合训练》课程设计报告 ==函数名: 定时器1子程序

==函数功能:1S读一次时间 ==返回参数:

===================================================*/ void Timer0() interrupt 1 using 1 {

uchar t;

TH0=(65536-20000)/256; //给定初值 TL0=(65536-20000)%256; flag1++;

if(flag1==50) flag1=0; if(t<49) {t++; z++;

tiaoshidisplay(); }else { t=0; Btread=0; } }

/*函数名: 主函数 ==函数功能: ==返回参数:*/

main() {

TMOD=0x01; //使用模式1,16位定时器 TH0=(65536-20000)/256; //给定初值 TL0=(65536-20000)%256;

EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 Ds1302_Init();

Ds1302_Write_Time();while(1) {

keyscan(); if(Btread==0) { Btread=1;

Ds1302_Read_Time(); }

display(); } }

28

因篇幅问题不能全部显示,请点此查看更多更全内容