单片机课程设计-年月日时分秒设计(汇编语言)带Proteus图

合集下载

单片机万年历设计编程

单片机万年历设计编程

单片机万年历设计编程一.实验目的1.掌握时钟程序的使用方法2.掌握时间函数的使用方法3.利用单片机设计万年历二.设计要求通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,七个按钮连接P0口可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。

三.设计方案1.原理构成框图本设计用AT89C51作为核心控制部分,外接晶振电路与复位电路,74LS138作为位选扩展电路,P0口接七个开关作为时间调整部分,以两个四位数码管作为显示部分,开关控制显示时间与日期,P2口作为段选,P1口作为位选部分。

具体框图如图所示:2.主程序设计系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous 的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。

系统程序主要包括主程序,读出时钟子程序、计算时间子程序、键盘扫描子程序和显示数据刷新子程序。

主程序流程图如图所示:3时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下SHI JIAN键两个四位数码管显示时间和星期,按下RI QI键两个数码管显示日期,按下TIAO SHI键可以对时间和日期进行调节,JIA键表示加,JIAN键表示减,YI WEI表示选择所要调节的位置,QUE DING按键按下,时间调节结束。

所连线路和单片机接口仿真图如图所示:4.LED数码管的选择LED数码管分为共阴和共阳两种,以利用AT89C51的P2口作为LED显示的段选部分,以P1口的P1.0、P1.1、P1.2、三个口作为显示部分的位选,通过三八译码器扩展为八位的位选分别接在两个四位数码管的位选部分。

详细电路图如图所示:5.实物的制作与调试原理图的绘制PCB的绘制四.设计总结这次的设计的任务是万年历时钟的设计,对于时钟以前学习C51时有些接触,通过C51芯片程序控制显示万年历。

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计
C语言Lcd1602万年历闹钟Proteus仿真单片机设计
AT89C51+Lcd1602+DS1302+独立按键+蜂鸣器
Lcd1602万年历闹钟。

时间信息来自DS1302,显示采用
Lcd1602,蜂鸣器提供闹音和按键提示音。

液晶上面显示年月日时分秒星期以及闹钟时间。

有时间调节和闹钟调节,可以调节年月日时分秒星期信息以及闹钟时间。

具体介绍如下。

1.做好的仿真图,如下图所示。

2.启动仿真后,先在液晶屏显示系统信息,然后在第二屏显示需要的万年历闹钟信息。

如下图所示!
3.通过单片机右侧的三个按键,即可设置闹钟。

如下图所示。

4.通过单片机左侧的四个按键,来设置年月日时分秒星期的值。

设置时,参数闪烁,同时会有按键提示音。

5.本设计默认套餐1,具体套餐详情请看下面的发货清单。

如需要其它套餐,请联系客服询问。

详情请:点击此处。

单片机课程-日历时钟设计

单片机课程-日历时钟设计

题目一日历时钟设计一、设计内容:采用MCS-51系列单片机进行日历时钟设计并通过实验仪验证通过。

二、设计要求:1.设计单片机最小系统电路(包括复位、晶振电路、外扩3个2764共24KROM、3个6264共24KRAM 等)2.设计键盘/显示器接口电路。

3.通过软件编程实现日历时钟的显示(显示年、月、日和时:分:秒)4.通过键盘可预置日历时钟。

5.实现作息时间控制输出。

一、单片机最小系统XTAL11.89C52单片最小系统XTAL1目录摘要 (7)前言 (8)1 概论 (8)概述 (8)时钟日历的特性 (8)2 系统原理与硬件设计 (9)硬件选择 (10)AT89C51单片机简介 (10)时钟芯片介绍 (15)LED简介 (20)3 程序设计 (22)4 调试过程及数据分析 (19)K EI L调试 (19)实验台调试 (19)5 结果分析 (30)6 心得体会 (30)7 致谢 (30)8参考文献 (20)摘要本次单片机课程设计利用PCF8563日历实时时钟实现年月日时分秒的显示。

本次课程设计需要用到CPU模块、ZLG7290键盘与显示模块、时钟模块(PCF8563)。

PCF8563这种时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新在计算机汇编语言的驱动下每秒自动进行一次,但不需程序干预其输出状态。

此外,这种时钟芯片带有锂电池做后备电源,具备永不停止的计时功能和可编程方波输出功能,可用作实时测控系统的采样信号等。

这种时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。

本次设计中的LED数码管电子时钟电路采用24小时制记时方式,日期和时间用16位数码管显示。

设计采用AT98C51单片机,使用5V电源供电。

本次设计采用AT89C51单片机的扩展芯片和ZLG7290键盘与显示模块做驱动,由多块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显著地增加系统成本的情况下,可支持更多的LED数码管稳定显示。

基于单片机的万年历课程设计

基于单片机的万年历课程设计

一、前言随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。

由其是单片机技术的应用产品已经走进了千家万户。

电子万年历的出现给人们的生活带来的诸多方便。

本设计是基于51系列的单片机进行的电子万年历设计,采用八位数码管显示年月日时分秒及温度信息,具有可调整日期和时间功能。

时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。

日历能显示阳历和阴历年、月、日以及星期、时、分、秒。

设计以STC89C52RC 单片机为核心,构成单片机控制电路;以DS1302时钟芯片作为万年历信号发生器;以DS18B20作为检测温度的传感器。

关键词时钟电钟;DS1302;DS18B20;数码管;单片机。

二、系统概述及总体方案2.1系统概述本电子万年历采用单片机控制技术和数码管显示方案,可以很好的完成万年历和实时温度显示。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

2.2总体方案2.2.1单片机芯片:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全相同,该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。

所以选择采用AT89S52作为主控制系统.2.2.2 时钟芯片:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.且同组同学已从Maxim申请到了这种芯片,所以本设计采用了这种芯片。

51单片机电子秒表设计(Proteus)

51单片机电子秒表设计(Proteus)

51单片机电子秒表设计(Proteus)单片机硬件设计结课论文简易秒表设计专业:计算机科学与技术学生姓名:学号: 1307064248完成时间:2020年12月28日目录一、简述 (3)二、主要工具 (2)三、线路连接图(ISIS 7 Professional环境) (2)四、实现细则 (2)显示电路 (2)定时计数器 (3)五、程序 (4)六、模拟运行截图 (16)七、心得体会 (16)一、简述此秒表主要实现的功能是利用单片机内部定时计数器实现计时,然后通过LED组件显示出来。

因为这次设计时使用的是并排的6个数字显示LED,所以在计时时精确到10ms,最大即时59分59秒99。

实现过程中的主要部分包含显示和定时。

因为该LED与单片机相接的引脚只有14个,其中8个接在P0口上实现字形的显示,剩下的6个接在P2口用于选择6个数字型LED中的一个显示,所以每次只能显示一个数字。

要实现多个数字的显示需要快速显示每个LED,利用人的视觉差来实现多个数字同时显示。

计时只用到定时计数器T1(因为需要配合中断优先级,故没有使用T0,下文会详细讲到)。

另外还用到了两个按键,和两个LED灯(红、绿)。

按键用于控制开始计时和暂停、重置,LED 灯用于指示当前工作状态。

二、主要工具Keil uVision3,ISIS 7 Professional,AT89C51基础组件(试验箱)。

三、线路连接图(ISIS 7 Professional环境)四、实现细则显示电路数字型LED的实现原理为每个单元(共6个单元)含8个发光独立的LED灯,其中7个构成“8”字形,剩下的一个为小数点。

6个单元的每个相同位置引脚并联起来,最后通过8根线连接到单片机的P0口。

因此如果不把另外6根线连接上,每次通过P0口输出值时6个显示单元都会显示相同的图形(数字)。

LED单元组中另外6根引脚连接到单片机上,实现“按位显示”,并且是低电平选择,例如“111101”对应显示的是从右到左的第5个LED 单元。

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图单片机万年历仿真原理图如下仿真Altium Designer画的万年历原理图和PCB图如下:PCB原理图基于51单片机,可以完成时钟显示、公历显示、农历显示、温度显示、闹钟报警定时的LCD时钟PPT内容预览:本设计使用AT89C51来做主控芯片,其强大的功能足够实现我们设计的所有功能。

使用LCD1602的液晶显示器来进行显示。

使用Keil uVision5进行编程。

通过Proteus8.6来进行仿真。

点击一次K1进入时钟设置页面,通过点击K2切换时、秒、分、星期、年、月、日,通过K3与K4实现加减来完成时钟的设置点击两次K1进入闹钟设置页面,通过点击K2切换开关、时、秒、分,通过K3与K4实现加减完成闹钟的设置。

