基于51单片机的万年历与温度检测报警系统

合集下载

基于单片机的万年历与温度检测报警系统的程序

基于单片机的万年历与温度检测报警系统的程序

#include<reg52.h>#include<math.h>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int//各个IO口的初始化sbit dscs=P2^0;sbit dsas=P2^1;sbit dsrw=P2^2;sbit dsds=P2^3;sbit irq=P3^2;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit s4=P3^3;sbit beep=P1^0; sbit beep1=P1^1;sbit rs=P2^4;sbit rw=P2^5;sbit e=P2^6;sbit DQ=P1^7; int i,tt=0;uchar table0[]={"WELCOME !"};uchar table1[]={"HAVE A NICE DAY!"};uchar table2[]={"SET ALARM"};int miao,fen,shi,nian,yue,ri,week,s1num=0,num=0,num2=1,flag,flag_di,flag1,amiao,afen,ashi;uchar flag_get,num1,TZ=0;TX=0;keyxuan=1;uchar baiwei,shiwei,gewei,shifen,baifen,qianfen,wanfen;uint wd;void write_temperture(uchar TZ,uchar TX);void ReadTemperature();void DS18B20();unsigned char ReadOneChar();void WriteOneChar(unsigned char dat);void ddelay(unsigned int i);void dididi();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//液晶写数据与命令函数void write_com(uchar com){rs=0;rw=0;e=0;P0=com;delay(5);e=1;delay(5);e=0;}void write_date(uchar date){rs=1;rw=0;e=0;P0=date;delay(5);e=1;delay(5);e=0;}void init(){rw=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); write_com(0x80);EA=1;EX0=1;IT0=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;flag1=0;flag=0;flag_di=1;}DS12C887//读写数据与地址命令void write_ds(uchar add,uchar date){dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add){uchards_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date; }void write_sfm(uchar add,uchar date)显示时分秒函数{ucharshi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x3 0+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date)显示年月日函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void didi()//闹钟报警程序{beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;}void dididi()//温度报警程序{beep1=0;delay(150);beep1=1;delay(150);beep1=0;delay(150);beep1=1;} void init_ds12c887()//DS12C887的初始化{write_ds(0x0a,0x20);write_ds(0x0b,0x26);}void read_alarm()//读取闹钟寄存器地址到相应的变量中{amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);}void set_alarm(ashi,afen,amiao)//设置闹钟{write_ds(1,amiao);write_ds(3,afen);write_ds(5,ashi);}void showsign()//显示其他字符{ write_com(0x80);write_date('2');write_com(0x80+1);write_date('0'); write_com(0x80+4);write_date('-');write_com(0x80+7);write_date('-'); write_com(0x80+0x40+2);write_date(':');write_com(0x80+0x40+5);write_date(':');}void show_week()//显示星期函数{switch(week){case 1:write_com(0x80+11);write_date('M');write_date('O');write_date('N');write_date('D');write_date('A');break;case 2:write_com(0x80+11);write_date('T');write_date('U');write_date('E');write_date('S');write_date('D');break;case 3:write_com(0x80+11);write_date('W');write_date('E');write_date('N');write_date('D');write_date('N');break;case 4:write_com(0x80+11);write_date('T');write_date('H');write_date('U');write_date('R');write_date('S');break;case 5:write_com(0x80+11);write_date('F');write_date('R');write_date('I');write_date('D');write_date('A');break;case 6:write_com(0x80+11);write_date('S');write_date('A');write_date('T');write_date('T');write_date('U');break;case 7:write_com(0x80+11);write_date('S');write_date('U'); write_date('N');write_date('D');write_date('A');break;}}void keyscan()//键盘扫描{if(s1==0){delay(4);if(s1==0){s1num++;if(flag1==1){if(s1num==8){s1num=1;}}keyxuan=0; flag=1;// 温度扫描和时钟显示标志位设为无效while(!s1);switch(s1num)//选择液晶光标位置{case 1:write_com(0x80+0x40+7);write_com(0x0f);break;case 2:write_com(0x80+0x40+4);write_com(0x0f);break;case 3:write_com(0x80+0x40+1);write_com(0x0f);break;case 4:write_com(0x80+15);write_com(0x0f);break;case 5:write_com(0x80+9);write_com(0x0f);break;case 6:write_com(0x80+6);write_com(0x0f);break;case 7:write_com(0x80+3);write_com(0x0f);break;case 8:write_ds(0x00,miao);delay(5);//最后一次将修改后的数据读取到相应的寄存器中write_ds(0x02,fen);delay(5);write_ds(0x04,shi);delay(5);write_ds(0x06,week);delay(5);write_ds(0x07,ri);delay(5);write_ds(0x08,yue);delay(5);write_ds(0x09,nian);delay(5);flag=0;keyxuan=1;write_com(0x0c);s1num=0;break;}}}//在推出键盘扫描程序前将相应标志位设置为有效,并发出清屏命令if(s1num!=0){if(s2==0){delay(4);if(s2==0){while(!s2);switch(s1num){case 1:miao++;if(miao==60)miao=0;write_sfm(6,miao);write_com(0x80+0x40+7);break;case 2:fen++;if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+4);break;case 3:shi++;if(shi==24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+1);break;case 4:week++;if(week==8)week=1;show_week();break;case 5:ri++;if(ri==32)ri=1;write_nyr(8,ri);write_com(0x80+9);break;case 6:yue++;if(yue==13)yue=1;write_nyr(5,yue);write_com(0x80+6);break;case 7:nian++;if(nian==100)nian=0;write_nyr(2,nian);write_com(0x80+3);break;}}}}if(s1num!=0){if(s3==0){delay(4);if(s3==0){while(!s3);switch(s1num){case 1:miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+7);break;case 2:fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+4);break;case3:shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+1);break;case 4:week--;if(week==0)week=7;show_week();break;case 5:ri--;if(ri==-1)ri=31;write_nyr(8,ri);write_com(0x80+9);break; case 6:yue--;if(yue==0)yue=12;write_nyr(5,yue);write_com(0x80+6);break;case7:nian--;if(nian==-1)nian=99;write_nyr(2,nian);write_com(0x80+3); break;}}}}if(s1num!=0){if(s4==0){delay(4);if(s4==0)//进入闹钟设置程序{num++;while(!s4);keyxuan=0;if(num==1){flag1=1;write_com(0x80);for(i=0;i<16;i++){write_date(' ');delay(5);}write_com(0x0f);write_com(0x80+3);for(i=0;i<10;i++){write_date(table2[i]);delay(2);} read_alarm();miao=amiao;fen=afen;shi=ashi;write_sfm(0,ashi);write_com(0x80+0x40+1);write_sfm(3,afen);write_com(0x80+0x40+4);write_sfm(6,amiao);write_com(0x80+0x40+7);}if(num==2){num=0;s1num=0;write_com(0x80+3);for(i=0;i<10;i++){write_date(' ');delay(5);}amiao=miao;afen=fen;ashi=shi;set_alarm(ashi,afen,amiao);flag=0;flag1=0;write_com(0x0c);keyxuan=1;}}}}}//推出闹钟设置程序,将修改后的数据读取到相应寄存器中,并将相应标志位设置为有效,发出清屏命令。

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

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

洛阳理工学院课程设计报告课程名称单片机原理与应用设计题目基于STC89C51万年历得设计与实现专业物联网工程班级学号姓名完成日期大约在冬季目录摘要 (1)一、设计目标与内容 (2)1、1设计目标 (2)1、2 设计内容 (2)1、3设计要求 (2)1、4 本章小结 (2)二、系统设计 (3)2、1 电路设计框图 (3)2、2 系统硬件概述 (3)2、3 主要单元电路得设计 (4)2、3、1 时钟电路模块得设计 (4)2、3、2温度传感器电路设计 (5)2、3、3显示模块得设计 (7)2、4本章小结 (7)三、系统得软件设计 (7)3、1程序流程图 (7)3、1、1 系统总流程图 (7)3、1、2 温度程序流程图 (8)3、1、3 DS1302时钟程序流程图 (8)3、1、4 LCD显示程序流程图 (9)3、2程序得设计 (10)3、2、1 DS18B20测温程序 (10)3、2、2 DS1302读写程序 (11)3、2、3液晶显示程序 (13)3、3本章小结 (13)四、仿真与调试 (14)4、1 Keil软件调试流程 (14)4、2 Proteus软件运行流程 (16)4、3本章小结 (16)总结 (16)基于STC89C51万年历得设计与实现摘要古人依靠日冕、漏刻记录时间,而随着科技得发展,电子万年历已经成为日渐流行得日常计时工具。

