您的当前位置:首页正文

单片机课程设计报告电子日历设计

来源:我们爱旅游


目 录

第1章 绪 论................................................................................................................ 1

1.1 概述.................................................................................................................. 1 1.2 单片机的发展历程.......................................................................................... 1 第2章 系统结构及主要元器件.................................................................................. 2

2.1系统结构........................................................................................................... 2 2.2主要元器件....................................................................................................... 2 第3章 硬件设计.......................................................................................................... 3

3.1主控制模块....................................................................................................... 3 3.2复位电路........................................................................................................... 3 3.3晶振电路........................................................................................................... 4 3.4 DS1302时钟模块 ............................................................................................ 4 3.5按键调节电路................................................................................................... 5 3.6显示模块........................................................................................................... 6 第4章 软件设计.......................................................................................................... 7

4.2程序设计........................................................................................................... 7 第5章 系统仿真及调试............................................................................................ 20 结 论............................................................................................................................ 21 参考文献...................................................................................................................... 22

单片机的控制系统课程设计

第1章 绪 论

1.1 概述

随着电子技术的迅速发展,特别是随着大规模集成电路产生而出现的微型计算机,给人类生活带来了极大的方便。走入家庭,从洗衣机、微波炉到音响、汽车,到处都可以见到单片机应用的踪影。如果说微型计算机技术的出现使现代科学研究得到了质的飞跃,那么也可以毫不夸张的说:“单片机技术的出现则是给现代工业测控领域带来了一次新的工业革命”。目前,单片机以其可靠性高和智能性等特点被广泛应用到工业控制系统、数据采集系统、智能化仪器仪表、办公自动化等领域中,并已经进入家庭。因此,单片机技术的开发和应用水平已经逐步成为一个国家自动化发展水平的标志之一。

1.2 单片机的发展历程

单片机是微型计算机的一个重要分支,也是一种非常活跃和颇具生命力的机种,特别适用于工业控制领域。1971年微处理器研制成功不久,就出现了单片机,但最早的单片机是1位的,处理能力有限。单片机的发展共分四个阶段:第一阶段是初级阶段,功能非常简单;第二阶段是低性能阶段,以INTEL公司制造的MSC-48系列单片机为代表。第三阶段为高性能单片机阶段,这个阶段推出的单片机普遍带有穿行接口,多级中断系统,16位定时器/计数器,片内ROM、RAM容量加大,直到现在仍被广泛应用,是目前应用数量较多的单片机。第四阶段是8位单片机巩固发展以及16位单片机、32位单片机推出阶段,以满足不同的用户需要。纵观单片机几十年的发展历程,单片机的今后发展方向将向多功能、高性能、高速度、低功耗、低价格、外围电路内装化以及内存储器容量增加和FLASH存储器化方向发展。

1

单片机的控制系统课程设计

第2章 系统结构及主要元器件

2.1系统结构

此次设计主要是应用单片机来设计电子日历,系统由主控制器AT89s51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。如图2-1系统总体结构图:

图2-1系统总体结构图

2.2主要元器件

本系统的主要元器件有AT89S51单片机,DS1302时钟芯片,LED数码管或LM1602液晶显示屏。

2

单片机的控制系统课程设计

第3章 硬件设计

3.1主控制模块

AT89S51系列单片机中有PDIP,PLCC,TQFP多种封装形式。本设计采用的是PDIP封装40管脚的单片机。如图3-1所示:

图3-1 AT89S51引脚图

3.2复位电路

复位是单片机的初始化操作。单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。

复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。

3

单片机的控制系统课程设计

图3-2 复位电路图

3.3晶振电路

晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。如图3-3所示:

图3-3 晶振电路图

3.4 DS1302时钟模块

3.4.1 DS1302时钟模块

图3-4 DS1302时钟模块图

3.4.2 DS1302 的引脚排列

图3-5所示出DS1302 的引脚排列,其中Vcc1 为后备电源,VCC2 为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302 由Vcc1 或Vcc2

4

单片机的控制系统课程设计