单片机源程序如下注释是很全的#include //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"#include "nongli.h"#include "intrins.h"bit flag_200ms ;bit flag_100ms ;sbit beep = P3^7; //蜂鸣器定义bit flag_beep_en;uint clock_value; //用作闹钟用的sbit dq = P3^1; //18b20 IO口的定义uint temperature ; //温度变量uchar flag_nl; //农历阳历显示标志位uchar menu_1,menu_2;uchar key_time,flag_value; //用做连加的中间变量bit key_500ms ;uchar n_nian,n_yue,n_ri; //农历显示的函数#include "ds1302.h"#include "lcd1602.h"/******************把数据保存到单片机内部eeprom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, fen1);byte_write(0x2001, shi1);byte_write(0x2002, open1);byte_write(0x2058, a_a);}/******************把数据从单片机内部eeprom中读出来*****************/void read_eeprom(){fen1 = byte_read(0x2000);shi1 = byte_read(0x2001);open1 = byte_read(0x2002);a_a = byte_read(0x2058);}/**************开机自检eeprom初始化*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 1) //新的单片机初始单片机内问eeprom{fen1 = 3;shi1 = 8;a_a = 1;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us 的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令delay_uint(50); //500usinit_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令EA = 0;low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/******************1ms 延时函数*******************/void delay_1ms(uint q){uint i,j;for(i=0;i<>< p=""><>for(j=0;j<120;j++);}/******************写星期函数*******************/void write_week(uchar hang,uchar add,uchar week)//写星期函数{if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);。

单片机C语言电子钟显示年月日星期及时间(带注释)

单片机C语言电子钟显示年月日星期及时间(带注释)

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2011-12-30 SA T";uchar code table1[]=" 23:59:55 ";uchar code week1[][3]={"MON","TUE","WEN","THU","FRI","SA T","SUN"}; /*uchar code week2[]="TUE";uchar code week3[]="WEN";uchar code week4[]="THU";uchar code week5[]="FRI";uchar code week6[]="SA T";uchar code week7[]="SUN"; */uchar count,shi,fen,miao,dnum,year,month,day,week,a=5;sbit rs=P2^0; //数据命令sbit rw=P2^1; //读写sbit en=P2^2; //使能sbit d1=P3^1; //独立键盘sbit d2=P3^2;sbit d3=P3^3;sbit d4=P3^4;void delay(uchar z) //延时{uint x,y;for(x=110;x>0;x--)for(y=z;z>0;z--);}void write_com(uchar com) //写指令{rs=0;rw=0;en=0;P0=com;delay(5);en=1;delay(5);en=0;}void write_date(uchar date) //写数据{rs=1;rw=0;en=0;P0=date;delay(5);en=1;delay(5);en=0;}void write_weekday (uchar a){uchar x;write_com(0x80+13);for(x=0;x<3;x++){write_date(week1[a][x]);}}void weekday(uint i){write_weekday(i%7);}void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add); //指向要写的地址write_date(0x30+shi); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void write_ymd(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add); //指向要写的地址write_date(0x30+shi); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void unit(){uchar num;en=0;write_com(0x38); //显示write_com(0x0c); //光标不显示write_com(0x06); //指针加1,整屏不移动write_com(0x01); //清屏write_com(0x80); //指针指向0x80for(num=0;num<16;num++) //第一行显示table数组{write_date(table[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<16;num++) //第二行显示table1数组{write_date(table1[num]);delay(20);}TMOD=0X01;TH0=(65536-50000)/256; //开启中断TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shi=23;fen=59;miao=55;year=11;month=12;day=30;}void jishu() //计数{if(count==20){count=0;miao++; //秒加if(miao==60){miao=0;fen++; //分加if(fen==60){fen=0;shi++;if(shi==24){shi=0;day++;a++;weekday(a);//时加}write_sfm(3,shi);write_ymd(9,day);if(day==31){day=0x01;write_ymd(9,day);month++;write_ymd(6,month);if(month==13){month=0x01;write_ymd(6,month);year++;write_ymd(3,year);}}}write_sfm(6,fen);}write_sfm(9,miao);}}void change(){d4=0;if(d1==0) //移光标{delay(10);if(d1==0){while(!d1);dnum++;if(dnum==1){TR0=0;write_com(0x0f);write_com(0x80+0x40+10);}if(dnum==2){write_com(0x80+0x40+7);}if(dnum==3){write_com(0x80+0x40+4);}if(dnum==4){write_com(0x80+10);}if(dnum==5){write_com(0x80+7);}if(dnum==6){write_com(0x80+4);}if(dnum==7){dnum=0;TR0=1;write_com(0x0c);}}}if(d2==0) //加数据{delay(10);if(d2==0){while(!d2);if(dnum==1){miao++;if(miao==60)miao=0;write_sfm(9,miao); //顺序不能换write_com(0x80+0x40+10); //顺序不能换}if(dnum==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi++;if(shi==24){shi=0;}write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day++;a++;weekday(a);if(day==31)day=1;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month++;if(month==13)month=1;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year++;write_ymd(3,year%100);write_com(0x80+4);}}}if(d3==0) //减数据{delay(10);if(d3==0){while(!d3);if(dnum==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+10);}if(dnum==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day--;a--;weekday(a);if(day==0)day=30;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month--;if(month==0)month=12;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year--;write_ymd(3,year%100);write_com(0x80+4);}}}}void main(){unit();while(1){jishu();change();}}void timer0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效sbit shift_key=P3^2;//位置移动键sbit up_key=P3^3;//增加键uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uint year=2011;//定义年变量并赋初值2011年uchar month=06,day=01,week;//定义月、日、星期变量,并赋初值5月23日uchar hour=23,minute=59,second=58;//定义时、分、秒变量,并赋初值12时00分00秒uchar code week_string[7][4]={"MON","TUE","WED","THU","FRI","SA T","SUN"};//定义星期英文缩写表uchar data month_day[12]={31,0,31,30,31,30,31,31,30,31,30,31};//定义每月天数表/*--定时计数器T0及中断初始化函数--*/void init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开启定时器0中断EX0=1;//开启外部中断,外部中断用于调整时间PT0=1;//将定时器0中断设置高优先级,调整时间期不停止计时TR0=1;//启动定时器0}/*----------1ms延时函数----------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*********************公历平年的2月只有28天,公历闰年的2月有29天。

单片机课程设计—万年历[1]

单片机课程设计—万年历[1]

郑州轻工业学院软件学院单片机与接口技术课程设计总结报告设计题目:电子万年历学生:系别:专业:班级:学号:指导教师:2021年12月16日设计题目:电子万年历设计任务与要求:1、显示年月日时分秒及星期信息2、具有可调整日期和时间功能3、增加闰年计算功能方案比拟:方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。

方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路等模块。

主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作。

两个方案工作原理大致相同,只有显示模块和时钟电路不同。

LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,假设采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。

DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。

单片机有定时器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。

比照以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

逻辑总框图:该电子万年历的总体设计框图如图(1)所示。

单片机课程设计万年历显示设计

单片机课程设计万年历显示设计

单片机课程设计报告题目: 基于单片机的LCM1602液晶操纵——万年历显示设计所在系部:信息与电气工程所在专业:通信本所在班级: 1001 姓名:曹怀宝学号: 20203615276 指导教师:陈勇完成时刻: 2013年 7月 3日基于单片机的LCM1602液晶操纵——万年历显示设计1.设计目的该设计是基于AT89C52单片机的电子万年历系统,采纳LCD1602液晶屏实现显示。

显示年月日礼拜温度等,双行显示,。

显示年、月、日、礼拜、时刻,可设置,设置功能。

综上所述此时钟具有读取方便、显示直观、功能多样、电路简练、等优势,符合电子仪器仪表的进展趋势,具有广漠的市场前景。

2.设计原理及相关说明设计原理:利用DS1302读取系统中的日期和时刻信息,并别离利用P端口和P 端口将相关信息传送至STC12C5A60S2主芯片当中,利用P0端口使之显示于LCD1602液晶显示屏上,四个按键别离置于P1口的五、六、7端口能够对时刻进行操纵修改。

详细请参阅第三节的芯片介绍。