本文研究得万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、DS18B20采集温度、1602液晶屏显示。

系统主要由温度传感器电路,单片机控制电路,显示电路以及校正电路四个模块组成。

本文阐述了系统得硬件工作原理,所应用得各个接口模块得功能以及其工作过程,论证了设计方案理论得可行性。

系统程序采用C语言编写,经Keil软件进行调试后在Proteus软件中进行仿真,可以显示年、月、日、星期、时、分、秒与温度并具有校准功能与与即时时间同步得功能。

实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表得发展趋势,具有广阔得市场前景。

基于51单片机GPS自动校时的万年历设计方案

基于51单片机GPS自动校时的万年历设计方案

3 硬件设计
HARDWARE DESIGN
3.1 系统概述
本系统由51单片机、DS1302时钟芯片、1062液晶显示器、DS18B20温度测量、键盘、蜂鸣器 系统等部分构成。软件部分在keil环境下用C51语言编写,包括时间设置、时间显示、定时设置、 定时闹钟、温度显示。原理框图如下:
3.2 系统框图
蜂鸣器设置:蜂鸣器报警时,设置响100毫秒,停100毫秒,循环响应,产生滴滴的声音。
液晶显示的设置:写入指令码write_com(0x38),设置功能16*2显示,5*7点阵,8位数据接口显 示/开关及光标设置8)写入指令码write_com(0x0c),设置开显示,不显示光标,光标不闪烁。 16)写入指令码write_com(0x06),设置当读或写一个字符后地址指针加一,且光标加一。当写 一个字符,整屏显示不移动。显示清屏,写入指令码write_com(0x01)。
写入指令码函数write_com()写指令过程 :输入:rs=0,D0-D7=指令码,E=高脉冲写入数据 函数 write_date() 写指令过程: 输入:rs=1,D0-D7=数据,E=高脉冲写入指令和数据时rw 端已经接地。数据指针设置 指令码80H+地址码(0-27H)显示第一行的字符指令码80H+地址码 (40H-67H)显示的第二行字符
本时钟还具有环保、走时无噪音、低功耗等非实时时钟不具有的功能。该实时时钟不但可以作 为家用,而且更可以在公共场合使用,如车站、码头、商场等场所。
2 总体方案
GENERAL PLANNING
本方案所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容
包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功 耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。

基于51单片机的温度报警和万年历