两者中的较大者供电。当Vcc2 大于Vcc1+0.2V 时,Vcc2 给DS1302供电。当Vcc2 小于Vcc1 时,DS1302 由Vcc1 供电。X1和X2 是振荡源,外接32.768kHz 晶振。RST 是复位/片选线,通过把RST 输入驱动置高电平来启动所有的数据传送RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供终止单字节或多字节数据的传送手段。当RST 为高电平时,所有的数据传送被初始化,允许对DS1302 进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。上电运行时,在Vcc≥2.5V 之前,RST 必须保持低电平。只有在SCLK 为低电平时,才能将RST 置为高电平。I/O 为串行数据输入输出端(双向),后面有详细说明。SCLK 始终是输入端。数据输入输出

(I/O) 在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入从低位即从0 开始。同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位到高位7。

图3-5 DS1302 的引脚图

3.5按键调节电路

本设计总的用了三个按扭开关作为键盘,其中两个是调整时间增加、减少的键,第三个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间。如图3-6所示:

图3-6 按键调节电路图

5

单片机的控制系统课程设计

3.6显示模块

LCM1602采用标准的16脚接口,其中: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RSRW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可读忙信号,当RS为高电平RW为低电平时可以写入数据.第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚。如图3-7所示:

图3-7显示模块图

6

单片机的控制系统课程设计

第4章 软件设计

4.1系统流程图

图4-1系统流程图

4.2程序设计

#include

#define uint unsigned int #define uchar unsigned char

uchar a,sec,hour,min,day,moon,year,week,flag,key1n,ZJL; //ZJL为中间量

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)

#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口) sbit rs=P3^5; sbit en=P3^7;

sbit rw=P3^6; //如果硬件上rw接地,就不用写这句和后面的rw=0了 //DS1302时钟芯片与C51之间的引脚连接定义 sbit IO=P2^2; sbit SCLK=P2^1; sbit RST=P2^0; sbit ACC0=ACC^0; sbit ACC7=ACC^7;

7

单片机的控制系统课程设计

/************************************************************ ACC累加器=A ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位寻址。 **************************/ //校时按键与C51的引脚连接定义 sbit key1=P2^5; //设置键 sbit key2=P2^6; //加键 sbit key3=P2^7; //减键

/**************************************************************/ uchar code tab1[]={\"20 - - \年显示的固定字符 uchar code tab2[]={\" : : \时间显示的固定字符 //延时函数,后面经常调用

void delay(uint xms)//延时函数,有参函数 { uint x,y;

for(x=xms;x>0;x--) for(y=110;y>0;y--); }

/********液晶写入指令函数与写入数据函数,以后可调用**************/ /*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/

write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P1=com;//送入数据 delay(1);

en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1);

en=0;//en由高变低,产生下降沿,液晶执行命令 }

write_1602dat(uchar dat)//***液晶写入数据函数**** { rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P1=dat;//送入数据 delay(1);

en=1; //en置高电平,为制造下降沿做准备 delay(1);

en=0; //en由高变低,产生下降沿,液晶执行命令 }

lcd_init()//***液晶初始化函数****

{ write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据

write_1602com(0x0c);//开显示不显示光标

write_1602com(0x06);//整屏不移动,光标自动右移

8

单片机的控制系统课程设计

write_1602com(0x01);//清显示

write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++)

{ write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); }

write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a++)

{ write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 //delay(3); } }

/*********************over***********************/

/***************DS1302有关子函数********************/

void write_byte(uchar dat)//写一个字节 { ACC=dat; RST=1;

for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1;

ACC=ACC>>1; } }

uchar read_byte()//读一个字节 { RST=1;

for(a=8;a>0;a--) { ACC7=IO; SCLK=1; SCLK=0;

ACC=ACC>>1; }

return (ACC); }

//----------------------------------------

void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据 { RST=0; SCLK=0; RST=1;

write_byte(add); write_byte(dat);

9

单片机的控制系统课程设计

SCLK=1; RST=0; }

uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址 { uchar ZJL; RST=0; SCLK=0; RST=1;

write_byte(add); ZJL=read_byte(); SCLK=1; RST=0; return(ZJL); }

uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制 { uchar Decimal; Decimal=bcd>>4;

return(Decimal=Decimal*10+(bcd&=0x0F)); }

//--------------------------------------

void ds1302_init() //1302芯片初始化子函数(2012-06-17,00:00:00,week7) { RST=0; SCLK=0;

write_1302(0x8e,0x00); //允许写,禁止写保护

//write_1302(0x80,0x12); //向DS1302内写秒寄存器80H写入初始秒数据00 //write_1302(0x82,0x12);//向DS1302内写分寄存器82H写入初始分数据00 //write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据00 //write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据7 //write_1302(0x86,0x08);//向DS1302内写日期寄存器86H写入初始日期数据17 //write_1302(0x88,0x08);//向DS1302内写月份寄存器88H写入初始月份数据06 //write_1302(0x8c,0x12);//向DS1302内写年份寄存器8cH写入初始年份数据12 write_1302(0x8e,0x80); //打开写保护 }

//------------------------------------ //时分秒显示子函数

void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数

{ uchar gw,sw;

gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字

write_1602com(er+add);//er是头文件规定的值 0x80+0x40

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }

10

单片机的控制系统课程设计

//------------------------------------- //年月日显示子函数

void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数 { uchar gw,sw;

gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字

write_1602com(yh+add);//设定显示位置为第一个位置+add

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }

//-------------------------------------------

void write_week(uchar week)//写星期函数

{write_1602com(yh+0x0c);//星期字符的显示位置 switch(week)

{ case 1:write_1602dat('M');// 星期数为1时,显示 write_1602dat('O'); write_1602dat('N'); break;

case 2:write_1602dat('T');//星期数据为2时显示 write_1602dat('U'); write_1602dat('E'); break;

case 3:write_1602dat('W');//星期数据为3时显示 write_1602dat('E'); write_1602dat('D'); break;

case 4:write_1602dat('T');//星期数据为4时显示 write_1602dat('H'); write_1602dat('U'); break;

case 5:write_1602dat('F');//星期数据为5时显示 write_1602dat('R'); write_1602dat('I'); break;

case 6:write_1602dat('S');//星期数据为6时显示 write_1602dat('T'); write_1602dat('A'); break;

case 7:write_1602dat('S');//星期数据为7时显示 write_1602dat('U'); write_1602dat('N'); break; }

11

单片机的控制系统课程设计

}

//****************键盘扫描有关函数********************** void keyscan()

{ if(key1==0)//---------------key1为功能键(设置键)-------------------- { delay(9);//延时,用于消抖动

if(key1==0)//延时后再次确认按键按下 delay(20); while(!key1); key1n++; if(key1n==9)

key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环 switch(key1n)

{ case 1: TR0=0;//关闭定时器 //TR1=0;

write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标 write_1602com(0x0f);//设置光标为闪烁

ZJL=(sec)/10*16+(sec)%10;//秒数据写入DS1302 write_1302(0x8e,0x00);

write_1302(0x80,0x80|ZJL);//sec write_1302(0x8e,0x80); break;

case 2: write_1602com(er+6);//按2次min位置显示光标 write_1602com(0x0f); break;

case 3: write_1602com(er+3);//按动3次,hour 位置显示光标 write_1602com(0x0f); break;

case 4: write_1602com(yh+0x0e);//按动4次,week //write_1602com(0x0f); break;

case 5: write_1602com(yh+0x0a);//按动5次,day write_1602com(0x0f); break;

case 6: write_1602com(yh+0x07);//按动6次,moon write_1602com(0x0f); break;

case 7: write_1602com(yh+0x04);//按动7次,year write_1602com(0x0f); break;

case 8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器

ZJL=(sec)/10*16+(sec)%10; write_1302(0x8e,0x00);

write_1302(0x80,0x00|ZJL);//sec数据写入DS1302

12

单片机的控制系统课程设计

write_1302(0x8e,0x80); break;} }

//-----------------------------加键key2----------------------------

if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零) { if(key2==0) //上调键 { delay(10); if(key2==0) { delay(20); while(!key2); switch(key1n)

{ case 1:sec++;//设置键按动1次,调秒 if(sec==60)

sec=0;//秒超过59,再加1,就归零

write_sfm(0x08,sec);//令LCD在正确位置显示\"加\"设定好的秒数 ZJL=(sec)/10*16+(sec)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护

write_1302(0x80,ZJL); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护

write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回

//write_1602com(0x0b); break;

case 2:min++; if(min==60) min=0;

write_sfm(0x05,min);//令LCD在正确位置显示\"加\"设定好的分数据 ZJL=(min)/10*16+(min)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x82,ZJL);//向DS1302内写分寄存器82H写入调整后的分数据BCD码

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

write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break;

case 3:hour++; if(hour==24) hour=0;

write_sfm(2,hour);//令LCD在正确的位置显示\"加\"设定好的小时数据 ZJL=(hour)/10*16+(hour)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x84,ZJL);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码

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

13

单片机的控制系统课程设计

write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 4:week++; if(week==8) week=1;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容

ZJL=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8a,ZJL);//向DS1302内写周寄存器8aH写入调整后的周数据BCD write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 5:day++;if(moon==1) {if(day==32) day=1;} if(moon==2)

{if((year/4==0&&year/100!=0)||(year/400==0))//判断是否闰年 {if(day==29) day=1;}

else if(day==28) day=1;} if(moon==3) {if(day==32) day=1;} if(moon==4) {if(day==31) day=1;

if(moon==5) {if(day==32) day=1;} if(moon==6) {if(day==31) day=1;} if(moon==7) {if(day==32) day=1;} if(moon==8) {if(day==32) day=1;} if(moon==9) {if(day==31)

14

单片机的控制系统课程设计

day=1;}

if(moon==10) {if(day==32) day=1;} if(moon==11) {if(day==31) day=1;}

if(moon==12) {if(day==32)

day=1;}//设定,1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,二月闰年有29天,平年有28天

write_nyr(9,day);//令LCD在正确的位置显示\"加\"设定好的日期数据 ZJL=(day)/10*16+(day)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x86,ZJL);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码

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

write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 6:moon++; if(moon==13) moon=1;

write_nyr(6,moon);//令LCD在正确的位置显示\"加\"设定好的月份数据 ZJL=(moon)/10*16+(moon)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x88,ZJL);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码

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

write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 7:year++; if(year==100) year=0;

write_nyr(3,year);//令LCD在正确的位置显示\"加\"设定好的年份数据 ZJL=(year)/10*16+(year)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8c,ZJL);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码

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

write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

15

单片机的控制系统课程设计

} } }