日历时钟系统设计框图如图1所示:图1 电子万年历系统设计框图3 各芯片的设计及其挪用3.1 STC12C5A60S2单片机主控模块STC12C5A60S2简介STC12C5A60S2是STC生产的单时钟/机械周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换1、增强型8051CPU,1T(1024G),单时钟机械周期2、工作电压5.5-3.5V3、1280字节RAM4、通用I/O口,复位后为:准双向口/弱上拉可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏每一个I/O口驱动能力都可达到20mA,但整个芯片最大不要超过120mA5、有EEPROM功能六、看门狗7、内部集成MAX810专用复位电路八、外部掉电检测电路九、时钟源:外部高精度晶体/时钟,内部R/C振荡器常温下内部R/C单片机为:11~17MHz 3.3V单片机为:8~12MHz 针对电机操纵,强干扰场合。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

单片机课设万年历报告

单片机课设万年历报告

单片机课程设置万年历报表一、系统介绍:电子万年历是一种非常广泛的日常计时工具,在现代社会中越来越流行。

可对年、月、日、时、分、秒等多种功能进行计时,DS1302使用寿命长,误差小。

数字电子万年历采用直观的数字显示,可同时显示年、月、日、时、分、秒等信息,还具有时间校准等功能。

本设计是基于51系列单片机的电子万年历设计,可显示年、月、日、时、分、秒的信息,并具有日期和时间可调功能。

在设计的同时,更全面地准备了单片机的理论基础和外围扩展知识。

在软硬件设计上,没有良好编制依据知识和实践经验,会受到很大的限制。

每个功能需要什么样的硬件来实现,程序怎么写,算法怎么实现等等,没有一定编制依据是不可能很好的。

实现。

在编写程序的过程中,发现仅凭现有的相关知识很难单独完成编写任务。

在老师和同学的帮助下,程序的编写完成了。

万年历的设计过程在硬件和软件方面是同步设计的。

硬件部分主要由AT89C5 1单片机、LED显示电路、定时按键电路组成。

在单片机的选择上,我使用了AT89C5 1单片机,适用于很多复杂的控制应用。

软件方面主要包括日历程序、时间调整程序、显示程序等。

该程序是用高级语言C编写的,以便更容易调整时间。

所有程序都写好后,确认没有问题后,将单片机嵌入到Proteus软件中进行仿真。

在大部分后总在老师和同学的帮助下,电子万年历的设计都是自己努力完成的。

二、系统功能说明一、设计要求:1.具有年、月、日、周、时、分、秒等功能;2.具有年、月、日、周、时、分、秒的调整和校准功能;2、单片机芯片的选型方案及演示:以89C51芯片为硬件核心,数码管显示,为了让用户更清晰易懂,万年历日期和时间分别显示,同时对应两个74LS138芯片控制数码管显示器,还有74LS373解码芯片,74LS21芯片用来控制键盘的功能。

如图所示:74LS138的8个输出管脚要么随时为高电平1,即芯片处于非活动状态,要么只有一个为低电平0,其余7个输出管脚全部为高电平1。

电子实时时钟万年日历系统-单片机课程设计(含电路图、流程图、汇编语言)

电子实时时钟万年日历系统-单片机课程设计(含电路图、流程图、汇编语言)

一、题目:电子实时时钟/万年日历系统二、功能要求:1.基本要求:⑴显示准确的北京时间(时、分、秒),可用24小时制式;⑵随时可以调校时间。

2.发挥要求:⑴增加公历日期显示功能(年、月、日),年号只显示最后两位;⑵随时可以调校年、月、日;⑶允许通过转换功能键转换显示时间或日期。

三、方案考虑:1、硬件方案:⑴显示器采用6位LED数码管(共阳),可分别显示时间或日期。

⑵显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。

但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。

可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码。

⑶采用“一键多用方案”,以减少按键数目。

本方案采用了4按键。

⑷整体上要考虑:结构简单、布局美观、操作方便、成本低廉。

2、设计电路图如下:3、元件清单:(我们使用的是TX-1C开发板)⑴ 89C52 1个⑵IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。

⑶ 74LS244 1个(用于驱动6个共阳的LED段数码管)。

⑷ IC座(20脚) 1个(用于接插74LS244)。

(5)显示器:LED_8段数码管(共阳型)6个三极管:(6)PNP(8550)6个(用于驱动6个共阳型LED段数码管)。

(7)微型开关:3个(其中1个用于复位电路、其它用于键盘)。

(8)晶体振荡器(12MHz):1个(用于振荡电路)。

(9)电阻器:⑴ 3KΩ 1个(用于系统复位电路)。

⑵ 1KΩ 6个(用作PNP三极管基极电阻)。

⑶ 100Ω 7个(驱动器用作74LS244输出限流电阻)。

(10)电容器:⑴ 10μF1个(用于系统复位电路)。

⑵ 30 pF 2个(用于系统振荡电路)。

(11)其它:⑴万能电路板(10×15):1块⑵焊锡条: 2米⑶带插头、座的电源端子: 1条⑷各种颜色外皮的导线:各1米(12)工具:1.电烙铁:1把2.剪钳:1把3.镊子:1把4.万用表:1个(13)设备:编程器(MEP300或TOP851)6个4、软件方案:(1)使用全汇编编写(2)时钟基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计报告万年历的设计基于51单片机的万年历摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。

在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。

软件方面主要包括日历程序、时间调整程序,显示程序等。

程序采用C语言编写。

所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

一、设计要求基本要求:1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”;2,具有日历功能;③时间可以通过按键调整。

发挥部分:④具有闹钟功能(可以设定多个)。

二:总体设计电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用时不需要额外的外围电路。

51单片机电子万年历设计带有proteus仿真

51单片机电子万年历设计带有proteus仿真