基于51单片机的温度报警和万年历
uchar code table2[]={" : : "};
uchar num,miao,a,fen,shi,tt,date,s1sum,nian,yue,ri,week,i,temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
while(i--);
}
}
void ds18b20changtemp() //转换温度
{
ds18b20init();
delay1ms(1);
ds18b20write(0xcc); //跳过rom操作
ds18b20write(0x44); //温度转换命令
}
/*
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char ds18b20init()
{
unsigned int i;
ds=0; //总线拉低480us-960us
i=70;
while(i--); //延时642us
ds=1; //然后拉高总线,ds18b20做出反应会在15——60us后总线拉高
i=0;
while(ds)
{
i++;
ye1602init();
if(temp<0)
{
writecom(0x80+0x40+11);
writedate('-');

基于51单片机的温湿度及万年历设计概要

基于51单片机的温湿度及万年历设计概要

仪器设计实验课程设计名称:基于51单片机的温湿度及万年历设计专业班级: xxxxx学生姓名:xxx学号: xxxxxxxxx组员:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx指导教师: xxxxxxx 课程设计地点: xxxxxxxxx 课程设计时间: xxxxxxxxxxxxxxxxx目录1 系统概述 (1)1.1 电子万年历发展背景 (1)1.2 电子万年历的特点 (1)1.3 电子万年历的发展现状 (1)2 方案论证 (2)2.1 单片机芯片的选择方案和论证 (2)2.2 显示模块的选择方案和论证 (2)2.3 时钟芯片的选择方案和论证 (3)2.4 温湿度传感器的选择方案和论证 (4)3硬件设计 (5)3.1 系统功能模块划分 (5)3.2 各单元模块功能分析及模块电路设计 (6)3.2.1 时钟模块 (6)3.2.2 温湿度模块 (7)3.2.3 显示模块 (8)3.2.4 独立键盘模块 (13)4 软件设计 (14)4.1 万年历软件系统的流程图 (14)4.2 温湿度信息的采集 (16)4.3 时钟的读取 (17)4.3.1 DS1302控制字节的说明 (17)4.3.2 DS1302时间日期寄存器及相应位定义 (18)4.3.3 DS1302数据的输入和输出 (18)4.4 温度的显示控制 (19)5 系统调试 (20)1 系统概述1.1 电子万年历发展背景随着电子技术的发展,人类不断研究,不断创新纪录。

万年历目前已经不再局限于以书本形式出现。

以电脑软件或者电子产品形式出现的万年历被称为电子万年历。

与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用,采用电子时钟作为时间显示已经成为一种时尚。

目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求。

1.2 电子万年历的特点电子万年历显示功能,包括公历年、月、日,时间、温度、湿度、星期、农历等等;附带功能有:定时闹铃、以及按钮是否可以正常调动。

基于51单片机控制的语音报时万年历

基于51单片机控制的语音报时万年历

基于51单片机控制的语音报时万年历-----20/11/2013 SDU(WH)一.实验要求运用单片机及相关外设实现以下功能:1)万年历及时钟显示2)时间日期可调3)可对时间进行整点报时和随机报时二.方案分析根据实验要求,选用STC公司的8051系列,STC12C5A16S2增强型51单片机。

此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款。

实验中,对日期和时间进行显示,显示的字符数较多,故选用12864LCD屏幕。

该屏幕操作较为便捷,外围电路相对简单,实用性较强。

为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。

一方面,单片机的I/O口较为充足;另一方面,按键较多,选择的余地较大,方便编程控制。

实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片。

实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。

且上电默认时间为2014-01-01 09:00:00 之后需要手动调整为正确时间。

要求中的语音报时功能,这里选用ISD1760芯片的模块来帮助实现。

此模块通过软件模拟SPI协议控制。

先将所需要的声音片段录入芯片的EEPROM区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。

三.电路硬件设计实际效果图四.程序代码部分Main.h#ifndef _MAIN_H#define _MAIN_H#include "reg52.h"#include "INTRINS.H"#include "math.h"#include "string.h"#include "key.h"#include "led.h"#include "12864.h"#include "main.h"#include "isd1700.h"#include "sound.h"extern unsigned int count;extern unsigned int key_time[8]; extern unsigned char key_new; extern unsigned char key_old; extern unsigned char stop_flag; extern unsigned char key_follow[8]; extern unsigned int key_num[8];sbit BEEP=P3^7;sbit ISD_SS=P0^7;sbit ISD_MISO=P0^4;sbit ISD_MOSI=P0^5;sbit ISD_SCLK=P0^6;extern unsigned char date_show[]; extern unsigned char time_show[]; extern unsigned char sec;extern unsigned char min;extern unsigned char hour;extern unsigned char day;extern unsigned char month;extern unsigned char year_f;extern unsigned char year_l;extern unsigned char leap_year_flag; extern unsigned char update_flag; extern unsigned char adjust_flag; extern unsigned char key;unsigned char report();#endifMain.c#include "main.h"unsigned int count=0;unsigned int key_num[8]=0;unsigned char key_new=0;unsigned char key_old=0;unsigned char stop_flag=0;unsigned char key_follow[8]=0; unsigned char sec=1;unsigned char min=0;unsigned char hour=9;unsigned char day=1;unsigned char month=1;unsigned char year_f=20;unsigned char year_l=14;unsigned char leap_year_flag=0; unsigned char date_show[]="2014-01-01"; unsigned char time_show[]="09:00:00"; unsigned char update_flag=1;unsigned char key=0;unsigned char adjust_flag=0;unsigned char adjust_pos=0;unsigned char report_flag=0;void main(){unsigned char i;P2=0XFF;BEEP=0;init();initinal(); //调用LCD字库初始化程序TMOD=0x01; //使用定时器T0TH0=(65536-1000)/256; //定时器高八位赋初值TL0=(65536-1000)%256; //定时器低八位赋初值 */ EA=1; //开中断总允许ET0=1; //允许T0中断TR0=1; //启动定时器T0while(1){if(update_flag){lcd_pos(1,0);for(i=0;i<10;i++)write_dat(date_show[i]);lcd_pos(2,4);for(i=0;i<8;i++)write_dat(time_show[i]);update_flag=0;}if(key!=keyscan_nor()){key=keyscan_nor();if(key==8&&!adjust_flag)adjust_flag=1;if(key&&adjust_flag){if(key==1){adjust_pos++;if(adjust_pos==14)adjust_pos=0;}else if(key==2){if(!adjust_pos)adjust_pos=13;elseadjust_pos--;}else if(key==6){if(!adjust_pos)sec++;else if(adjust_pos==1)sec=sec+10;else if(adjust_pos==2)min++;else if(adjust_pos==3)min=min+10;else if(adjust_pos==4)hour++;else if(adjust_pos==5)hour=hour+10;else if(adjust_pos==6)day++;else if(adjust_pos==7)day=day+10;else if(adjust_pos==8)month++;else if(adjust_pos==9)month=month+10;else if(adjust_pos==10)year_l++;else if(adjust_pos==11)year_l=year_l+10;else if(adjust_pos==12)year_f++;else if(adjust_pos==13)year_f=year_f+10; }else if(key==7){if(!adjust_pos)sec--;else if(adjust_pos==1)sec=sec-10;else if(adjust_pos==2)min--;else if(adjust_pos==3)min=min-10;else if(adjust_pos==4)hour--;else if(adjust_pos==5)hour=hour-10;else if(adjust_pos==6)day--;else if(adjust_pos==7)day=day-10;else if(adjust_pos==8)month--;else if(adjust_pos==9)month=month-10;else if(adjust_pos==10)year_l--;else if(adjust_pos==11)year_l=year_l-10;else if(adjust_pos==12)year_f--;else if(adjust_pos==13)year_f=year_f-10;}else if(key==3)adjust_flag=0;if(key==6||key==7){if(sec>=80)sec=0;if(min>=80)min=0;if(hour>=40)hour=0;if(month>30)month=1;if(day>50)day=0;if(year_f>=120)year_f=0;if(year_l>=120)year_l=0;}}}if(key==3)report_flag=1;if(report_flag){clrram();Dingwei(2,1);lcd_mesg("REPORTING!!!");report();clrram();}}}void time0() interrupt 1{static unsigned char timer=0;TH0=(65536-50000)/256; //定时器高八位赋初值TL0=(65536-50000)%256; //定时器低八位赋初值timer++;if(timer==20){sec++;time_show[6]=sec/10+48;time_show[7]=sec%10+48;if(sec>=60){sec=0;min++;time_show[6]=sec/10+48;time_show[7]=sec%10+48;time_show[3]=min/10+48;time_show[4]=min%10+48;}if(min>=60){min=0;hour++;time_show[3]=min/10+48;time_show[4]=min%10+48;time_show[0]=hour/10+48;time_show[1]=hour%10+48;}if(hour>=24){hour=0;day++;time_show[0]=hour/10+48;time_show[1]=hour%10+48;date_show[8]=day/10+48;date_show[9]=day%10+48;}if((day>=29&&!leap_year_flag&&month==2)||(day==30&&leap_year_flag&&month==2 )||(day==31&&(month==4||month==6||month==9||month==11))||(month==32)){day=1;month++;date_show[8]=day/10+48;date_show[9]=day%10+48;date_show[5]=month/10+48;date_show[6]=month%10+48;}if(month>=13){month=1;year_l++;date_show[5]=month/10+48;date_show[6]=month%10+48;date_show[0]=year_f/10+48;date_show[1]=year_f%10+48;date_show[2]=year_l/10+48;date_show[3]=year_l%10+48;}if(year_l>=100){year_l=0;year_f++;if(((!((year_f*100+year_l)%4))&&((year_f*100+year_l)%100))||(!((year_f*100+ year_l)%400)))leap_year_flag=1;elseleap_year_flag=0;date_show[0]=year_f/10+48;date_show[1]=year_f%10+48;date_show[2]=year_l/10+48;date_show[3]=year_l%10+48;}timer=0;update_flag=1;if(adjust_flag){time_show[7]=sec%10+48;time_show[6]=sec/10+48;time_show[4]=min%10+48;time_show[3]=min/10+48;time_show[1]=hour%10+48;time_show[0]=hour/10+48;date_show[9]=day%10+48;date_show[8]=day/10+48;date_show[6]=month%10+48;date_show[5]=month/10+48;date_show[3]=year_l%10+48;date_show[2]=year_l/10+48;date_show[1]=year_f%10+48;date_show[0]=year_f/10+48;}}if(adjust_flag&&timer==10){if(!adjust_pos)time_show[7]=' ';else if(adjust_pos==1)time_show[6]=' ';else if(adjust_pos==2)time_show[4]=' ';else if(adjust_pos==3)time_show[3]=' ';else if(adjust_pos==4)time_show[1]=' ';else if(adjust_pos==5)time_show[0]=' ';else if(adjust_pos==6)date_show[9]=' ';else if(adjust_pos==7)date_show[8]=' ';else if(adjust_pos==8)date_show[6]=' ';else if(adjust_pos==9)date_show[5]=' ';else if(adjust_pos==10)date_show[3]=' ';else if(adjust_pos==11)date_show[2]=' ';else if(adjust_pos==12)date_show[1]=' ';else if(adjust_pos==13)date_show[0]=' ';update_flag=1;}if(!min&&!sec&&!adjust_flag)report_flag=1;}unsigned char report(){PlaySoundTick(11);long_delay();if(!min){if(hour<=10){PlaySoundTick(hour);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour>10&&hour<20){PlaySoundTick(10);short_delay();PlaySoundTick(hour-10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour==20){PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();else{PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(hour-20);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}}else{if(hour<=10){PlaySoundTick(hour);short_delay();PlaySoundTick(12);short_delay();}else if(hour>10&&hour<20){PlaySoundTick(10);short_delay();PlaySoundTick(hour-10);short_delay();PlaySoundTick(12);short_delay();}else if(hour==20){PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(12);short_delay();}elsePlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(hour-20);short_delay();PlaySoundTick(12);short_delay();}if(min<=10){PlaySoundTick(min);short_delay();PlaySoundTick(13);short_delay();}else if(min>10&&min%10){PlaySoundTick(min/10);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(min-10*(min/10));short_delay();PlaySoundTick(13);short_delay();}else{PlaySoundTick(min/10);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(13);short_delay();}}report_flag=0;time_show[7]=sec%10+48;time_show[6]=sec/10+48;time_show[4]=min%10+48;time_show[3]=min/10+48;time_show[1]=hour%10+48;time_show[0]=hour/10+48;date_show[9]=day%10+48;date_show[8]=day/10+48;date_show[6]=month%10+48;date_show[5]=month/10+48;date_show[3]=year_l%10+48;date_show[2]=year_l/10+48;date_show[1]=year_f%10+48;date_show[0]=year_f/10+48;return 0;}Isd1700.h#ifndef _ISD1760_H#define _ISD1760_H#include "main.h"#define ISD1700_PU 0x01 #define ISD1700_STOP 0X02 #define ISD1700_REST 0x03 #define ISD1700_CLR_INT 0x04 #define ISD1700_RD_STAUS 0x05 #define ISD1700_RD_PLAY_PTR 0x06 #define ISD1700_PD 0x07 #define ISD1700_RD_REC_PTR 0x08 #define ISD1700_DEVID 0x09#define ISD1700_PLAY 0x40 #define ISD1700_REC 0x41 #define ISD1700_ERASE 0x42 #define ISD1700_G_ERASE 0x43 #define ISD1700_RD_APC 0x44 #define ISD1700_WR_APC1 0x45 #define ISD1700_WR_APC2 0x65#define ISD1700_WR_NVCFG 0x46 #define ISD1700_LD_NVCFG 0x47 #define ISD1700_FWD 0x48 #define ISD1700_CHK_MEM 0x49 #define ISD1700_EXTCLK 0x4A #define ISD1700_SET_PLAY 0x80 #define ISD1700_SET_REC 0x81#define ISD1700_SET_ERASE 0x82#define NULL 0x00#define ISD_LED 0x10extern unsigned char data ISD_COMM_RAM_C[7];extern void init(void);extern void delay_isd(int x);extern void comm_sate(void);extern void rest_isd_comm_ptr(void);extern unsigned char T_R_comm_byte(unsigned char comm_data );extern void isd1700_par2_comm(unsigned char comm_par, unsigned int data_par); extern void isd1700_Npar_comm(unsigned char comm_par,comm_byte_count);extern void isd1700_7byte_comm(unsigned char comm_par, unsigned int star_addr, unsigned int end_addr);extern void spi_pu (void);extern void spi_stop (void);extern void spi_Rest ( void );extern void spi_CLR_INT(void);extern void spi_RD_STAUS(void);extern void spi_RD_play_ptr(void);extern void spi_pd(void);extern void spi_RD_rec_ptr(void);extern void spi_devid(void);extern void spi_play(void);extern void spi_rec (void);extern void spi_erase (void);extern void spi_G_ERASE (void);extern void spi_rd_apc(void);extern void spi_wr_apc1 (void);extern void spi_wr_apc2 (void);extern void spi_wr_nvcfg (void);extern void spi_ld_nvcfg (void);extern void spi_fwd (void);extern void spi_chk_mem(void);extern void spi_CurrRowAddr(void);extern void seril_back_sate(unsigned char byte_number);extern void spi_set_opt(unsigned char spi_set_comm);void init(void);#endifIsd1700.c//#pragma src#include "isd1700.h"#include "sound.h"#define uchar unsigned char#define uint unsigned intsbit DAC_sync=P2^0;sbit DAC_sclk=P2^1;sbit DAC_din =P2^2;bit re_fig;uchar data comm_temp;uchar data ISD_COMM_RAM[7];uchar data ISD_COMM_RAM_C[7];uchar data *isd_comm_ptr;uchar data *back_data_ptr;void init(void);void isd_delay(int x);void comm_sate(void);void rest_isd_comm_ptr(void);uchar T_R_comm_byte( uchar comm_data );void isd1700_par2_comm(uchar comm_par, uint data_par);void isd1700_Npar_comm(uchar comm_par,comm_byte_count); //no parameter comm void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr);void spi_pu (void);void spi_stop (void);void spi_Rest ( void );void spi_CLR_INT(void);void spi_RD_STAUS(void);void spi_RD_play_ptr(void);void spi_pd(void);void spi_RD_rec_ptr(void);void spi_devid(void);void spi_play(void);void spi_rec (void);void spi_erase (void);void spi_G_ERASE (void);void spi_rd_apc(void);void spi_wr_apc1 (void);void spi_wr_apc2 (void);void spi_wr_nvcfg (void);void spi_ld_nvcfg (void);void spi_fwd (void);void spi_chk_mem(void);void spi_CurrRowAddr(void);void seril_back_sate(uchar byte_number); void spi_set_opt(uchar spi_set_comm);void comm_sate(void){uchar sate_temp;uint apc_temp;if(RI){ sate_temp=SBUF;if(sate_temp==0x09){ spi_devid();}if(sate_temp==0x44){spi_rd_apc();}if(sate_temp==0x40){spi_play();}if(sate_temp==0x04){spi_CLR_INT();}if(sate_temp==0x05){spi_RD_STAUS();}if(sate_temp==0x43){ spi_G_ERASE();}if(sate_temp==0x01){ spi_pu ();}if(sate_temp==0x02){ spi_stop();}if(sate_temp==0x03){ spi_Rest ();}if(sate_temp==0x06){spi_RD_play_ptr();}if(sate_temp==0x07){spi_pd();}if(sate_temp==0x08){ spi_RD_rec_ptr();}if(sate_temp==0x41){ spi_rec();}if(sate_temp==0x42){ spi_erase();}if(sate_temp==0x45){spi_wr_apc1 ();}if(sate_temp==0x65){ spi_wr_apc2 ();}if(sate_temp==0x46){ spi_wr_nvcfg ();}if(sate_temp==0x47){ spi_ld_nvcfg ();}if(sate_temp==0x48){ spi_fwd ();}if(sate_temp==0x49){ spi_chk_mem();}if(sate_temp==0x60){ spi_CurrRowAddr();} if(sate_temp==0x80){spi_set_opt(ISD1700_SET_PLAY|ISD_LED);//spi_set_opt(ISD1700_SET_PLAY);}if(sate_temp==0x81){spi_set_opt(ISD1700_SET_REC|ISD_LED);//spi_set_opt(ISD1700_SET_REC);ISD_COMM_RAM_C[0]=ISD1700_SET_REC ;seril_back_sate(1);}if(sate_temp==0x82){spi_set_opt(ISD1700_SET_ERASE|ISD_LED);//spi_set_opt(ISD1700_SET_ERASE);}if(sate_temp==ISD1700_WR_APC2){RI=0;while(!RI);apc_temp=SBUF;apc_temp=apc_temp<<8;RI=0;while(!RI);apc_temp|=SBUF;RI=0;ISD_SS=0;isd1700_par2_comm(ISD1700_WR_APC2,apc_temp); ISD_SS=1;}RI=0;}if(re_fig){rest_isd_comm_ptr();sate_temp=0;do{SBUF=*back_data_ptr++;while(!TI);TI=0;}while(++sate_temp<=2);re_fig=0;}}void spi_set_opt(uchar spi_set_comm){uint start_addr,end_addr;RI=0;while(!RI);start_addr=SBUF;start_addr=start_addr<<8;RI=0;while(!RI);start_addr|=SBUF;RI=0;while(!RI);end_addr=SBUF;end_addr=start_addr<<8;RI=0;while(!RI);end_addr|=SBUF;RI=0;ISD_SS=0;isd1700_7byte_comm(spi_set_comm, start_addr, end_addr); ISD_SS=1;}void spi_pu (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PU,2);ISD_SS=1;}void spi_stop (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_STOP,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_STOP ;seril_back_sate(1);}void spi_Rest (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REST,2);ISD_SS=1;}void spi_CLR_INT(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CLR_INT,2);ISD_SS=1;}void spi_RD_STAUS(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];//j=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0];ISD_COMM_RAM_C[0]=i;seril_back_sate(3);}void spi_CurrRowAddr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0]>>5|ISD_COMM_RAM_C[1]<<3; ISD_COMM_RAM_C[0]= i >>5;seril_back_sate(3);}void spi_RD_play_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_PLAY_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_pd(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PD,2);ISD_SS=1;}void spi_RD_rec_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_REC_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_devid(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_DEVID,3);ISD_SS=1;ISD_COMM_RAM_C[2]=ISD_COMM_RAM_C[2]&0xf8;seril_back_sate(3);}void spi_play(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PLAY|ISD_LED,2);ISD_SS=1;}void spi_rec (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REC|ISD_LED,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_REC ;seril_back_sate(1);}void spi_erase (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_ERASE|ISD_LED,2);ISD_SS=1;}void spi_G_ERASE (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_G_ERASE|ISD_LED,2);ISD_SS=1;}void spi_rd_apc(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_APC,4);ISD_SS=1;seril_back_sate(4);}void spi_wr_apc1 (void){}void spi_wr_apc2 (void){ISD_SS=0;isd1700_par2_comm(ISD1700_WR_APC2, 0x0400);ISD_SS=1;}void spi_wr_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_WR_NVCFG,2);ISD_SS=1;}void spi_ld_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_LD_NVCFG ,2);ISD_SS=1;}void spi_fwd (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_FWD,2);ISD_SS=1;}void spi_chk_mem(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CHK_MEM,2);ISD_SS=1;}void seril_back_sate(uchar byte_number){uchar sate_temp;rest_isd_comm_ptr();sate_temp=0;do{SBUF=*back_data_ptr++;while(!TI);TI=0;}while(++sate_temp<byte_number);}void rest_isd_comm_ptr(void){isd_comm_ptr=ISD_COMM_RAM;back_data_ptr=ISD_COMM_RAM_C;}void isd1700_Npar_comm (uchar comm_par,comm_byte_count) {uchar i;i=0;ISD_COMM_RAM[0]=comm_par;isd_comm_ptr=&ISD_COMM_RAM[1];do{*isd_comm_ptr++=NULL;}while(++i<comm_byte_count-1);rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<comm_byte_count);}void isd1700_par2_comm(uchar comm_par, uint data_par){uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=data_par;ISD_COMM_RAM[2]=data_par>>8;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<3);}void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr) {uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=NULL;ISD_COMM_RAM[2]=star_addr;ISD_COMM_RAM[3]=star_addr>>8;ISD_COMM_RAM[4]=end_addr;ISD_COMM_RAM[5]=end_addr>>8;ISD_COMM_RAM[6]=NULL;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<=7);}uchar T_R_comm_byte( uchar comm_data ){uchar bit_nuber;uchar temp;bit_nuber=0;temp=0;do{ISD_SCLK=0;isd_delay(1);if((comm_data>>bit_nuber&0x01)!=0){ISD_MOSI=1;}else{ISD_MOSI=0;}if(ISD_MISO){temp=(temp>>1)|0x80;}else{temp=temp>>1;}ISD_SCLK=1;isd_delay(1);}while(++bit_nuber<=7);ISD_MOSI=0;return (temp);}void isd_delay(int x){uchar i;for(; x>=1; x--){for(;i<=20;i++);}}void init(void){TMOD=0x21;SCON=0x50;TL0=0x00; //25msTH0=0x70; //25msTH1=0xE8;TL1=0xE8; //波特率:1200bps(12MHz:0xE6 11.0592MHz:0xE8)ET0=1;EA=1;TR1=1;IT0 = 0;EX0 = 0;spi_pu();spi_devid();}12864.h#ifndef _12864_H#define _12864_H#include "main.h"sbit RS =P3^2;sbit RW=P3^3;sbit EN=P3^4;void buzy();void TransferData(char data1,bit DI);void Dingwei(unsigned char line,unsigned char row); void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg(unsigned char code *adder1);void displayonechar(unsigned int data2);void initinal(void) ; //LCD字库初始化程序void clrram(void);void lcd_pos(unsigned char ,unsigned char );void write_dat(unsigned char);extern unsigned char time_show[];extern unsigned int aaa;#endif12864.c#include "12864.h"#define DataPort P1void initinal(void) //LCD字库初始化程序{TransferData(0x30,0); //8BIT设置,RE=0: basic instruction setTransferData(0x08,0); //Display on ControlTransferData(0x10,0); //Cursor Display Control光标设置TransferData(0x0C,0); //Display Control,D=1,显示开TransferData(0x01,0); //Display Clear}void buzy(){DataPort=0xff;RW=1;RS=0;EN=1;while(DataPort&0x80);EN=0;}void Dingwei(unsigned char line,unsigned char row) //定位在哪行哪列显示{unsigned int i;switch(line){case 1: i=0x80+row;break;case 2: i=0x90+row;break;case 3: i=0x88+row;break;case 4: i=0x98+row;break;default: i=0x80;break;}TransferData(i,0);delay(1);}void lcd_mesg(unsigned char code *addr) //传送一个字符串{while(*addr>0){TransferData(*addr,1);addr++;}}void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0,传送命令,当DI=1,传送数据.{buzy();RW=0;RS=DI;DataPort=data1;EN=1;EN=0;}void delayms(unsigned int n) //延时10×n毫秒程序{unsigned int i,j;for(i=0;i<3*n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m) //延时程序,微妙级{while(m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}void write_cmd(unsigned char cmd){RS=0;RW=0;EN=0;P1=cmd;delayms(1);EN=1;delayms(1);EN=0;}void write_dat(unsigned char dat){RS=1;RW=0;EN=0;P1=dat;delayms(1);EN=1;delayms(1);EN=0;}void lcd_pos(unsigned char x,unsigned char y){unsigned char pos;if(x==0)x=0x80;else if(x==1)x=0x90;else if(x==2)x=0x88;else if(x==3)x=0x98;pos=x+y;write_cmd(pos);}void clrram(void){write_cmd(0x30);write_cmd(0x01);}Sound.h#ifndef _SOUND_H#define _SOUND_H#include "main.h"//以下为语音信息对应播放起始地址定义,A为开始,B为结束#define sound_0A 0x0012#define sound_0B 0x0017#define sound_1A 0x0019#define sound_1B 0x0025#define sound_2A 0x0027#define sound_2B 0x002e#define sound_3A 0x002f#define sound_3B 0x0039#define sound_4A 0x003b#define sound_4B 0x0048#define sound_5A 0x004a#define sound_5B 0x004f#define sound_6A 0x0052#define sound_6B 0x0159#define sound_7A 0x005c#define sound_7B 0x0062#define sound_8A 0x0065#define sound_8B 0x0131#define sound_9A 0x006f#define sound_9B 0x015F#define sound_10A 0x0079#define sound_10B 0x015E#define sound_11A 0x0082#define sound_11B 0x018A#define sound_12A 0x0091#define sound_12B 0x0100#define sound_13A 0x009f#define sound_13B 0x0100#define sound_14A 0x00ac#define sound_14B 0x0100void GetSound(unsigned char soundtick); void PlaySoundTick(unsigned char number);void delay_isd(unsigned int time);void short_delay();void long_delay();#endifSound.c#include "sound.h"void GetSound(unsigned char soundtick){ISD_SS=0;switch(soundtick){case 0:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_0A, sound_0B); }break;case 1:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_1A, sound_1B); }break;case 2:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_2A, sound_2B); }break;case 3:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_3A, sound_3B); }break;case 4:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_4A, sound_4B); }break;case 5:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_5A, sound_5B); }break;case 6:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_6A, sound_6B); }break;case 7:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_7A, sound_7B); }break;case 8:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_8A, sound_8B); }break;case 9:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_9A, sound_9B); }break;case 10:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_10A, sound_10B); }break;case 11:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_11A, sound_11B); }break;case 12:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_12A, sound_12B); }break;case 13:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_13A, sound_13B); }break;case 14:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_14A, sound_14B); }break;default: break;}ISD_SS=1;}void PlaySoundTick(unsigned char number) {spi_stop ();delay_isd(30000);GetSound(number);}void delay_isd(unsigned int time){while(time--!=0);}void short_delay(){delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);}void long_delay(){short_delay();short_delay();short_delay();short_delay();}Key.h#ifndef _KEY_H#define _KEY_H#include "main.h"sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;sbit KEY6=P2^5;sbit KEY7=P2^6;sbit KEY8=P2^7;sbit KEY_SURE=P3^6;void key_delay(unsigned char z); unsigned char keyscan_nor();#endifKey.c#include "key.h"unsigned char keyscan_nor(){if(!KEY1){key_delay(20);if(!KEY1){LED1=0;return 1;}}if(!KEY2){key_delay(20);if(!KEY2){LED2=0;return 2;}}if(!KEY3){key_delay(20);if(!KEY3){LED3=0;return 3;}}if(!KEY4){key_delay(20);if(!KEY4){LED4=0;return 4;}}if(!KEY5){key_delay(20);if(!KEY5){LED5=0;return 5;}}if(!KEY6){key_delay(20);if(!KEY6){LED6=0;return 6;}}if(!KEY7){key_delay(20);if(!KEY7){LED7=0;return 7;}}if(!KEY8){key_delay(20);if(!KEY8){LED8=0;return 8;}}return 0;}void key_delay(unsigned char z){unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}五.参与制作人员ZYL(注:可编辑下载,若有不当之处,请指正,谢谢!)。

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计人们在观测时间的时候,常常想知道当时的湿度、温度、日期、星期等与日常生活密切的信息。