//------------------减键key3,各句功能参照'加键'注释--------------- if(key3==0)

{ delay(10);//调延时,消抖动 if(key3==0) { delay(20); while(!key3); switch(key1n)} case 1:sec--; if(sec==-1)

sec=59;//秒数据减到-1时自动变成59

write_sfm(0x08,sec);//在LCD的正确位置显示改变后新的秒数 ZJL=(sec)/10*16+(sec)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护

write_1302(0x80,ZJL); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码

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

write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 //write_1602com(0x0b); break;

case 2:min--; if(min==-1) min=59;

write_sfm(5,min);

ZJL=(min)/10*16+(min)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x82,ZJL);//向DS1302内写分寄存器82H写入调整后的分数据BCD码

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

write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break;

case 3:hour--; if(hour==-1) hour=23;

write_sfm(2,hour);

ZJL=(hour)/10*16+(hour)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x84,ZJL);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码

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

16

单片机的控制系统课程设计

write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 4:week--; if(week==0) week=7;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容

ZJL=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8a,ZJL);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码

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

write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 5:day--; if(moon==1) {if(day==0) day=31;} if(moon==2)

{if((year/4==0&&year/100!=0)||(year/400==0)) {if(day==0) day=29;}

else if(day==0) day=28;} if(moon==3) {if(day==0) day=31;} if(moon==4) {if(day==0) day=30;} if(moon==5) {if(day==0) day=31;} if(moon==6) {if(day==0) day=30;} if(moon==7) {if(day==0) day=31;} if(moon==8) {if(day==0) day=31;}