湖南文理学院课程设计课程名称:单片机课程设计设计题目:电子万年历教学院部:电气与信息工程学院专业班级:自动化09101班指导教师:张晓虎(学生姓名:邵泽学号: 0120完成时间: 2012 年6月12日报告成绩:{摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。

该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。

在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用液晶LCD1602。

软件方面主要包括日历程序、液晶驱动程序,显示程序等。

程序采用汇编语言编写。

所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

关键词时钟电钟,DS1302,液晶LCD1602,单片机Abstract:…Electronic calendar is a very extensive daily timing tool for modern society is more and more popular. It can be to year, month, day, Sunday, when, minutes, and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. For digital electronic calendar using intuitive digital display, can also shows that year, month, day, Sunday, when the information such as, minutes and seconds, still have time calibration etc. Function. The AT89C52 single chip microcomputer as circuit adopts core, power consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 to 5 V voltage power supply. The design process of the calendar in the hardware and software design of synchronization. Mainly by AT89C52 single chip microcomputer hardware part, liquid crystal display circuit, reset circuit, clocking circuit on the circuit circuit and serial download circuit etc. The processor on the choice of the single chip microcomputer AT89C52 use, the single chip microcomputer suitable for many more complex control applications. Use of liquid crystal display LCD1602. Software is mainly including calendar program, liquid crystal driver, show program, etc. Program using assembly language. All programming, after the completion of Keil C51 software in commissioning, make sure no, after Proteus software embedded in within the singlechip microcomputer simulation.Key words DianZhong clock, DS1302, liquid crystal LCD1602, microcontroller目录1设计要求与方案论证 (3)设计要求 (3)系统基本方案选择和论证 (3)单片机芯片的选择方案和论证 (3)"时钟芯片的选择方案和论证: (4)电路设计最终方案决定 (5)2系统的硬件设计与实现 (5)电路设计框图 (5)系统硬件概述 (5)主要单元电路的设计 (5)单片机主控制模块的设计 (6)时钟电路模块的设计 (6)}显示模块电路 (7)串口下载电路 (8)复位电路 (9)稳压电路 (10)3系统的软件设计 (11)程序流程框图 (11)子程序的设计 (11)读写DS1302子程序 (11)】读写LCD1602子程序 (12)4软件测试及分析 (14)分析与结论 (14)调试分析 (14)调试和结论 (15)5总结 (15)1设计要求与方案论证设计要求—①能够显示年、月、日、时、分。

基于51单片机的万年历-闹钟-秒表设计

基于51单片机的万年历-闹钟-秒表设计

基于51单片机的万年历,闹钟,秒表设计有关接线图完整的程序代码#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={"20 年月日"};uchar code table1[]={" : : "};uchar code table5[]={" QI CHUANG LA"};void LCD_WRITE_COM(uchar com);void LCD_WRITE_DAT(uchar dat);void LCD_CSH();void LCD_GD();void LCD_CLR();void DELAYUS(uchar i);void DELAY(uint t);void DELAY_A(uint n);void DISP_TIME();void DISL1();void DISL3();void DS1302_CSH();void DS1302_WRITE(uchar addr,uchar dat); void WRITE_BTY(uchar dat);void DSweek(uchar num);void DS1820RST();void DS1820WR(uchar dat);void KEYSCAN();void KEYMOVE();void TIME_UP();void TIME_DOWN();uchar DS1820RD();uchar READ_T();uchar DS1302_READ(uchar addr);uchar READ_BTY();sbit IO=P3^5;sbit RST=P1^7;sbit SCLK=P1^6;sbit FMQ=P2^4;sbit DQ=P2^3; //DS18B20输出口sbit RS=P2^5; //寄存器选择信号sbit RW=P2^6; //读写控制信号线sbit LCDEN=P2^7; //使能信号线sbit S1=P1^0;sbit S2=P1^1;sbit S3=P1^2;sbit S4=P1^3;sbit S=P1^4;char BW,SW,GW;uchar t,tflag;uchar m,f,s,x,r,y,n;uchar A,A_m,A_f,A_s,A_x;uchar num1,num2;uchar flag,flag_A,flag_j;uchar shi,ge;uchar M_a,M_b,M_c,M_d,M_e,M_f,temp,ss; long int z=0,m1,m2;//*********延时*********void DELAY(uint t) //延时1MS{int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void DELAY_US(uint i) //延时1US {while(i--);}void DELAY_A(uint i){ uint j;char k;for(j=0;j<i;j++){ if(S4==0){DELAY(20);if(S4==0){break;}}for(k=110;k>0;k--){FMQ=1;DELAY(10);FMQ=0;DELAY(10);if(S4==0){DELAY(20); if(S4==0) {break;} }}}}//*********LCD模块*******void LCD_CSH(){ LCD_WRITE_COM(0x38); //设置液晶工作模式 16*2行显示,5*7点阵,8位数据DELAY(1);LCD_WRITE_COM(0x0c); //开显示DELAY(1);LCD_WRITE_COM(0x06); //光标移动DELAY(1);LCD_WRITE_COM(0x01); //清屏DELAY(1);}void LCD_WRITE_COM(uchar com){RW=0; //写RS=0; //寄存器模式选择,写命令P0=com; //写命令LCDEN=0;DELAY(1);LCDEN=1; //使能,0到1DELAY(1);LCDEN=0; //数据送入有效}void LCD_WRITE_DAT(uchar dat){RW=0;RS=1; //寄存器选择,写数据P0=dat; //写数据LCDEN=0;DELAY(1);LCDEN=1; //使能0到1DELAY(1);LCDEN=0; //数据送入有效}void LCD_WORD(unsigned char *p){while(*p>0){ LCD_WRITE_DAT(*p) ;p++;}}//固定显示void LCD_GD(){char i;LCD_WRITE_COM(0x80); //"20 年月日"for(i=0;i<15;i++){LCD_WRITE_DAT(table[i]);DELAY(1);}LCD_WRITE_COM(0x90); //" : : "for(i=0;i<11;i++){LCD_WRITE_DAT(table1[i]);}LCD_WRITE_COM(0x99);LCD_WRITE_DAT(0x03);LCD_WRITE_DAT(0x03);LCD_WRITE_COM(0x9A);LCD_WORD("萍水缘");LCD_WRITE_DAT(0x03);LCD_WRITE_DAT(0x03);}//清屏void LCD_CLR(){LCD_WRITE_COM(0x01);DELAY(2);}//上电欢迎界面void DISL1(){ LCD_WRITE_COM(0x80);LCD_WORD("基于51单片机的万年历,欢迎使用!"); }void DISL3() //闹钟时间到的显示界面{char i;LCD_WRITE_COM(0x80);for(i=0;i<15;i++){LCD_WRITE_DAT(table5[i]);DELAY(1);}LCD_WRITE_COM(0x90);for(i=0;i<15;i++){LCD_WRITE_DAT(table5[i]);DELAY(1);}}//********DS1302模块**********void DS1302_CSH()//(写程序要对照DS1302的各个写地址){RST=0;SCLK=0;DS1302_WRITE(0x8e,0x00);//允许写DS1302_WRITE(0x80,0x00);//初始秒0DS1302_WRITE(0x82,0x00);//初始分0DS1302_WRITE(0x84,0x15);//初始时0DS1302_WRITE(0x8a,0x01);//初始星期6DS1302_WRITE(0x86,0x04);//初始日1DS1302_WRITE(0x88,0x06);//初始月1DS1302_WRITE(0x8c,0x12);//初始年11DS1302_WRITE(0x8e,0x80);//写保护关}uchar DS1302_READ(uchar addr){uchar dat;RST=0; //初始CE为0SCLK=0; //初始时钟线为0RST=1; //传输开始WRITE_BTY(addr); //传送读取时间的地址dat=READ_BTY(); //读取时间SCLK=1; //时钟线拉高RST=0; //传输结束return dat; //返回时间}void DS1302_WRITE(uchar addr,uchar dat) {RST=0; //初始CE为0SCLK=0; //初始时钟线为0RST=1; //传输开始DELAY(1);WRITE_BTY(addr); //传送读取时间的地址WRITE_BTY(dat); //写入修改的时间SCLK=1; //时钟线拉高RST=0; //传输结束}uchar READ_BTY(){uchar i,dat=0;SCLK=0;DELAY(1);for(i=0;i<8;i++){dat=dat>>1;DELAY(1);if(IO==1) //如果读出数据是1(当前数据线为高时,证明该位数据为1)dat|=0x80; //要传输数据的当前位置为1,不是,则为0SCLK=1; //拉高时钟线DELAY(1);SCLK=0; //制造下降沿DELAY(1);}return dat;}void WRITE_BTY(uchar dat){uchar i;SCLK=0; //当前时钟线为0DELAY(1);for(i=0;i<8;i++) //开始传输8为数据{IO=dat&0x01; //取最低位DELAY(1);SCLK=0; //拉低时钟线DELAY(1);SCLK=1; //拉高时钟线dat=dat>>1; //数据右移一位,准备传输下一个数据}}//显示时间void DISP_TIME(){LCD_WRITE_COM(0x81);//显示年,DS1302的读地址8d为年位置,LCD显示在0x81位置shi=DS1302_READ(0x8d)/16;ge=DS1302_READ(0x8d)%16;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x83); //显示月,DS1302的读地址83为年位置shi=DS1302_READ(0x89)/16;ge=DS1302_READ(0x89)%16;LCD_WRITE_DAT(shi+0x30);LCD_WRITE_DAT(ge+0x30);LCD_WRITE_COM(0x85);//显示日shi=DS1302_READ(0x87)/16;ge=DS1302_READ(0x87)%16;LCD_WRITE_DAT(shi+0x30);LCD_WRITE_DAT(ge+0x30);LCD_WRITE_COM(0x90);//显示小时shi=DS1302_READ(0x85)/16;ge=DS1302_READ(0x85)%16;LCD_WRITE_DAT(shi+0x30);LCD_WRITE_DAT(ge+0x30);LCD_WRITE_COM(0x92);//显示分钟shi=DS1302_READ(0x83)/16;ge=DS1302_READ(0x83)%16;LCD_WRITE_DAT(shi+0x30);LCD_WRITE_DAT(ge+0x30);LCD_WRITE_COM(0x94);//显示秒shi=DS1302_READ(0x81)/16;ge=DS1302_READ(0x81)%16;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);DSweek(DS1302_READ(0x8b)); //显示星期if(A==1) //显示闹钟{LCD_WRITE_COM(0x87);LCD_WRITE_DAT(0x20);LCD_WRITE_DAT(0x0e);}if(A!=1){LCD_WRITE_COM(0x87);LCD_WRITE_DAT(' ');}}//显示时间的星期模块void DSweek(uchar num){LCD_WRITE_COM(0x95); //95位置清空,96.97显示周一,二,三,四,五,六,日LCD_WRITE_DAT(0x20);LCD_WRITE_DAT(0x20);LCD_WRITE_COM(0x96);switch(num){case 1:LCD_WRITE_DAT(0xD6);LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xD2);LCD_WRITE_DAT(0xBB);break;case 2:LCD_WRITE_DAT(0xD6);LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xB6);LCD_WRITE_DAT(0xFE);break;case 3:LCD_WRITE_DAT(0xD6); LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xC8);LCD_WRITE_DAT(0xFD);break;case 4:LCD_WRITE_DAT(0xD6); LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xCB);LCD_WRITE_DAT(0xC4);break;case 5:LCD_WRITE_DAT(0xD6); LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xCE);LCD_WRITE_DAT(0xE5);break;case 6:LCD_WRITE_DAT(0xD6); LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xC1);LCD_WRITE_DAT(0xF9);break;case 7:LCD_WRITE_DAT(0xD6); LCD_WRITE_DAT(0xDC);LCD_WRITE_DAT(0xC8);LCD_WRITE_DAT(0xD5);break;}}//**********温度模块*******void DS1820RST() //DS18b20的初始化函数{ uchar x=0;DQ=1; //DQ复位DELAY_US(4); //延时DQ=0; //DQ拉低DELAY_US(100); //精确延时大于480usDQ=1; //拉高DELAY_US(40);x=DQ;}uchar DS1820RD() //读一个字节{uchar i=0,dat=0;for (i=8;i>0;i--){DQ=0; //给脉冲信号 dat=dat>>1;DQ=1; //给脉冲信号if(DQ==1)dat|=0x80;DELAY_US(10);}return dat; //写一个字节}void DS1820WR(uchar dat){char i=0;for (i=8;i>0;i--){DQ=0;DQ=dat&0x01;DELAY_US(10);DQ=1;dat=dat>>1;}}uchar READ_T(){uchar a,b;DS1820RST();DS1820WR(0xcc);//跳过读序列号(固定)DS1820WR(0x44);//启动温度转换DS1820RST();DS1820WR(0xcc);//跳过读序列号DS1820WR(0xbe);//读取温度a=DS1820RD();b=DS1820RD();b<<=4;b+=(a&0xf0)>>4;t=b;return t;}//显示温度void DISP_T(){ uchar R1;R1=READ_T();LCD_WRITE_COM(0xc8);LCD_WRITE_DAT(0xCE);LCD_WRITE_DAT(0xC2);LCD_WRITE_DAT(0xB6);LCD_WRITE_DAT(0xC8);LCD_WRITE_DAT(':');if(R1<0x81){LCD_WRITE_DAT(0x30+R1/100);} else{R1=~(R1)+1;LCD_WRITE_DAT('-');}LCD_WRITE_DAT(0x30+R1%100/10);LCD_WRITE_DAT(0x30+R1%10);LCD_WRITE_DAT(0xA1);LCD_WRITE_DAT(0xE6);}//*******键盘******//读暂停时的时间void TIME(){if(flag==0){m=DS1302_READ(0x81); //分别读出秒,分,时,星期,日,月,年(DS1302的读地址应用)f=DS1302_READ(0x83);s=DS1302_READ(0x85);x=DS1302_READ(0x8b);r=DS1302_READ(0x87);y=DS1302_READ(0x89);n=DS1302_READ(0x8d);}}//时间更新void TIME_UPDATE(){DS1302_WRITE(0x8e,0x00); //写允许DS1302_WRITE(0x80,m); //分别写出秒,分,时,星期,日,月,年(DS1302的写地址应用)DS1302_WRITE(0x82,f);DS1302_WRITE(0x84,s);DS1302_WRITE(0x8a,x);DS1302_WRITE(0x86,r);DS1302_WRITE(0x88,y);DS1302_WRITE(0x8c,n);DS1302_WRITE(0x8e,0x80); //禁止写}//闹钟void ALARM_CLOCK(){LCD_CLR();DELAY(10);DISL3(); //显示起床DELAY_A(100);FMQ=0; //蜂鸣器响flag_A=0;LCD_CLR();LCD_GD(); //固定显示}//闹钟开关显示void ALARM_KG(){if(x!=1){A=0;LCD_WRITE_COM(0x85);LCD_WRITE_DAT(0xb9);LCD_WRITE_DAT(0xd8);x=0;}if(x==1){A=1;LCD_WRITE_COM(0x85);LCD_WRITE_DAT(0xbf);LCD_WRITE_DAT(0xaa);}}//*******秒表******void CSH(){EA=1;ET0=1;TMOD=0x01;TH0=(65535-4900)/256;TL0=(65535-4900)%256;TR0=0;ss=0;M_a=M_b=M_c=M_d=0;}//秒表的键盘扫描void KEYSCAN_M(){ S=0;if(S2==0){DELAY(100);if(S2==0){while(S2==0);ss=~ss;TR0=1;if(ss==0) //S2可以暂停或者继续TR0=0;}}if(S3==0){DELAY(100);if(S3==0){while(S3==0){M_a=M_b=M_c=M_d=0;}}}}void TIME_M() interrupt 1{TH0=(65535-4900)/256;TL0=(65535-4900)%256;temp++;if(temp==2){temp=0;M_c++;if(M_c==10){M_c=0;M_b++;if(M_b==10){M_b=0;M_a++;if(M_a==10){M_a=0;M_d++;if(M_d==6){M_d=0;M_e++;if(M_e==0){M_e=0;M_f++;}}}}}}}//显示秒表,fe:da:bcvoid DISP_M(){ LCD_WRITE_COM(0x83); //显示秒表LCD_WRITE_DAT(0xc3);LCD_WRITE_DAT(0xeb);LCD_WRITE_DAT(0xb1);LCD_WRITE_DAT(0xed);LCD_WRITE_COM(0x91); //显示00:00::00LCD_WRITE_DAT(0x30+M_f);LCD_WRITE_DAT(0x30+M_e);LCD_WRITE_DAT(':');LCD_WRITE_COM(0x93);LCD_WRITE_DAT(0x30+M_d);LCD_WRITE_DAT(0x30+M_a);LCD_WRITE_DAT(':');LCD_WRITE_COM(0x95);LCD_WRITE_DAT(0x30+M_b);LCD_WRITE_DAT(0x30+M_c);}//按键扫描,s1为功能显示,s2为光标移动/秒表暂停(开始),s3为加时间和秒表复位,s4为减时间和停止闹钟void KEYSCAN(){ S=0;if(S1==0){DELAY(100);if(S1==0)while(!S1);{num1++; // 界面切换switch(num1){case 1: num2=0;m=A_m;f=A_f;s=A_s;x=A_x;LCD_CLR();LCD_WRITE_COM(0x80); //显示闹钟设置LCD_WRITE_DAT(0xC4);LCD_WRITE_DAT(0xD6);LCD_WRITE_DAT(0xD6);LCD_WRITE_DAT(0xD3);LCD_WRITE_DAT(0xC9);LCD_WRITE_DAT(0xE8);LCD_WRITE_DAT(0xD6);LCD_WRITE_DAT(0xC3);LCD_WRITE_COM(0x94);LCD_WRITE_DAT(0x30+m/16); LCD_WRITE_DAT(0x30+m%16);LCD_WRITE_COM(0x92);LCD_WRITE_DAT(0x30+f/16); LCD_WRITE_DAT(0x30+f%16); LCD_WRITE_DAT(':');LCD_WRITE_COM(0x90);LCD_WRITE_DAT(0x30+s/16); LCD_WRITE_DAT(0x30+s%16); LCD_WRITE_DAT(':');LCD_WRITE_COM(0x8b);ALARM_KG();break;case 2: LCD_WRITE_COM(0x0c); //开显示LCD_CLR();break;case 3: num2=0;num1=0;A_m=m;A_f=f;A_s=s;A_x=x;LCD_WRITE_COM(0x0c);flag=0; //读暂停的时间标志位LCD_CLR();LCD_GD(); //固定显示break;}}}}//光标移动void KEYMOVE(){ S=0;if(S2==0){ DELAY(100);if(S2==0)while(!S2);{num2++;}}if(num1==0) //调整时间,日期{switch(num2){case 1: //S2按下一次TIME(); //读出暂停的时间flag=1;LCD_WRITE_COM(0x97); //光标在星期位置闪烁LCD_WRITE_COM(0x0f);TIME_UPDATE(); //时间更新,写入设置的时间break;case 2:LCD_WRITE_COM(0x94); //光标在秒位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 3:LCD_WRITE_COM(0x92); //光标在分钟位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 4:LCD_WRITE_COM(0x90); //光标在时位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 5:LCD_WRITE_COM(0x85); //光标在日期位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 6:LCD_WRITE_COM(0x83); //光标在月份位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 7:LCD_WRITE_COM(0x81); //光标在年份位置闪烁TIME_UPDATE(); //时间更新,写入设置的时间break;case 8:LCD_WRITE_COM(0x0c); //开显示flag=0; // 读暂停的时间标志位TIME_UPDATE(); //时间更新,写入设置的时间num2=0; //复位 break;}}if(num1==1) //调整闹钟{switch(num2){case 1:LCD_WRITE_COM(0x85); //是够开闹钟LCD_WRITE_COM(0x0f);break;case 2:LCD_WRITE_COM(0x94); //光标在秒位置闪烁break;case 3:LCD_WRITE_COM(0x92); //光标在分钟位置闪烁break;case 4:LCD_WRITE_COM(0x90); //光标在小时位置闪烁break;case 5:LCD_WRITE_COM(0x0c); //开显示num2=0; //复位 break;}}if(S3==0) //加时间{ DELAY(100);if(S3==0)while(!S3);{TIME_UP();}}if(S4==0) //减时间{ DELAY(100);if(S4==0)while(!S4);{TIME_DOWN();}}}//加时间void TIME_UP(){switch(num2){case 1:x++; //星期加1if(x==0x08) x=1;if(num1==0){ DS1302_WRITE(0x8e,0x00);//写允许DS1302_WRITE(0x8a,x);DS1302_WRITE(0x8e,0x80); //写禁止DSweek(DS1302_READ(0x8b));//显示时间的星期模块}if(num1==1){ ALARM_KG();} //闹钟开关显示 break;case 2: m++; //秒加1if(m%16==10) m=(m&0xf0)+0x10;if(m==0x60) m=0;shi=m>>4;ge=m&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x94);break;case 3:f++; //分钟加1if(f%16==10) f=(f&0xf0)+0x10;if(f==0x60) f=0;shi=f>>4;ge=f&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x92);break;case 4:s++; //小时加1if(s%16==10) s=(s&0xf0)+0x10; if(s==0x24) s=0;shi=s>>4;ge=s&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x90);break;case 5:r++; //日期加1if(r%16==10) r=(r&0xf0)+0x10; if(r==0x32) r=1;shi=r>>4;ge=r&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x85);break;case 6:y++; //月份加1if(y%16==10) y=(y&0xf0)+0x10; if(y==0x13) y=1;shi=y>>4;ge=y&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x83);break;case 7:n++; //年份加1if(n%16==10) n=(n&0xf0)+0x10; if(n==0x99) n=1;shi=n>>4;ge=n&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x81);break;}}//减时间void TIME_DOWN(){switch(num2){case 1:x--; //星期减1if(x==0x00) x=7;if(num1==0){DS1302_WRITE(0x8e,0x00); DS1302_WRITE(0x8a,x);DS1302_WRITE(0x8e,0x80);DSweek(DS1302_READ(0x8b));}if(num1==1){ ALARM_KG();}break;case 2:m--; //秒减1if(m%16==15) m=(m&0xf0)+0x09; if(m==0xf9) m=0x59;shi=m>>4;ge=m&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x94);break;case 3:f--; //分钟减1if(f%16==15) f=(f&0xf0)+0x09; if(f==0xf9) f=0x59;shi=f>>4;ge=f&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x92);break;case 4:s--; //小时减1if(s%16==15) s=(s&0xf0)+0x09; if(s==0xf9) s=0x23;shi=s>>4;ge=s&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x90);break;case 5:r--; //日期减1if(r%16==15) r=(r&0xf0)+0x09; if(r==0xf9) r=0x31;shi=r>>4;ge=r&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x95);break;case 6:y--; //月份减1if(y%16==15) y=(y&0xf0)+0x09; if(y==0xf9) y=0x12;shi=y>>4;ge=y&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x93);break;case 7:n--; //年减1if(n%16==15) n=(n&0xf0)+0x09; if(n==0xf9) n=0x99;shi=n>>4;ge=n&0x0f;LCD_WRITE_DAT(0x30+shi);LCD_WRITE_DAT(0x30+ge);LCD_WRITE_COM(0x91);break;}}void main(){ CSH();LCD_CSH();DELAY(10);DS1302_CSH();DISL1(); //上电欢迎界面DELAY(10000);LCD_CLR(); //清屏LCD_GD(); //固定显示while(1){ KEYSCAN();if(num1==2){while(1){DISP_M();KEYSCAN_M();if(S1==0){DELAY(100);if(S1==0)break;}}}KEYMOVE();if(num1==0&&flag==0){DISP_TIME();DISP_T();if(DS1302_READ(0x83)==A_f&&DS1302_READ(0x85)==A_s&&DS1302_R EAD(0x81)==A_m&&A==1){ALARM_CLOCK();}}}}。

单片机课程设计报告(万年历)

单片机课程设计报告(万年历)

目录一、摘要 (2)二、设计任务 (4)三、总体方案设计与论证 (4)1、液晶显示模块 (4)2、实时时间计算模块 (5)3、实时环境温度采集模块 (5)4、报警模块 (6)5、设置模块 (6)四、总体方案组成框图 (7)五、系统硬件设计 (8)1、LCD显示模块 (8)2、实时时间计算模块 (12)3、实时环境温度检测模块 (16)4、报警模块 (21)5、设置模块 (22)六、系统软件设计 (23)七、系统硬件电路设计 (24)八、系统硬件PROTEUS仿真原理图 (25)九、系统硬件仿真运行情况图 (26)1、显示欢迎界面 (26)2、显示实时时间 (26)3、显示当前温度 (27)4、时间设置 (27)5、最高报警温度设置 (28)6、闹钟时间设置 (28)7、超温 (29)8、闹钟时间到 (29)附录一:实物图 (30)附录二:PCB图 (32)附录三:源程序代码 (33)附录四:参考文献 (62)摘要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。

本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒;实时监测环境温度(可根据需要启动高温报警功能);电子闹钟。

M bn本设计采用的是AT89S52单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。

计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。

温度检测采用DALLAS公司的数字化温度传感器,该芯片采用的是独特的“一线总线”的方式与单片机进行通信,一线总线独特而且经济的特点,是用户可以轻松的组建传感器网络,为测量系统的构建引入全新的概念。

单片机编程的万年历带仿真图

单片机编程的万年历带仿真图

#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code str1[]="2011-02-28 week7";uchar code str2[]="23:59:55 ";uchar code str3[]="0-22:00 ";uchar code str4[]="0-23:00 ";uchar c1=0,c2=0;//闹钟标志当c1=1或者c2=1时,闹钟才会响sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;bit s=0,d=1;// s是开光标标志位,d=0时切换到闹钟屏bit jia,jian;uchar code string[]={0x0c,0xc7,0xc4,0xc1,0x89,0x86,0x83,0x8f,0x80,0x83,0x86,0xc0,0xc3,0xc6};//光标位置调节uchar second=58,minute=59,hour=23,month=2,day=28,week=7,count=0;uchar minute1=0,hour1=22,minute2=0,hour2=23;//闹钟uchar t_symbol; //温度的符号位,为1表示负温,为0表示正温uint T;unsigned int year=2011; //0-65535int m=0;sbit key1=P2^3;//按键设置sbit key2=P2^4;//加按键sbit key3=P2^5;//减按键sbit key4=P2^6;//闹钟按键sbit key5=P2^7;//复位键sbit beep=P1^0;//蜂鸣器sbit DQ=P3^3;//温度引脚void delayms(){ uchar i;for(i=0;i<122;i++);void busy_check(){ P0=0xff;RS=0;RW=1;E=1;E=0;while(P0&0x80){E=0;E=1;}delayms();}void write_LCD_com(uchar cmd) {busy_check();E=0;RS=0;RW=0;E=1;P0=cmd;E=0;delayms();}void write_LCD_data(uchar dat){ busy_check();E=0;RS=1;RW=0;E=1;P0=dat;E=0;delayms();}void SET_LCD_pos(uchar x,uchar y) { if(y==0)write_LCD_com(0x80|x);if(y==1)write_LCD_com(0xc0|x);}void show_LCD(uchar *str){ uchar i;for(i=0;i<16;i++)write_LCD_data(str[i]);/****初始化LCD****/void init_LCD(){ write_LCD_com(0x01);write_LCD_com(0x38);write_LCD_com(0x0c);write_LCD_com(0x06);}void delay_18B20(unsigned int i)//延时1-255微秒{while(i--);}uchar ds1820rst() //ds1820复位{ unsigned char g=0;DQ=1; //DQ复位delay_18B20(8); //延时DQ=0; //发送复位脉冲delay_18B20(80); //延时大于480usDQ=1; //DQ拉高delay_18B20(8);g=DQ; //若g=0,则ds1820存在,否则不存在delay_18B20(20);return(g);}uchar ds1820_rd()//读数据{ unsigned char e=0;unsigned char dat = 0; //暂存读取的数据for (e=8;e>0;e--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ==1)dat|=0x80;delay_18B20(10);}return(dat); //返回读取的值}void ds1820wr(uchar wdate)//写数据{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdate&0x01; //低位在前delay_18B20(10);DQ = 1;wdate>>=1; //准备发送下一位}void read_temp() //读取温度值并转换{uchar a=0,b=0;ds1820rst(); //ds1820复位ds1820wr(0xcc); //跳过读序列号ds1820wr(0x44); //启动温度转换delay_18B20(150);ds1820rst(); //ds1820复位ds1820wr(0xcc); //跳过读序列号ds1820wr(0xbe); //读取温度delay_18B20(150);a=ds1820_rd(); //读出温度的低八位b=ds1820_rd(); //读出温度的高八位T=b;T<<=8;T=T|a;if(T<0x0fff) //比较温度t_symbol=0;else{T=~T+1; //负温度,取反加一t_symbol=1;}T=T*(0.625); //温度值扩大10倍返?位小数}void ds1820_show()//温度值显示{ uchar flagdat,T0,T1,T2;T0=T/100+'0';//十位数T1=T%100/10+'0';//个位数T2=T%10+'0';//小数位read_temp();if(t_symbol==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(T0==0x30){T0=0x20;} //如果十位为0,不显示}/****字符显示****/void zifushow1(){ uchar flagdat,T0,T1,T2;SET_LCD_pos(9,1);write_LCD_data(flagdat);//显示符号位SET_LCD_pos(10,1);write_LCD_data(T0); //显示十位SET_LCD_pos(11,1);write_LCD_data(T1); //显示个位SET_LCD_pos(12,1);write_LCD_data(0xa5); //显示小数点SET_LCD_pos(13,1);write_LCD_data(T2); //显示小数位SET_LCD_pos(15,1);write_LCD_data('C');SET_LCD_pos(14,1);write_LCD_data(0xdf);SET_LCD_pos(7,1);write_LCD_data(second%10+'0');SET_LCD_pos(6,1);write_LCD_data(second/10+'0');SET_LCD_pos(5,1);write_LCD_data(':');SET_LCD_pos(4,1);write_LCD_data(minute%10+'0');SET_LCD_pos(3,1);write_LCD_data(minute/10+'0');SET_LCD_pos(2,1);write_LCD_data(':');SET_LCD_pos(1,1);write_LCD_data(hour%10+'0');SET_LCD_pos(0,1);write_LCD_data(hour/10+'0');SET_LCD_pos(9,0);write_LCD_data(day%10+'0');SET_LCD_pos(8,0);write_LCD_data(day/10+'0');SET_LCD_pos(7,0);write_LCD_data('-');SET_LCD_pos(6,0);write_LCD_data(month%10+'0');SET_LCD_pos(5,0);write_LCD_data(month/10+'0');SET_LCD_pos(4,0);write_LCD_data('-');SET_LCD_pos(3,0);write_LCD_data(year%10+'0');SET_LCD_pos(2,0);write_LCD_data(year/10%10+'0');SET_LCD_pos(1,0);write_LCD_data(year/100%10+'0');SET_LCD_pos(0,0);SET_LCD_pos(11,0);write_LCD_data('w');SET_LCD_pos(12,0);write_LCD_data('e');SET_LCD_pos(13,0);write_LCD_data('e');SET_LCD_pos(14,0);write_LCD_data('k');SET_LCD_pos(15,0);write_LCD_data(week%8+'0');}/*******蜂鸣器*******/void speaker(){if(c1==1)if(hour1==hour&&minute1==minute) beep=!beep;if(c2==1)if(hour2==hour&&minute2==minute) beep=!beep;}/*******闹钟字符显示*******/void zifushow2(){SET_LCD_pos(0,0);write_LCD_data(c1+'0');SET_LCD_pos(1,0);write_LCD_data('-');SET_LCD_pos(2,0);write_LCD_data(hour1/10+'0');SET_LCD_pos(3,0);write_LCD_data(hour1%10+'0');SET_LCD_pos(4,0);write_LCD_data(':');SET_LCD_pos(5,0);write_LCD_data(minute1/10+'0');SET_LCD_pos(6,0);write_LCD_data(minute1%10+'0');SET_LCD_pos(0,1);write_LCD_data(c2+'0');SET_LCD_pos(1,1);write_LCD_data('-');SET_LCD_pos(2,1);SET_LCD_pos(3,1);write_LCD_data(hour2%10+'0');SET_LCD_pos(4,1);write_LCD_data(':');SET_LCD_pos(5,1);write_LCD_data(minute2/10+'0');SET_LCD_pos(6,1);write_LCD_data(minute2%10+'0');}/***时间和日期的行驶*****/void time_date(){ if(second==60){ second=0;minute++;}if(minute==60){ minute=0;hour++ ;}if(hour==24){ hour=0;day++;week++;}if(week==8){ week=1;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月份判断{ if(day==32){ month++;day=1;}}if(month==4||month==6||month==9||month==11)//小月份判断{ if(day==31){ day=1;month++; }}if(month==2)//闰年的月份判断{{if(year%400==0||(year%4==0&&year%100!=0)){if(day==30){day=1;month++;}}else{if(day==29){day=1;month++;}}}}if(month==13){year++;month=0;}}/****按键加****/void jiakey(){ key2=1;if(key2==0){delayms();if(key2==0);while(key2==0);{ switch(count){ case 1:second++;if(second==60){second=0;}jia=1;break;case 2:minute++;if(minute==60){minute=0;}jia=1;break;case 3:hour++;if(hour==24){hour=0;}jia=1;break;case 4:day++;week++;if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(day==32){day=1;}}if(month==4||month==6||month==9||month==11){if(day==31){day=1;}}if(month==2&&year%4==0&&day==30){;day=1;}if(month==2&&year%4!=0&&day==29){;day=1;}if(week==8){week=1;}jia=1;break;case 5:month++;if(month==13){month=1;}jia=1;break;case 6:year++;if(year==2100){year=2000;}jia=1;break;case 7:if(d==1){week++;if(week==8){week=1;}jia=1;}break;case 8:c1=!c1;jia=1;break;case 9:hour1++;if(hour1==24){hour1=0;}jia=1;break;case 10:minute1++;if(minute1==60){minute1=0;}jia=1;break;case 11:c2=!c2;jia=1;break;case 12:hour2++;if(hour2==24){hour2=0;}jia=1;break;case 13:minute2++;if(minute2==60){minute2=0;}jia=1;break;}}}}/****按键减****/void jiankey(){key3=1;if(key3==0){delayms();if(key3==0)while(key3==0);{switch(count){case 1:second--;if(second==-1){second=59;}jian=1;break;case 2:minute--;if(minute==-1){minute=59;}jian=1;break;case 3:hour--;if(hour==-1){hour=23;}jian=1;break;case 4:day--;week--;if(week==0){week=7;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(day==32||day==0){day=31;}}if(month==4||month==6||month==9||month==11){if(day>=31||day==0){day=30;}}if(month==2&&year%4==0&&day==0){day=29;}if(month==2&&year%4!=0&&day==0){day=28;}if(month==13||month==0){month=12;}jian=1;break;case 5:month--;if(month==13||month==0){month=12;}jian=1;break;case 6:year--;if(year==1999){year=2099;}jian=1;break;case 7:if(d==1){week--;if(week==0){week=7;}jian=1;}break;case 8:c1=!c1;jian=1;break;case 9:hour1--;if(hour1==-1){hour1=23;}jian=1;break;case 10:minute1--;if(minute1==-1){minute1=59;}jian=1;break;case 11:c2=!c2;jian=1;break;case 12:hour2--;if(hour2==-1){hour2=23;}jian=1;break;case 13:minute2--;if(minute2==-1){minute2=59;}jian=1;break;}}}}/*****闹钟调节按键***********/void clock_key(){key4=1;if(key4==0){ delayms();if(key4==0)while(key4==0);{ d=~d;init_LCD();if(d==1)count=0;if(d==0)count=8;}}}/*****暂停调节并运行按键******/void zantingkey(){ key5=1;if(key5==0){delayms();if(key5==0);while(key5==0);{ s=0;count=0;}}}/***按键的设置*******/void keyset(){key1=1;if(key1==0){delayms();if(key1==0)while(key1==0);{s=1;count=count+1;}}}/****光标的移动显示****/void guangbiao(){if(s==1){write_LCD_com(string[count]);write_LCD_com(0x0f);delayms();write_LCD_com(0x0c);delayms();}}/****按键的运行****/void keyrun(){keyset();jiakey();jiankey();clock_key();zantingkey();if(d==1&&count>=8)count=1;if(d==0&&count==14)count=8; guangbiao();if(jia==1||jian==1){ time_date();jia=0;jian=0;}}/*****主函数*************/void main(){ if(d==1){init_LCD();write_LCD_com(0x80);show_LCD(str1);write_LCD_com(0xc0);show_LCD(str2);}if(d==0){ init_LCD();write_LCD_com(0x80);show_LCD(str3);write_LCD_com(0xc0);show_LCD(str4);}TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;while(1){if(key1==0){TR0=0;}if(key5==0){TR0=1;}keyrun();time_date();speaker();if(d==1){zifushow1();}else{zifushow2();}read_temp();ds1820_show();}}void serve_0(void) interrupt 1 using 0 { TH0=0x3c;TL0=0xb0;m++;if(m==20){ second++;m=0;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//////////时间控制器/////////////////////////////////////////////***********************************************/ SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HYEAR EQU 35HAMIN EQU 36HAHOUR EQU 37HLEDMIN EQU 38HLEDHOUR EQU 39HS_SET BIT P1.0//秒的调整按键M_SET BIT P1.1//分的调整按键H_SET BIT P1.2//时的调整按键D_SET BIT P1.3//日的调整按键MONTH_SET BIT P1.4//月的调整按键Y_SET BIT P1.5//年的调整按键CLRR BIT P1.6//清0的按键TIME BIT P3.6//闹钟的按键LED BIT P3.7//LED的按键/***********************************************/ORG 0000HLJMP MAINORG 000BH//定时器0入口LJMP INT_T0//定时器中断程序ORG 0010H/***********************************************/ MAIN:MOV DPTR,#TABLEMOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV DAY,#1MOV MONTH,#1MOV YEAR,#0MOV AMIN,#0MOV AHOUR,#12MOV LEDMIN,#30MOV LEDHOUR,#6MOV R0,#0MOV TMOD,#01H //模式1MOV TH0,#3CH ; 设置初值(定时50毫秒)MOV TL0,#0B0HSETB TR0 ;启动定时SETB ET0SETB EA;***************************************************** ;判断是否有控制键按下A0:LCALL ALARM//比较当前时间与闹钟的时间//LCALL ALARM1 //整点报时LCALL LED_L //比较当前时间与设置的LED亮的时间LCALL DISPLAYJNB S_SET,S1 //按下就跳转JNB M_SET,S2 //按下就跳转JNB H_SET,S3 //按下就跳转JNB D_SET,S4 //按下就跳转JNB MONTH_SET,TIAO_S5 //按下就跳转JNB Y_SET,TIAO_S6 //按下就跳转JNB CLRR,TIAO_S7 //按下就跳转JNB TIME,TIAO_S8//按下就跳转JNB LED,TIAO_S9//按下就跳转LJMP A0TIAO_S5:LJMP S5TIAO_S6:LJMP S6TIAO_S7:LJMP S7TIAO_S8:LJMP S8TIAO_S9:LJMP S9//秒调整S1:LCALL DELAY ;去抖动JB S_SET,A0INC SEC ;秒值加1MOV A,SECCJNE A,#60,J0 ;判断是否加到60秒MOV SEC,#0LJMP J0;************************************ ;等待按键抬起J0:JB S_SET,A0LCALL DISPLAYLJMP J0//分调整S2:LCALL DELAY;去抖动JB M_SET,A0K1: INC MIN ;分钟值加1MOV A,MINCJNE A,#60,J1 ;判断是否加到60分MOV MIN,#0LJMP J1;************************************ ;等待按键抬起J1:JB M_SET,A0LCALL DISPLAYLJMP J1//时调整S3:LCALL DELAY;去抖动JB H_SET,A0K2: INC HOUR ;小时值加1MOV A,HOURCJNE A,#24,J2 ;判断是否加到24小时MOV HOUR,#0LJMP J2;************************************ ;等待按键抬起J2:JB H_SET,TIAO_A0LCALL DISPLAYLJMP J2TIAO_A0:LJMP A0//日调整S4:LCALL DELAY;去抖动JB D_SET,TIAO_A0K3: INC DAY ;日值加1MOV A,DAYCJNE A,#31,J3 ;判断是否加到30日MOV DAY,#1LJMP J3;************************************ ;等待按键抬起J3:JB D_SET,TIAO_A0LCALL DISPLAYLJMP J3//月调整S5:LCALL DELAY;去抖动JB MONTH_SET,TIAO_A0K4: INC MONTH ;月值加1MOV A,MONTHCJNE A,#13,J4 ;判断是否加到12月MOV MONTH,#1LJMP J4;************************************ ;等待按键抬起J4:JB MONTH_SET,TIAO_A0LCALL DISPLAYLJMP J4//年调整S6:LCALL DELAY;去抖动JB Y_SET,TIAO_A0K5: INC YEAR ;年值加1MOV A,YEARCJNE A,#100,J5 ;判断是否加到100年MOV YEAR,#0SJMP J5;************************************ ;等待按键抬起J5:JB Y_SET,TIAO_A0LCALL DISPLAYLJMP J5//清0S7:LCALL DELAY;去抖动JB CLRR,TIAO_A0MOV YEAR,#0MOV MONTH,#1MOV DAY,#1MOV HOUR,#0MOV MIN,#0MOV SEC,#0MOV AHOUR,#12MOV AMIN,#0MOV LEDHOUR,#6MOV LEDMIN,#30LJMP J6;************************************ ;等待按键抬起J6://JB CLRR,A0JB CLRR,TIAO_A0LCALL DISPLAYLJMP J6TIAO_A00:LJMP A0TIAO_S812:LJMP S8////////////////////////闹钟按键调整/////////////////S8:JB TIME,TIAO_A00JNB M_SET,S81 //按下就跳转JNB H_SET,S82 //按下就跳转LCALL TIME_DISPLAY//闹钟分调整S81:LCALL DELAY;去抖动JB M_SET,TIAO_S812K71:INC AMIN ;闹钟分钟值加1MOV A,AMINCJNE A,#60,J71 ;判断是否加到60分MOV AMIN,#0LJMP J71;************************************ ;等待按键抬起J71:JB M_SET,TIAO_S812LCALL TIME_DISPLAYLJMP J71//闹钟时调整S82:LCALL DELAY;去抖动JB H_SET,TIAO_S812K72: INC AHOUR ;闹钟小时值加1MOV A,AHOURCJNE A,#24,J72 ;判断是否加到24小时MOV AHOUR,#0LJMP J72;************************************ ;等待按键抬起J72:JB H_SET,TIAO_S812LCALL TIME_DISPLAYLJMP J72TIAO_A000:LJMP A0TIAO_S912:LJMP S9////////////////////////LED按键调整//////////////////////S9:JB LED,TIAO_A000JNB M_SET,S91 //按下就跳转JNB H_SET,S92 //按下就跳转LCALL LED_DISPLAY//LED分调整S91:LCALL DELAY;去抖动JB M_SET,TIAO_S912K81:INC LEDMIN ;LED分钟值加1MOV A,LEDMINCJNE A,#60,J81 ;判断是否加到60分MOV LEDMIN,#0LJMP J81;************************************ ;等待按键抬起J81:JB M_SET,TIAO_S912LCALL LED_DISPLAYLJMP J81//LED时调整S92:LCALL DELAY;去抖动JB H_SET,TIAO_S912K82: INC LEDHOUR ;LED小时值加1MOV A,LEDHOURCJNE A,#24,J82 ;判断是否加到24小时MOV LEDHOUR,#0LJMP J82;************************************ ;等待按键抬起J82:JB H_SET,TIAO_S912LCALL LED_DISPLAYLJMP J82/******************闹钟*************************************/ ALARM:JNB TIME,ALARM_CLOSEMOV A,HOUR ;比较小时CJNE A,37H,TIAO_RET ;不等返回。

相等,转分钟比较MOV A,MIN ;比较分钟CJNE A,36H,TIAO_RETLCALL TIME_DISPLAYCLR P1.7//打开扬声器LCALL DELAYSETB P1.7LJMP ALARMTIAO_RET:RETALARM_CLOSE:LCALL DISPLAYMOV A,MIN ;比较分钟CJNE A,36H,TIAO_A000LJMP ALARM_CLOSE/******************整点报时*************************************//*ALARM1:JNB TIME,ALARM1_CLOSEMOV A,MIN ;比较分钟CJNE A,#0,TIAO_RETLCALL DISPLAYCLR P1.7//打开扬声器LCALL DELAYSETB P1.7LJMP ALARM1*/ALARM1_CLOSE:LCALL DISPLAYMOV A,MIN ;比较分钟CJNE A,#0,TIAO_A0000LJMP ALARM1_CLOSETIAO_A0000:LJMP A0/******************LED亮*************************************/ LED_L://L:亮JNB LED,LED_CLOSEMOV A,HOUR ;比较小时CJNE A,39H,TIAO_RET ;不等返回。

相关文档
最新文档