采用51单片机设计了一种计时准确、功能全面、成本低廉的万年历。

该电子万年历通过定时中断和按键同时显示各种需要的信息,具有电路简单,显示直观、读取方便、功能多样的优点。

标签:电子万年历;单片机;定时中断;温湿度引言电子万年历是一种应用非常廣泛的日常计时工具,适合各类场合使用。

LCD 数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。

功能也越来越齐全,除了公历年月日、时分秒、还有星期、温湿度显示及闹铃。

1 总体设计要求1.1 实现的功能此万年历主要功能是显示:时、分、秒、年、月、日、星期、湿度、温度、闹钟功能、整点报时、农历、平闰年。

数字式温湿度计测温范围-40~80℃,湿度误差范围±3%RH用LCD液晶显示。

1.2 系统基本方案选择KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

KeilC51软件目标代码生成效率很高,大多数情况下生成的汇编语言代码都比较容易理解[1]。

1.3 硬件设计选定本设计主控制系统采用AT89S52,独立按键控制;时钟电路由ds1302时钟电路提供;温湿度由DHT21数字式温湿度传感器采集;LCD1602液晶屏动态扫描作为显示。

如图1所示。

2 系统的硬件设计与实现2.1 单片机主控制模块的设计主控制系统采用AT89S52,这是一种高性能、低功耗微控制器,具有8K的系统可编程Flash存储器。