17

单片机的控制系统课程设计

if(moon==9) {if(day==0) day=30;}

if(moon==10) {if(day==0) day=31;} if(moon==11) {if(day==0) day=30;} if(moon==12) {if(day==0)

day=31;}//同上加键 write_nyr(9,day);

ZJL=(day)/10*16+(day)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x86,ZJL);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码

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

write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要回位break; case 6:moon--; if(moon==0) moon=12;

write_nyr(6,moon);

ZJL=(moon)/10*16+(moon)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x88,ZJL);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码

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

write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 7:year--; if(year==-1) year=99;

write_nyr(3,year);

ZJL=(year)/10*16+(year)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8c,ZJL);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码

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

write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

18

单片机的控制系统课程设计

}}}}}

//------------------------------- void init() //定时器、计数器设置函数 { TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0

TL0=0; //定时器T0的低四位=0 EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断

TR0=1; //开启中断,启动定时器 }

//******************主函数************************** //*************************************************** void main()

{ lcd_init(); //调用液晶屏初始化子函数

ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 delay(80);

while(1) //无限循环下面的语句: { keyscan(); //调用键盘扫描子函数 }}

void timer0() interrupt 1 //取得并显示日历和时间 {

//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样): sec = BCD_Decimal(read_1302(0x81)) min = BCD_Decimal(read_1302(0x83)); hour = BCD_Decimal(read_1302(0x85)); day = BCD_Decimal(read_1302(0x87)); moon=BCD_Decimal(read_1302(0x89)); year=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); //显示秒、时、分数据:

write_sfm(8,sec);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数) write_sfm(5,min);//分,从第二行第5个字符后开始显示 write_sfm(2,hour);//小时,从第二行第2个字符后开始显示 //显示日、月、年数据:

write_nyr(9,day);//日期,从第二行第9个字符后开始显示 write_nyr(6,moon);//月份,从第二行第6个字符后开始显示 write_nyr(3,year);//年,从第二行第3个字符后开始显示 write_week(week); }

19

单片机的控制系统课程设计

第5章 系统仿真及调试

使用Proteus进行仿真,仿真结果如下:

图5-1 仿真结果

20

单片机的控制系统课程设计

结 论

本文介绍的是利用AT89S51单片机设计的电子时钟日历。并详细说明了软件和硬件设计方法及仿真、硬件实现。在设计过程中可以看出,汇编语言有着其独特的魅力,它简单易学,语法错误容易纠正;用单片机实现电子日历的设计是比较方便和易于实现的。

通过电子日历的设计和制作,加深了对单片机的理解,能够更熟练地应用单片机实现预期的功能,对今后的工作和接下来的毕业设计有很大的帮助。电子日历各项功能的实现,为自动控制的实现打下了理论基础,获得了实现方法。

21

单片机的控制系统课程设计

参考文献

[1]万隆,巴奉丽.单片机原理及应用技术.清华大学出版社,2010.03. [2]蔡美琴.MCS-51系列单片机系统及其应用.北京:高等教育出版社,2004. [3]李全利.单片机原理及应用.清华大学出版社,2006.2.

[4]张毅刚,彭喜源.MCS-51单片机应用设计.哈尔滨工业大学出版社,1990. [5]张毅刚.单片机原理及应用.北京:高等教育出版社,2010.

[6]马忠梅.单片机的C语音应用程序设计[M].北京:北京航空航天大学出版社,2003.

22

东北石油大学课程设计成绩评价表

课程名称 题目名称 学生姓名 序号 戈晶宇 评价项目 工作量、工作态度和出勤率 学号 单片机的控制系统课程设计 电子日历设计 100601140106 指导教师姓名 李艳辉 邵克勇 职称 满分 教授 教授 评分 指 标 按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。 课程设计选题合理,计算过程简练准确,分析问1 20 2 课程设计质量 题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。 45 3 4 总分 创新 答辩 工作中有创新意识,对前人工作有一些改进或有一定应用价值。 能正确回答指导教师所提出的问题。 5 30 评语: 指导教师: 年 月 日

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