与工业80C51产品指令和引脚完全兼容。

单片机的最小系统由单片机芯片、时钟电路、复位电路组成[2]。

2.2 计时芯片计时芯片采用DS1302,这是一种高性能实时时钟电路[3],DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

如果采用单片机,还需要计数器,同时需要设置中断、查询等,消耗单片机资源,而采用DS1302时钟芯片,就不存在这些问题。

基于51单片机的万年历及温度显示系统

基于51单片机的万年历及温度显示系统

龙源期刊网
基于51单片机的万年历及温度显示系统
作者:郑琪
来源:《硅谷》2010年第07期
摘要: 这是一款以STC8051系列单片机为核心的开发板。

STC8051系列单片机是初学者学习单片机的最佳选择,是大学生进行电子实习、课程设计、毕业设计的必备的单片机。

本开发
板可以实现实时测量及显示当前的温度和时间,同时把单片机的剩余的口扩展出来,这样利用这些扩展的多余的I/O口可以进行其他单片机设计。

这款开发板应用比较广泛。

关键词: STC89C51;Keil uVision3;万年历
中图分类号:TP336文献标识码:A文章编号:1671-7597(2010)0410019-01。

基于51单片机电子万年历设计

基于51单片机电子万年历设计

基于51单片机电子万年历设计大连民族学院机电信息工程学院自动化系单片机系统课程设计报告题目:电子万年历专业:自动化班级:106学生姓名:指导教师:设计完成日期:2012年11月30日1任务分析和性能指标1.1任务分析设计一个具有报时功能、停电正常运行(来电无需校时)、闹钟功能、带有年月日、时分秒及星期显示的电子日历。

电子万年历是日常生活中常见的小型电子产品,其形式多种多样,小到带有日期的电子腕表,大到公共场所悬挂的大型电子日历,此外,眼下我们还常能在宾馆、饭店等场所见到一种带有年、月、日、时、分、秒、星期甚至节气等信息的电子日历牌。

电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外部都可分为显示和校准两部分。

为使电子日历协调工作,整个系统从功能上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期的计算以及人机交互的管理等。

1.2性能指标实时时钟(RTC:Real Time Clock)是系统的核心,其运行精度直接影响产品质量。

实时时钟的实现有两种方案可选,一是利用单片机系统时钟和中断完成时间和日期的计算;二是利用专用时钟芯片。

前者不用附加芯片,系统简单,但是累计误差较大,只有短时计时才可使用。

长时间计时一般都采用后者。

后者采用32.768KHz晶体振荡器振作为脉冲源,内部的15位计数器刚好产生标准秒脉冲。

该类芯片除时钟计时外,还有年月日和星期的计算功能,并且还可计算闰年。

芯片初始化后可脱离CPU自动运行,有些芯片内部带有电池,出厂时芯片即开始运行。

专用时钟芯片的种类很多,与CPU的通信方式有并行,也有串行。

常见的芯片有DALLAS 公司生产的DS1302和DS12C887,前者为串行,需要外加后备电池;后者为并行,芯片内置锂电池和晶体振荡器,无外加电源的情况下可运行10年。

此外,还有许多时钟芯片,如Epson、Holtek、深圳兴威帆等公司都推出自己的时钟芯片。

这次我们选用的芯片是DS12C887。

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计

参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。

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

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

一、引言万年历是一种日历工具,能够显示任何一个公历日期的星期、年、月和日,并且能够自动判断闰年。

在本设计中,我们将使用51单片机设计一个基于LCD显示屏的万年历。

它将能够显示当前的日期和星期,并且具备一些附加功能,如闹钟、计时器等。

二、设计目标本设计的主要目标是通过51单片机实现以下功能:1.显示当前日期和星期:使用LCD显示屏显示当前的年、月、日和星期。

2.闰年判断:根据公历算法判断是否为闰年,并在显示屏上进行标识。

3.闹钟功能:设置一个闹钟时间,并在指定时间到达时发出提醒。

4.计时器功能:实现一个简单的计时器,能够显示经过的时间。

三、系统框图```+------------------+51单片+---+----------+---++--v--++--v--+LCD ,, Keypa+-----++-------+```四、系统设计1.时钟模块:使用定时器模块实现系统的主时钟,根据预设的频率进行中断,更新时间和日期。

2.LCD模块:使用51单片机的IO口控制LCD显示屏,实现对日期、星期和其他功能的显示。

3.按键模块:通过按键模块实现对系统功能的操作,包括设置闹钟、切换功能等。

4.闹钟模块:根据预设的时间进行判断,判断是否到达闹钟时间并触发相应的操作。

5.计时器模块:通过计时器模块实现计时功能,显示经过的时间。

五、代码实现以下是基于51单片机的万年历的主要代码实现的伪代码:1.时钟模块:```初始化定时器;定时器中断中获取当前的日期和时间;```2.LCD模块:```定义LCD引脚;初始化LCD显示;定时刷新LCD内容;```3.按键模块:```定义按键引脚;初始化按键;判断按键事件并执行相应的操作;```4.闹钟模块:```设置闹钟时间;判断当前时间是否与闹钟时间相等;触发相应操作;```5.计时器模块:```设置起始时间;计算当前时间与起始时间的差值;显示计时时间;```六、实验结果通过上述的代码实现和电路连接,我们可以成功地实现了基于51单片机的万年历。

单片机课程设计--基于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单片机的电子万年历毕业论文设计

基于51单片机的电子万年历毕业论文设计

原创性声明本人呈交的毕业论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。

尽我所知,除文中已经注明引用的内容外,本毕业论文的研究成果不包含他人享有著作权的内容。

对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。

本毕业论文的知识产权归属于培养单位。

本人签名:日期:摘要随着社会的发展,信息量的不断提升以前对信息交换的要求提高,电子万年历的发展以及投入市场变得非常有必要。

本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。

通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。

本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。

传统的电子日历大都体积大,功耗大,显示不准确等特点。

为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。

另外本设计具有显示实时温度的功能。

传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。

本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。

最后,温度和时间都将通过12864液晶显示器进行显示。

测试表明系统达到了设计要求的各项功能,各部分工作正常。

关键词:时钟温度检测单片机温度ABSTRACTWith the development of the society, the amount of information is improving the requirements of the information exchange. the development of the electronic calendar and the investment market become very necessary. This design is based on 51 single-chip microcomputer and simulation used in the daily calendar, and 51 series microcontroller is the MCU in the most typical and most representative one. Through this design, learning and consolidate the single chip microcomputer instruction programming knowledge, be familiar with composition and function of the microcontroller parts.This design creates an electronic calendar with real-time temperature display and timing function based on single chip control. Most of traditional calendars are characterized by large size, high power consumption and inaccurate display. In order to reduce volume and power consumption and make calendars become small and exquisite, the design adds a clock chip DS1302, which can accurately record the time and set a regular time to achieve timing function. In addition, this design displays real-time temperature function. Traditional temperature sensor system is mostly amplified, recuperated and A / D converted. The converted digital signal is input the computer to be processed, but the processing circuit is complicated with relatively poor reliability and occupies more resources of the computer. This design uses the DS18B20 first-line system digital temperature sensor to directly convert the temperature signal into digital signal and send it the microprocessor, whose circuit is simple and low cost, achieving the displayed effect of time and temperature simultaneously. Finally, the temperature and time will be displayed through the 12864 liquid crystal display. The test indicates that the system has reached various functions of the design requirements and each part operates smoothly.Keywords: clock temperature-detection SCM temperature目录1 绪论 (1)2 系统基本方案选择和论证 (1)2.1单片机芯片的选择方案和论证 (1)2.2显示模块的选择方案和论证 (1)2.3时钟芯片的选择方案和论证 (2)2.4温度传感器的选择方案和论证 (3)2.5电路设计最终方案确定 (4)3 系统硬件电路设计 (1)3.1系统功能模块划分 (1)3.2各单元模块功能分析及模块电路设计 (2)3.2.1时钟模块 (2)3.2.2温度模块 (2)3.2.3显示模块 (5)3.2.4独立键盘模块 (5)3.2.5蜂鸣器模块 (6)3.2.6单片机模块 (7)3.2.7温度信息的采集 (8)3.3电路原理图的绘制和电路的焊接 (1)3.3.1原理图绘制软件PROTEL (1)3.3.2PCB制作 (1)3.3.3元器件的焊接 (3)4 系统软件设计 (1)4.1万年历软件系统的流程图 (1)4.3温度的读取 (5)下面是温度读取的子程序: (6)4.4键盘模块 (6)4.5蜂鸣器模块 (6)结束语 (1)致谢 (1)参考文献 (1)附录 (1)1 绪论二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发的时代扮演着极为重要的角色。

基于51单片机的电子万年历的设计

基于51单片机的电子万年历的设计

设计说明书基于51单片机的电子万年历的设计系部电子信息与控制工程系专业名称电子信息工程技术班级电子姓名学号指导教师2014 年 06 月 23 日基于51单片机的电子万年历的设计摘要电子万年历是单片机系统的一个应用,由硬件和软件相配合使用。

硬件由主控器、时钟电路、温度检测电路、显示电路、键盘接口5个模块组成。

主控模块用AT89C52、时钟电路用时钟芯片DS1302、显示模块用LED数码管、温度检测采用DS18B20温度传感器、键盘接口电路用普通按键接上拉电阻完成;软件利用C语言编程实现单片机程序控制。

单片机通过时钟芯片DS1302获取时间数据,DS18B20采集温度信号送该给单片机处理,单片机再把时间数据和温度数据送给74LS154译码,然后通过三极管C9015放大驱动LED数码管显示阳历年、月、日、时、秒、闹钟、星期、温度。

关键词:电子万年历;单片机;温度传感器;时钟;数码显示。

目录1 引言 (4)2 功能要求 (5)3 方案论证与设计 (6)3.1控制部分的方案选择 (6)3.2测温部分的方案选择 (6)3.3显示部分的方案选择 (7)4 系统硬件电路设计 (8)4.1主控器AT89S52 (8)4.2时钟电路DS1302 (8)4.2.1. DS1302的性能特性 (8)4.2.2 DS1302数据操作原理 (9)4.3测温电路的设计 (11)4.3.1 温度传感器工作原理 (11)4.3.2 DS18B20与单片机的接口电路 (15)4.4键盘接口的设计 (15)5 系统程序的设计 (16)5.1阳历程序设计 (16)5.2时间调整程序设计 (16)5.3温度程序设计 (16)5.3.1 主程序 (17)5.3.2 读出温度子程序 (17)5.3.3 温度转换命令子程序 (17)5.3.4 计算温度子程序 (18)5.3.5显示数据刷新子程序 (18)6调试及性能分析 (19)6.1调试步骤 (19)6.2性能分析 (19)7总结 (20)致谢 (21)参考文献 (22)附1 实物图 (23)1 引言随着微电子技术和超大规模集成电路技术的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,单片微型计算机体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域得到了广泛的应用。

基于51单片机和DS1302的电子万年历设计论文

基于51单片机和DS1302的电子万年历设计论文

1 引言随着科技的不断进步和发展,单片机的使用已经渗透到我们日常生活当中的各个领域,几乎很难找到有哪个领域没有使用单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录相机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

本文设计的电子万年历属于小型智能家用电子产品。

利用单片机进行控制,实时时钟芯片进行记时,外加掉电存储电路和显示电路,可实现时间的调整和显示。

电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、饭店、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。

因而,此设计具有相当重要的现实意义和实用价值。

1.2方案选择由于现在市面上的电子万年历的种类比较多,因此到底选择什么样的方案在设计中是至关重要的。

正确地选择方案就可以使产品更加人性化,并且可以减小开发的难度,缩短开发的周期,降低产品的成本等等,因此就会被人们普遍接受,并且能够更快地将产品推向市场实现其自身的价值。

下面我们就拟订了两种方案,希望能够选择一种性价比高的方案。

1.2.1 方案1——基于AT89S52单片机的电子万年历设计不使用时钟芯片,而直接用AT89S52单片机来实现电子万年历设计。

AT89S52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦写1000余次。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

若采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。

基于51单片机的万年历及温度显示系统

基于51单片机的万年历及温度显示系统
TXD.
2摄作说明 在该线路板中因为下载程序和数码管显示公用单片机的串口,因此在 下载程序时单片机的板子上由J2和J3--针两个插座跳线帽调到LOAD端,在 开机正常显示时应该把跳线跳至UDisplay端。 四个按键可以用来切换温度和时间的显示以及时间的调整,具体调整 如下:开机时默认显示时分秒,按keyl键在年月日、时分秒、温度轮流显 示;在显示年月日时,按key4键选择调照年、月、日;在显示时分秒时, 按key4键选择调整时、分、秒;选择好调整的对象后,按key2键对象相应 增加,按key3键对象相应减少;按key5键复位,显示时分秒。 3焊接 在焊接前应先测量电源端子看线路板是否短路,没有短路再进行焊 接。焊接原则从低矮耐热到高的不耐热的元器件。 应该注意的问题:不能虚焊漏焊;焊接的方向和备用电池底座方向一 定要正确。 4系统谭试 如果焊接规范,器件完好,器件焊接的位置大小方向与要求一致的的 话,一般情况产品能正常工作。常见问题: 程序不能正常下载:看max232芯片完好否焊接规范否,以及该器件周 围电容焊接正确否。 显示乱码:一般情况下程序下载完后如果正常运行,在程序运行一个 周期时绿色指示灯应该亮,运行结束时灯灭一下。常亮或者常灭说明单片 机没有正常工作应该检查晶振和单片机看器件完好否供电正常否t焊接有 虚焊漏焊否。如果指示灯工作正常应该检查数码管显示的驱动芯片 741s164和数码管焊接和器件完好否。 时间与实际时间不一样:首先检查时钟芯片以及时钟芯片周围的晶振 和电容焊接好否,器件是否是要求的型号标称大小。 温度与实际温度不符:检查数字温度传感器dsl8b20好否。
号,且具有极强的抗干扰纠错能力。⑨负压特性:电源极性接反时,芯片 不会因发热而烧毁,但不能正常工作。
1.6串口通信区。单片机和电脑之间采用串口进行通讯。进行通讯时 采用了专用芯片MAX232进行电平转换。我们采用了三线制连接,也就是说 和电脑的串口只连接其中的3根线:第5脚的Gt@、第2脚的Rj(D、第3脚的

基于51单片机温湿度检测+电子万年历的毕业设计论文

基于51单片机温湿度检测+电子万年历的毕业设计论文

毕业设计论文基于51单片机温湿度检测+电子万年历的设计[摘要]:温湿度检测是生活生产中的重要的参数。

本设计为基于51单片机的温湿度检测与控制系统,采用模块化、层次化设计。

用新型的智能温湿度传感器SHT10主要实现对温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机STC89C52RC进行数据的分析和处理,为显示提供信号,显示部分采用LCD1602液晶显示所测温湿度值。

系统电路简单、集成度高、工作稳定、调试方便、检测精度高,具有一定的实用价值。

[关键字]:STC89C52RC SHT10 LCD1602 按键指示灯蜂鸣器电子万年历Based on 51 single chip microcomputer temperature and humidity detection + electronic calendar designAbstract:Temperature and humidity detection is important parameters in the production of life. This design is based on 51 single chip microcomputer temperature and humidity detection and control system, adopting modular, hierarchical design. With new type of intelligent temperature and humidity sensor SHT10 main realization about the detection of temperature, humidity, temperature humidity signal acquisition is converted into digital signals through the sensor signal, using SCM STC89C52RC for data analysis and processing, provides the signal for display, display part adopts LCD1602 LCD display the measured temperature and humidity values. Simple circuit, high integration, work stability, convenient debugging, high detection precision, has certain practical value.Key words:STC89C52RC SHT10 LCD1602 key indicator light buzzer The electronic calendar目录第1章绪论错误!未定义书签。

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

基于51单片机的万年历与温度检测报警系统摘要随着社会发展需求的改变,电子万年历是一个应用非常广泛的实用日常计时工具,带有显示世纪,年,月,日,星期,时,分,秒和按键可调时间及其按键设置闹钟的功能,同时具有月末自动更新,闰年补偿功能等多种功能。

温度检测报警系统也是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。

此系统是基于STC89C52单片机设计的,包含液晶显示模块,DS12C887实时时钟模块,DS18B20温度采集模块,键盘扫描模块,报警模块,HX1838红外接收头模块。

STC89C52作为控制核心,具有功耗低,功能强等特点,电压可选5VUSB 供电。

显示模块采用12864液晶动态显示,相对数码管而言经济实用,占用空间小,对于显示数字、字母最为合适,而且与单片机连线简单,占用IO口相对较少。

实时时钟芯片DS12C887是一款与DS12C885实时时钟兼容的替代产品,该器件提供RTC/日历、定时闹钟等功能,如果检测到主电源故障,该器件可自动切换到备用电源供电,DS12C887将石英晶体与电池集成在一起,在断电后仍可精确走10年。

温度检测报警模块采用数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优点,易与单片机连接,模块电路组成简单并同时具有温度报警功能。

关键词:STC89C52,DS12C887,DS18B20,12864液晶显示,电子万年历,采集周围设备温度、温度报警一、设计要求与方案论证1.1设计要求设计一个能够实现世纪,年,月,日,星期,小时,分,秒显示附带温度检测显示的实时时钟电子万年历,同时具有时间调节和闹钟设置功能,以及时间预设报警、温度报警、报警解除等功能。

该产品共设有四个按键,每个按键具有多种功能,充分利用各个按键。

也可利用红外遥控来进行实时调节,体现时尚方便的特性,并且通过编程还可以控制12864液晶显示,随心所欲。

通过对闹钟和温度报警的设置可进行定时对设备进行自动化控制,也体现了产品的智能化。

1.2系统方案选择和论证STC89C52单片机作为核心控制体,该单片机具有高可靠,超低价,低功耗,无法解密等优点。

该单片机属于双列直插式封装的PDI40口管脚。

具有4个输入输出端口,分别为PORT0,PROT1,PROT2,PROT3,其中P0口是一组8位漏极开路型双向IO口,校验时,要求接上拉电阻。

其他三个内部有30K的电阻,所以不用再外接电阻。

此单片机具有6个中断,其中包括三个定时器中断,二个外部中断,一个串口中断,为全双工通信口。

内部有静态非易失EEPROM和看门狗。

片内含8Kbbytes的可反复檫写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),功能强大,适合许多较为复杂的控制应用场合。

相比较其他芯片来说比较适合学生试验所用,故采用此单片机作为核心控制芯片。

DS12C887为实时时钟芯片,功能丰富,可以用来直接代替IBMPC上的时钟日历芯片DS12887,同时,它的管脚也和MC146818B、DS12887相兼容。

由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加世纪寄存器,从而利用硬件电路解决子“千年”问题:DS12C887中自带有锂电池,外部掉电时,其内部信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。

在12小时制模式中,用AM和PM区分上午和下午;时间表示方法也有两种,一种用二进制数表示,一种用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来储存时间信息,4字节RAM用来储存DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可以对DS12C887进行编程以实现多种方波输出,并对其内部的三路中断进行屏蔽。

芯片内部石英晶体与充电电池,具有三个可单独屏蔽中断标志位的中断输出,闰年补偿至2100年。

+5V或+3.3V工作电源,工业级温度范围,自动电源故障检测和切换电路,故此芯片适合应用于工业生产和家庭应用中。

DS18B20是数字式温度传感器,采用单总线通信协议。

DS18B20具有体积小,硬件开销低,抗干扰能力强,精度高附加功能强,封装形式多样等特点。

适合各种狭小空间内设备的数字测温和控制。

同时单线可挂接多个元件,因为每个元件都有唯一的一个64位光刻ROM编码,家族码为28H,可以多个也可单个操作。

电压测量范围是3.0V到5.5V。

内部含有EEPROM,其报警上、下限温度值和设定的分辨率倍数在芯片掉电的情况不丢失。

并且内部带有AD转换电路,技术较为成熟,所以采用此芯片最为合适。

红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头,本次电子产品采用HX1838,其内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。

红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。

交流信号进入带通滤波器,带通滤波器可以通过30khz 到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。

注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。

12864液晶应用非常广泛,操作简单,功能强大,采用12864液晶显示各种数字信息最为合适,通过对单片机的编程来控制DS12C887,HX1838红外接收头和DS18B20芯片的读写操作来获取相应的信息,再通过对液晶的编程控制将获取到的信息通过一系列转换从而显示到12864液晶上。

最后达到有电子万年历和温度采集报警等功能。

系统论证时通过在单片机学习板上的试验操作,能够达到预期的效果!1.3最终方案确定核心控制体:STC89C52单片机实时时钟芯片:DS12C887显示模块:12864液晶数字式温度传感器:DS18B20红外接收头:金属外壳封装HX1838总共设有四个按键,为节约资源考虑,每个按键都有多种功能。

每个按键分别标号为A,B,C,D.第一次按下B,C,D都没有反应,首先按下A键可选择指针位置,B,C键为加减键,D键为闹钟设置键。

B同时又是闹钟报警消除键。

操作简单,按键灵活。

两个报警模块,分为温度报警和闹钟报警两种。

二、电子万年历与温度采集报警硬件设计和实现2.1系统设计框图2.2系统硬件需求介绍STC89C52单片机一片,DS12C887实时时钟芯片一个,DS18B20数字式温度传感器一个,HX1838红外接收头一个,12864液晶一个,+5V 无源蜂鸣器一个,12MHZ 晶振一个,多个按键和开关,常用电容电阻,连接线,三极管,二极管若干,滑动变阻器一个,USB 母口一个。

2.3系统硬件各模块作用核心控制器件选用STC89C52单片机。

STC89C52单片机为40管脚双列直插芯片,它是一种高性能,低功耗的8位CMOS 微处理器芯片,市场应用最多。

而且价格便宜,控制方便,便于应用有4个I/O 口分别为P1,P2,P3,P4。

其中每一个管脚都能做独立的输入输出管脚,它的第9脚位复位管脚,接上电容和上拉电阻再带个开关构成复位电路。

18,19管脚接外部晶振和两个微调电容构成外部晶振电路。

单片机,复位电路,晶振,5V 电源构成单片机最小系统。

其中与AT89S52单片机管脚容。

时钟模块选用DS12C887芯片,DS12C887芯片能够自动产生世纪,年,月,日,星期,时,分,秒信息,闰年补偿至2100年,具有闹钟功能。

内部自带锂电池,在外部掉电时信息不丢失,并且能精确走10年之久。

同时DS12C887能自动检测电源故障和切换电路,有工业级温度范围。

此芯片可以广泛应用于对环境要求严格的控制系统中。

如嵌入式系统,电表,安全系统,网络集线器,网桥,路由器。

12864液晶使用ST7920控制器,5V 电压驱动,带背光,内置8192个16*16点阵、128个字符(8*16点阵)以及64*256点阵显示RAM(GDRAM)。

与外部CPU 接口采用并行或串行两种控制方式。

数字温度传感器选用DS18B20,采用单总线通信协议。

(一)DS18B20主要特性有:1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。

2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

5、温范围-55℃~+125℃,在-10~+85℃时精度为0.5℃。

6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。

8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

(二)应用范围1、冷冻库、粮仓、储罐、电信机房、电缆线槽等测温和控制领域。

2、轴瓦、缸体、纺机、空调等狭小空间设备温和控制。

3、汽车空调、冰箱、冷柜以及中低温干燥箱等。

4、供热。

制冷管道热量计算、中央空调分户热能计量等。

(三)引脚介绍DS18B20有两种封装:三角TO-92式(用的最多、最普遍的封装)和八角SOIC贴片式,封装引脚见上图,并且给出了引脚的定义。

(四)硬件连接我们首先来了解“单总线”的概念。

目前常用的单片机与外设之间进行数据传输的串行总线主要有CI2,SPI和SCI总线。

期中CI2总线以同步串行二线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行三线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),而SCI总线是以一步方式进行通信(一条数据输入线,图条数据输出线)。

这些总线至少需要两条或者两条以上的信号线,而DS18B20使用的单总线技术上与上述总线不同,他采用单条信号线,既可以传输时钟,又可以传输数据,俄日切尔数据传输时双向的银耳这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。

单总线适用于弹珠机系统,能够控制一个或多个从机设备。

主机可以是微控制器,丛集可以是单总线总线控制器件,他们之间的数据交换只通过一条信号线。

相关文档
最新文档