单片机液晶1206万年历程序

合集下载

单片机课程设计LCD显示万年历EPROM存储

单片机课程设计LCD显示万年历EPROM存储

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

显示年月日星期温度等,双行显示,。

显示年、月、日、星期、时间,可设置,设置功能。

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

2.设计原理及相关说明设计原理:利用DS1302读取系统中的日期以及时间信息,并分别利用P1.1端口和P3.3端口将相关信息传送至STC12C5A60S2主芯片之中,利用P0端口使之显示于LCD1602液晶显示屏上,四个按键分别置于P1口的5、6、7端口可以对时间进行控制修改。

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

2.2总体设计框图日历时钟系统设计框图如图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功能6、看门狗7、部集成MAX810专用复位电路8、外部掉电检测电路9、时钟源:外部高精度晶体/时钟,部R/C振荡器常温下部R/C振荡器频率为:5.0V单片机为:11~17MHz 3.3V单片机为:8~12MHz 针对电机控制,强干扰场合。

基于单片机的万年历设计

基于单片机的万年历设计

基于单片机的万年历设计一、系统总体设计基于单片机的万年历系统主要由单片机控制模块、时钟模块、显示模块、按键模块和电源模块等组成。

单片机控制模块是整个系统的核心,负责处理和协调各个模块之间的数据传输和控制信号。

通常选用具有较高性能和稳定性的单片机,如 STC89C52 等。

时钟模块用于提供准确的时间信息,常见的有 DS1302 等芯片,能够实现年、月、日、时、分、秒的精确计时。

显示模块用于将时间等信息直观地展示给用户,可采用液晶显示屏(LCD)或数码管。

LCD 显示效果清晰、美观,但成本相对较高;数码管则价格低廉,显示简单明了。

按键模块用于用户对万年历进行设置和操作,如调整时间、设置闹钟等。

电源模块为整个系统提供稳定的电源供应,保证系统的正常运行。

二、硬件设计1、单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,保证其正常工作;复位电路则用于在系统出现异常时将单片机恢复到初始状态。

2、时钟模块电路DS1302 时钟芯片通过串行方式与单片机进行通信,其引脚连接到单片机的相应 I/O 口。

通过对 DS1302 进行读写操作,可以获取和设置时间信息。

3、显示模块电路若采用 LCD1602 液晶显示屏,其数据线和控制线与单片机的 I/O 口相连。

通过编程控制单片机向 LCD 发送指令和数据,实现时间等信息的显示。

4、按键模块电路通常使用独立按键,将按键的一端接地,另一端连接到单片机的I/O 口,并通过上拉电阻保证在按键未按下时引脚处于高电平。

当按键按下时,引脚电平被拉低,单片机通过检测引脚电平的变化来判断按键的操作。

三、软件设计软件设计主要包括主程序、时钟模块驱动程序、显示模块驱动程序和按键处理程序等。

主程序负责初始化各个模块,并进行循环检测和处理。

在循环中,不断读取时钟模块的时间数据,然后通过显示模块进行显示,并检测按键是否有操作。

时钟模块驱动程序根据 DS1302 的通信协议,实现对时钟芯片的读写操作,从而获取和设置时间。

单片机制作的12864液晶万年历_C语言程序

单片机制作的12864液晶万年历_C语言程序

#include<reg52.H>#include<intrins.h>#include<math.h>////////////////////////////////////////DS18B20#define uchar unsigned char#define uint unsigned intsbit DQ = P1 ^ 0; // 定义DS18B20的单总线#define Lcd_Bus P0sbit LCD_RS=P2^7; //数据/命令选择sbit LCD_RW=P2^6; //读写控制sbit LCD_EN=P2^5; //片选信号#define LCD_DA TA P0 //8 bit数据线#define LOW 0#define HIGH 1//初始化指令#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H#define AC_INIT 0x02 //将AC设置为00H。

且游标移到原点位置#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)#define FUN_MODE 0x30 //工作模式:8位基本指令集#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白#define DISPLAY_OFF 0x08 //显示关#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH#define SET_DD_AC 0x80#define FUN_MODEK 0x36 //扩展指令集,8位指令#define X1address 0x80 //上半屏X轴起始地址#define X2address 0x88 //下半屏X轴起始地址#define Y address 0x80 //Y轴起始地址#define Set_Column 0x40#define Set_Page 0xB8uchar code shu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code xingqi[]="星期";uchar code hanzishu[]="一二三四五六日";unsigned char TempData = 0;double DS18B20Data;uint jiemian=0;//////////////////////////////////////////DS1302sbit DS1302_RST = P1^4;sbit DS1302_IO = P1^3;sbit DS1302_SCK = P1^2;unsigned char table[]={0X00,0X18,0X0c,0X15,0X06,0X01,0X0a};//0s 24min 12hour 14ri 5yue 5zhou 2010nianunsigned char data table1[7];//uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code shuzi[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,};unsigned char aa,bb;uchar miaoge,miaoshi,fenge,fenshi,shige,shishi,rige,rishi,yuege,yueshi,zhou,niange,nianshi;uchar shezhinum=0;//unsigned char shi,ge;////////////////////////////////////////////////键盘扫描sbit key_mnue = P3^7;sbit key_jia = P2^0;sbit key_jian = P2^1;sbit key_enter= P2^2;uchar key_number=0;//int nian,yue,ri,shi,fen;/////////////////////////////////////////////////红外sbit HW_IRQ = P3 ^ 2; // 定义38KHz一体化红外接收头与CPU的连接unsigned char DT;static unsigned char data IRCode[3],IRCON,IRCON2;//////////////////////////////////////////////////蜂鸣器sbit BEEP =P1^1;/****************************************************************************** *************** 函数名称:DS18B20_Delay()* 功能:DS18B20软件延时专用* 入口参数:count 延时参数,值越大,延时越长* 出口参数:无******************************************************************************* **************/void DS18B20_Delay(uint count) //延时函数{while(count--);}/****************************************************************************** *************** 函数名称:DS18B20_Init()* 功能:DS18B20初始化* 入口参数:无* 出口参数:返回值为1则初始化成功* 返回值为0则初始化失败******************************************************************************* **************/uchar DS18B20_Init(void){uchar x = 0;DQ = 1; // DQ复位DS18B20_Delay(8); // 稍做延时DQ = 0; // 单片机将DQ拉低DS18B20_Delay(80); // 精确延时,大于480usDQ = 1; // 拉高总线DS18B20_Delay(14); // 稍做延时后x = DQ; // 若x=0则初始化成功,若x=1则初始化失败DS18B20_Delay(20);return (~x);}/****************************************************************************** *************** 函数名称:DS18B20_Read1Byte()* 功能:从DS18B20读一个字节* 入口参数:无* 出口参数:从DS18B20读出的一个字节******************************************************************************* **************/uchar DS18B20_Read1Byte(void){uchar i = 0;uchar dat = 0;for(i=8;i>0;i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ) dat |= 0x80;DS18B20_Delay(4);}return (dat);}/****************************************************************************** *************** 函数名称:DS18B20_Write1Byte()* 功能:向DS18B20写一个字节* 入口参数:dat 要写入DS18B20的一字节数据* 出口参数:无******************************************************************************* **************/void DS18B20_Write1Byte(uchar dat){uchar i = 0;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;DS18B20_Delay(5);DQ = 1;dat>>=1;}}/****************************************************************************** *************** 函数名称:Read_Disp_Temperature()* 功能:读取并显示温度* 入口参数:无* 出口参数:无******************************************************************************* **************/double Read_Disp_Temperature(void){uint a = 0, b = 0, c = 0,d = 0,e = 0, t = 0;double tt = 0;DS18B20_Init();DS18B20_Write1Byte(0xCC); // 跳过读序号列号的操作DS18B20_Write1Byte(0x44); // 启动温度转换DS18B20_Init();DS18B20_Write1Byte(0xCC); // 跳过读序号列号的操作DS18B20_Write1Byte(0xBE); // 读取温度寄存器a = DS18B20_Read1Byte();b = DS18B20_Read1Byte();t = b;t <<= 8;t = t | a;//tt = t * 0.0625;return t;}//***************************************************************** //函数名称:delay(uint t)延时函数。

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

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

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

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

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

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

具体介绍如下。

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

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

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

如下图所示。

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

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

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

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

详情请:点击此处。

万年历程序和电路图

万年历程序和电路图

目录第一章设计方案 (1)1.1.硬件设计 (1)1.1.1设计要求 (1)1.1.2硬件框图 (1)1.1.3硬件选择 (1)1.2软件设计 (3)1.2.1编程环境及语言 (3)1.2.2程序框图 (3)第二章系统设计 (4)2.1硬件设计 (4)2.1.1振荡电路 (4)2.1.2复位电路 (4)2.1.3按键 (4)2.1.4 lcd显示电路 (5)2.1.5音乐播放电路 (5)2.1.6 P0上拉电阻计算 (6)2.2软件设计 (7)2.2.1程序流程图 (7)2.2.2流程的各个模块设计 (9)心得体会 (21)附录 1. 元器件表 (22)附录 2.程序源代码 (23)1602.c文件 (23)Clock.H文件 (27)Music.h文件 (45)LCD1602.H文件 (47)参考文献 (54)引言单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

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

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

本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒;实现位调;附加播放音乐功能。

本设计是基于A T89C51和LCD1602液晶显示器设计的可调式电子钟。

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

显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。

通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。

第一章设计方案1.1.硬件设计1.1.1设计要求实现年月日、时分秒、星期的显示功能,用两个按键来实现日期和时间的调整功能,调整要求星期能自动更新,且能实现位调。

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

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

自己制作的单片机万年历程序+原理图单片机万年历仿真原理图如下仿真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);。

单片机实训总结报告万年历

单片机实训总结报告万年历

一、引言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。

为了提高我们的实践能力和专业技能,我们选择了单片机实训作为课程的一部分。

在实训过程中,我们以万年历为例,通过学习单片机原理、编程和应用,实现了万年历的设计与制作。

本文将详细总结万年历实训的整个过程。

二、实训目标1. 掌握单片机的基本原理和编程方法;2. 熟悉万年历的设计与制作流程;3. 提高动手实践能力和团队合作精神;4. 培养创新思维和解决问题的能力。

三、实训内容1. 单片机原理及编程实训初期,我们学习了单片机的基本原理,包括CPU、存储器、输入输出接口等。

通过学习,我们了解了51单片机的结构、工作原理和指令系统。

在此基础上,我们学习了C语言编程,掌握了Keil软件的使用方法。

2. 万年历设计与制作万年历的设计与制作分为以下几个步骤:(1)需求分析:确定万年历的功能,包括显示年、月、日、星期、时分秒、农历、公历、节假日等。

(2)硬件设计:选择合适的单片机、显示屏、按键等硬件设备。

本实训选用AT89C51单片机、LCD1602显示屏和按键。

(3)软件设计:编写万年历的程序,实现功能需求。

程序主要包括以下几个模块:1)时钟模块:实现时分秒的计时功能;2)日期模块:实现年、月、日的显示和计算;3)星期模块:根据日期计算星期;4)农历模块:根据公历日期计算农历日期;5)节假日模块:显示节假日信息;6)按键模块:实现用户交互功能。

(4)调试与优化:对万年历程序进行调试,确保功能正常运行。

同时,对程序进行优化,提高运行效率。

3. 实训成果展示经过一段时间的努力,我们成功完成了万年历的设计与制作。

以下为万年历的部分功能展示:(1)显示当前日期、时间、星期和温度;(2)显示农历日期和节假日信息;(3)通过按键调整时间、日期和温度;(4)具有闹钟功能,可设置闹钟时间。

四、实训总结1. 提高了单片机编程能力:通过万年历的设计与制作,我们掌握了C语言编程方法,熟悉了Keil软件的使用。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(完整word版)基于单片机的万年历设计

(完整word版)基于单片机的万年历设计

基于单片机的万年历设计二、实验要求设计一个万年历,将时钟显示在LCD1602的显示屏上并且可以进行年、月、日以及时、分、秒的设置。

此外还可以通过按键进行闹钟设置以及事件提醒功能,用蜂鸣器进行闹铃提醒。

最后附加一个温湿度检测的功能,用温湿度传感器检测室内的温湿度并将温湿度数据在显示屏上显示出来。

三、实验设备和仪器1.用STC89C52芯片作为系统板的主控芯片2.DHT11温湿度传感器3.DS1302时钟芯片4.LCD1602显示屏四、实验各模块原理介绍4.1 STC89C52单片机STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

(1)主要特性8K字节程序存储空间;512字节数据存储空间;内带4K字节EEPROM存储空间;可直接使用串口下载;(2)器件参数1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。

2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)3.工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz4. 用户应用程序空间为8K字节5. 片上集成512字节RAM6. 通用I/O 口(32个),复位后为:P1/P2/P3 是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RXD/P3.0,TXD/P3.1)直接下载用户程序,数秒即可完成一片。

基于单片机的万年历制作

基于单片机的万年历制作

基于DS1302和ATmega16的万年历制作一、题目分析以及器件选择1、设计要求:电子万年历(a)、基本功能要求:1>能够正确进行日历记录和显示2>能够输入设定年份3>能够通过按键进行日历的调整4>能够进行整点报时5>每年1月1日进行新年报时(b)、扩展功能要求:1>能够调整每天的定时长短2>能够同时显示对应的农历3>能够将通过计算机调整具体的计时和日历2、方案选择:1>时钟芯片的选择在这个系统中,最重要的就是时钟芯片的选择,在电子时钟设计中,常用的时钟芯片有DS1302、DS1216、DS1643、DS1302。

每种芯片的主要功能基本相同,只是在引脚数量、备用电池的安装方式、计时精度和扩展功能等方面略有不同。

DS12877与DS1216芯片都有内嵌式锂电池作为备用电源:X1203引脚少,没有嵌入式锂电池,跟DS1302芯片功能相似,只是相比较之下,X1203与A T89S51搭配使用时占用I/O口较多。

DS1643为带有全功能实时时钟的非易失性型SRAM,集成了非易失性型SRAM、实时时钟、晶振、电源掉电控制电路和锂电池电源,BCD码表示的年、月、日、星期、时、分、秒,带闰年补偿。

同样。

DS1643拥有28只管脚,硬件连起来占用微处理器I/O口较多,不方便系统功能拓展和维护。

故而从性价比和货源上考虑,本设计采用实时时钟芯片DS1302。

2>显示器件的选择显示器件的选择范围很广,成本最低的就是采用八位数码管进行显示,但是使用八位数码管,经过评估和计算需要至少八个,这占用了太大的空间,而且很不美观。

第二个选择就是使用液晶,采用12864大液晶是普遍的选择,但是成本太高,而且函数调用不便,程序较长,因此从节约成本的角度考虑,使用小液晶1602进行设计。

3>设计评估本次设计完成了基本要求规定那个的所有内容,能够正确进行日历记录和显示、能够输入设定年份、能够通过按键进行日历的调整、能够进行整点报时、每年1月1日进行新年报时。

基于单片机的万年历的液晶显示

基于单片机的万年历的液晶显示

基于单片机的万年历的液晶显示一引言单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而STC系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

本设计通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器STC89C54、发声电路、1602、按键电路、晶振电路和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

STC89C54是89C51的内核,ROM容量为16K。

电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

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

该电路采单片机作为核心,功耗小,电压可选用5V电压供电。

二硬件结构电源,复位电路和晶振是构成单片机运作的最基本的3要素,缺一不可。

没有复位电路,程序将不能正常运行甚至不能运行,晶振提供了单片机的振荡周期。

复位电路为一个R C电路。

本设计的晶振为12M,执行一个指令的周期为1US,也可以更换晶振来改变单片机的机器周期。

显示电路用的是1602液晶显示,液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各类仪表和低功耗系统中得到广泛的应用。

1602能显示数字和字母两行20字等等。

与数码管相比该模块有如下优点:1.位数多,可显示32位,32个数码管体积相当庞大了 2.显示内容丰富,可显示所有数字和大、小写字母 3.程序简单,如果用数码管动态显示,会占用很多时间来刷新显示,而1602自动完成此功能。

单片机万年历 现成程序

单片机万年历  现成程序
64138,64291,64426,64489,64603,64704,64795, //低音1~7
64837,64913,64981,65012,65070,65120,65166, //中音1~7
65186,65225,65259,65274,65303,65328,65351, //高音1~7
2+7,0x02,5+0,0x02,1+7,0x04,
//------------
0,0x00
};
//-----------------------秒表用:-----------------------
struct clkms_type
{uchar s;
uchar ms;
else {if(riqi[4]==0&&riqi[5]==2&&riqi[6]==2&&riqi[7]>8) {riqi[5]++;riqi[6]=0;riqi[7]=1;}}}
{ if(riqi[4]==0&&riqi[5]>9) {riqi[4]=1;riqi[5]=0;}; //month
struct backclk_type
{char h;
char m;
char s;
}backclk={0,0,5};
void back_clk() //时钟-1s处理
{backclk.s--;
if(backclk.s==-1&&backclk.m)
{backclk.s=59;
if(riqi[4]==1&&riqi[5]>2) {riqi[4]=0;riqi[5]=1;};

单片机液晶显示“万年历”-单片机课程设计报告

单片机液晶显示“万年历”-单片机课程设计报告

AM/PM的12小时格式。采用三线接口与CPU进行同步通信,并可采用 突发方式一次传送多字节的时钟信号或RAM数据。
DS1302有主电源/后备电源双电源引脚:VCC1在单电源与电池供电 的系统中提供低电源,并提供低功率的电磁备份;VCC1在双电池系统 中提供主电源。在这种运行方式中,VCC1里连接到后备电源,以便在 没有主电源的情况下能保存时间信息以及数据。DS1302由VCC1或 VCC2中较大者供电。当VCC2>(VCC1+0.2V)时,VCC2给DS1302 供电;当VCC2<VCC1时,DS1302由VCC1供电。如图2-4为DS1302的 引脚图。
图2-4 DS1302的引脚图
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然 后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问 到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟 周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单 字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。 如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O 引脚变为高阻态。上电运行时,在VCC≥2.5V之前,RST脚必须保持低 电平。只有在SCLK为低电平时,才能将RST置为高电平。
和比较) ● 全静态工作方式:0~24MHZ
2.2.2 时钟电路DS1302
DS1302的性能特性:
● 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年 进行比较;
● 用于高速数据暂存的31*8位RAM; ● 最少引脚的串行I/O; ● 2.5~5.5V电压工作范围; ● 2.5V时电流小于300nA; ● 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数

基于stc51单片机的LCD1602显示时间的电子万年历(显示

基于stc51单片机的LCD1602显示时间的电子万年历(显示

1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布KeilμVision4,KeilμVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

2011年3月ARM公司发布最新集成开发环境RealViewMD K开发工具中集成了最新版本的KeiluVision4,其编译器、调试工具实现与ARM器件的最完美匹配。

KeilC51开发系统基本知识KeilC51开发系统基本知识1. 系统概述KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍KeilC51开发系统各部分功能和使用。

2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51for Windo ws和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

单片机万年历程序代码

单片机万年历程序代码

单片机万年历程序代码以下是一个示例单片机万年历的程序代码:```c#include <reg51.h>typedef unsigned char uchar;typedef unsigned int uint;sbit K1 = P2^0; // 显示年份sbit K2 = P2^1; // 显示月份sbit K3 = P2^2; // 显示日期uchar code year_tab[] = {31,28,31,30,31,30,31,31,30,31,30,31}; uchar code week_tab[] = {0x06,0x07,0x01,0x02,0x03,0x04,0x05}; uchar year, month, day, week;void delay(uint ms){uint i, j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}uchar getKey(){if(K1==0) {delay(5);if(K1==0)return 1;while(!K1);}if(K2==0) {delay(5);if(K2==0)return 2;while(!K2);}if(K3==0) {delay(5);if(K3==0)return 3;while(!K3);}return 0;}void display(uchar num) {P0 = num;delay(1);P0 = 0x00;}void init(){TMOD=0x01;TH0=0xFC;TL0=0x67;EA=1;ET0=1;TR0=1;}void main(){init();while(1) {uchar key = getKey();if(key == 1) {year++;if(year == 100)year = 0;}else if(key == 2) {month++;if(month == 13)month = 1;}else if(key == 3) {day++;if(day > year_tab[month-1]) { day = 1;}}display(year / 10);display(year % 10);display(month / 10);display(month % 10);display(day / 10);display(day % 10);display(week);}}void timer0() interrupt 1{TH0=0xFC;TL0=0x67;week++;if(week == 7)week = 0;}```该代码的主要思路是通过外部三个按键模拟年、月和日的调节,通过一个定时器不断更新星期的计数,然后将年、月、日和星期分别在数码管上显示出来。

基于单片机的液晶显示“万年历”设计

基于单片机的液晶显示“万年历”设计

单片机液晶显示“万年历”一、设计任务利用STC89C52RC单片机设计一个具有如下功能的电子万年历:(一)、能够显示年、月、日、时、分、秒、星期(二)、能正确显示闰年日期(三)、用独立键盘进行校时二、硬件设计1、系统框图按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块、LCD显示模块、蜂鸣器电路、电源电路、复位电路、晶振电路几个模块,系统框图如图1所示。

主控模块采用STC89C52RC单片机,按键模块用5个按键,用于调整时间和设定闹钟,显示模块采用LCD1602,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作。

图1 基于AT89C52RC单片机的电子万年历系统框图2、原理图基于STC89C52RC单片机的电子万年历硬件仿真电路图如图10所示,系统由STC89C52RC单片机、按键扫描电路、显示电路、时钟电路、晶振电路、复位电路、蜂鸣器电路组成。

图2 电子万年历仿真图3、各部分介绍(1)、主控模块控制芯片使用STC89C52,控制系统如下图:图3 STC89C52RC主控模块主控制芯片采用STC89C52,系统包括晶振电路、复位电路、下载接口。

(2)、时钟芯片时钟芯片使用DS1302,该模块电路原理图如下图:图4 DS1302时钟电路时钟电路采用的是ds1302芯片,DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

工作电压与单片机的输入电压比较适合。

上面是它的一些基本的应用介绍。

下面是它的引脚的描述:图5 DS1302引脚下面是DS1302的时钟寄存器。

我们要读取的时间数据就是从下面这些数据寄存器中读取出来的。

当我们要想调整时间时,可以把时间数据写入到相应的寄存器中就可以了。

何中文 51单片机和lcd1602的万年历设计

何中文 51单片机和lcd1602的万年历设计

本科毕业设计(论文)题目基于单片机的万年历设计学院电气与自动化工程学院年级06 专业自动化班级学号学生姓名指导教师职称论文提交日期2010-5-24基于单片机的万年历设计摘要古人依靠日冕、漏刻记录时间,而随着科技的发展,电子万年历已经成为日渐流行的日常计时工具。

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

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

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

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

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

关键词:万年历单片机仿真The Calendar of Design based on Single ChipAbstractAncient rely on corona, Louke recording time. The electronic calendar has become the popular tool for the daily timing.as the development of technology.In the calendar system , the STC89C52 is used to control,with the DS1302 clock chip timing, DS18B20 collecting temperature, 1602 LCD Displaying. The system is composed of four modules:the temperature sensor circuit, the MCU control circuit, the display circuit and the correction circuit.This paper describes the hardware works, the functions of each interface module and its working process, demonstrates design theory is Feasibility.. C language is used to program, after debugging in the Keil software,then simulating in the Proteus. The electronic calendar can display year, month, day, week, hours, minutes, seconds, temperature, and has calibration features and functionality with real time synchronization.The results show that this calendar is easy to read, intuitive display, versatile, simple circuits, and many other advantages,The design meets the development trend of electronic instruments and meters, and has broad market prospects.Keywords:Calendar ; MCU ; simulation目录第一章绪论 (1)1.1课题研究的意义 (1)1.2本课题主要的研究工作 (1)1.2.1研究内容 (1)1.2.2论文章节安排 (2)1.3本章小结 (2)第二章单片机的概述 (3)2.1单片机的定义和特点 (3)2.1.1单片机的定义 (3)2.1.2单片机的特点 (3)2.2单片机的发展现状和趋势 (4)2.2.1单片机的发展现状 (4)2.2.2单片机的发展趋势 (5)2.3编程语言的选择 (5)2.4本章小结 (6)第三章设计要求和方案论证 (7)3.1设计要求 (7)3.2单片机芯片的选择方案和论证 (7)3.3显示模块选择方案和论证 (7)3.4时钟芯片的选择方案和论证 (8)3.5温度传感器的选择方案与论证 (8)3.6电路设计最终方案决定 (9)3.7本章小结 (9)第四章系统的硬件设计与实现 (10)4.1电路设计框图 (10)4.2系统硬件概述 (10)4.3主要单元电路的设计 (11)4.3.1 STC89C52单片机简介 (11)4.3.2单片机主控制模块的设计 (13)4.3.3时钟电路模块的设计 (15)4.3.4温度传感器电路设计 (16)4.3.5独立式键盘设计 (19)4.3.6显示模块的设计 (19)4.4本章小结 (21)第五章系统的软件设计 (22)5.1程序流程图 (22)5.1.1系统总流程图 (22)5.1.2温度程序流程图 (23)5.1.3时钟程序流程图 (24)5.1.4液晶显示程序流程图 (25)5.2程序的设计 (26)5.2.1 DS18B20测温程序 (26)5.2.2读写DS1302程序 (27)5.2.3液晶显示程序 (29)5.3本章小结 (29)第六章仿真与调试 (30)6.1软件简介 (30)6.1.1 Keil软件简介 (30)6.1.2 Proteus ISIS简介 (30)6.2 Keil软件调试流程 (31)6.3 Proteus软件运行流程 (33)6.4 万年历的功能仿真 (35)6.5 硬件调试结果 (35)6.6本章小结 (39)第七章总结与展望 (40)参考文献 (41)附录一:系统电路图 (42)附录二:系统PCB板 (43)附录三:系统程序 (44)致谢 (57)第一章绪论1.1课题研究的意义万年历是我国古代传说中最古老的一部太阳历。

单片机万年历C语言程序完整

单片机万年历C语言程序完整
sbit out = P2^3; //立刻跳出调整模式按钮
sbit DQ = P3^0;
char done,count,temp,flag,up_flag,down_flag,t_value;
uchar TempBuffer[5],week_value[2];
void show_time(); //液晶显示程序
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
}SYSTEMTIME;//定义的时间类型
#define AM(X)X
#define PM(X)(X+12)//转成24小时制
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); //地址,命令
ucData = DS1302OutputByte(); //读1Byte数据
DS1302_CLK = 1;
#define DS1302_SECOND0x80 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE0x82
#define DS1302_HOUR0x84
#define DS1302_WEEK0x8A
#define DS1302_DAY0x86
#define DS1302_MONTH0x88
#define uchar unsigned char
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机液晶1206万年历程序主函数程序#include<reg51.h>#include"1602.h"#include"ds1302.h"#include"24c02.h"#include"temp.h"#define uchar unsigned char#define uint unsigned intsbit s1=P3^1; //功能键sbit s2=P3^0; //增加键sbit s3=P3^2; //减小键sbit rd=P3^7;uchar key;uchar miao,fen,shi,ri,yue,temp;uchar nian;void write_sfm(uchar add,uchar date)//写时分秒函数{uchar shi,ge;shi=date/16;//分解一个2位数的十位和个位ge=date&0x0f;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date) //写年月日{uchar ge,shi;shi=date/16;ge=date&0x0f;write_com(0x80+0x00+add);write_date(0x30+shi);write_date(0x30+ge);}void Ds1302Init() //ds1302{miao=0x12;fen=0x12;shi=0x12;ri=0x29;yue=0x09;nian=0x16;Ds1302Write(0x8e,0X00); //禁止写保护,就是关闭写保护功能Ds1302Write(0x80,miao); // 秒Ds1302Write(0x82,fen); //分Ds1302Write(0x84,shi); //时// Ds1302Write(0x8a,zhou); //周Ds1302Write(0x86,ri); //日Ds1302Write(0x88,yue); //月Ds1302Write(0x8c,nian); //年Ds1302Write(0x8e,0x80); //打开写保护功能}void Ds1302ReadTime() //ds1302{miao = Ds1302Read(0x81);fen = Ds1302Read(0x83);shi = Ds1302Read(0x85);// zhou = Ds1302Read(0x87);ri = Ds1302Read(0x87);yue = Ds1302Read(0x89);nian = Ds1302Read(0x8d);}void wendu(int temp){uchar datas[] = {0, 0, 0,0, 0}; //定义数组float tp;if(temp< 0) //当温度值为负数{write_com(0x80+0x00+15);write_date('-'); //显示负temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;}else{write_com(0x80+0x00+15);write_date('+'); //显示正tp=temp;temp=tp*0.0625*100+0.5;}datas[0] = temp / 10000;datas[1] = temp % 10000 / 1000;datas[2] = temp % 1000 / 100;datas[3] = temp % 100 / 10;datas[4] = temp % 10;write_com(0x80+0x40+9);write_date(0x30+datas[0]);write_com(0x80+0x40+10);write_date(0x30+datas[1]); //十位write_com(0x80+0x40+11);write_date(0x30+datas[2]); //个位write_com(0x80+0x40+12);write_date('.'); //显示‘.’write_com(0x80+0x40+13);write_date(0x30+datas[3]); //显示小数点write_com(0x80+0x40+14);write_date(0x30+datas[4]); //显示小数点}void init(){rd=0;lcden=0;key=0;Ds1302Init();init_24c02();write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);write_com(0x80+0x40+2);write_date(':');delay(5);write_com(0x80+0x40+5);write_date(':');delay(5);write_com(0x80+0x00+4);write_date('-');write_com(0x80+0x00+7);write_date('-');write_com(0x80+0x00+0);write_date('2');write_com(0x80+0x00+1);write_date('0');write_com(0x80+0x40+15); //温度部分write_date('C');Ds1302Write(0x8e,0X00); //禁止写保护,就是关闭写保护功能miao=read_add(1);Ds1302Write(0x80,miao); // 秒fen=read_add(2);Ds1302Write(0x82,fen); //分shi=read_add(3);Ds1302Write(0x84,shi); //时ri=read_add(4);Ds1302Write(0x86,ri); //日yue=read_add(5);Ds1302Write(0x88,yue); //月nian=read_add(6);Ds1302Write(0x8c,nian); //年Ds1302Write(0x8e,0x80); //打开写保护功能write_sfm(6,miao);write_sfm(3,fen);write_sfm(0,shi);write_nyr(8,ri);write_nyr(5,yue);write_nyr(2,nian);}void keys(){if(s1==0){delay(5);if(s1==0){key++;while(!s1);if(key==1){write_com(0x80+0x40+6); //秒write_com(0x0f);}if(key==2){write_com(0x80+0x40+3); //分}if(key==3){write_com(0x80+0x40+0); //时}if(key==4){write_com(0x80+0x00+8); //日}if(key==5){write_com(0x80+0x00+5); //月}if(key==6){write_com(0x80+0x00+2); //年}if(key==7){write_com(0x0c);key=0;// Ds1302Write(0,miao);// Ds1302Write(2,fen);// Ds1302Write(4,shi);// Ds1302Write(7,ri);// Ds1302Write(8,yue);// Ds1302Write(9,nian);}}}}void keysj(){if(key!=0){if(s2==0){delay(5);if(s2==0){while(!s2);{if(key==1){miao++;if((miao&0x0f)>9)miao=miao+6;if(miao>=0x60)miao=0;Ds1302Write(0x8e,0x00);Ds1302Write(0x80,miao); //秒数据写入Ds1302Write(0x8e,0x80);write_sfm(6,miao);write_com(0x80+0x40+6);write_add(1,miao);}if(key==2){fen++;if((fen&0x0f)>9)fen=fen+6;if(fen>=0x60)fen=0;Ds1302Write(0x8e,0x00);Ds1302Write(0x82,fen); //秒数据写入Ds1302Write(0x8e,0x80);write_sfm(3,fen);write_com(0x80+0x40+3);write_add(2,fen);}if(key==3)shi++;if((shi&0x0f)>9)shi=shi+6;if(shi>=0x24)shi=0;write_sfm(0,shi);Ds1302Write(0x8e,0x00);Ds1302Write(0x84,shi);Ds1302Write(0x8e,0x80);write_sfm(0,shi);write_com(0x80+0x40+0);write_add(3,shi);}if(key==4){ri++;if((ri&0x0f)>9)ri=ri+6;if(ri==0x31)ri=0;Ds1302Write(0x8e,0x00);Ds1302Write(0x86,ri);Ds1302Write(0x8e,0x80);write_nyr(8,ri);write_com(0x80+0x00+8);write_add(4,ri);}if(key==5){yue++;if((yue&0x0f)>9)yue=yue+6;if(yue==0x13)yue=1;Ds1302Write(0x8e,0x00);Ds1302Write(0x88,yue);Ds1302Write(0x8e,0x80);write_nyr(5,yue);write_com(0x80+0x00+5);write_add(5,yue);if(key==6){nian++;if((nian&0x0f)>9)nian=nian+6;if(nian==99)nian=0;Ds1302Write(0x8e,0x00);Ds1302Write(0x8c,nian);Ds1302Write(0x8e,0x80);write_nyr(2,nian);write_com(0x80+0x00+2);write_add(6,nian);}}}}}}void keyscan(){keys();keysj();if(s3==0){delay(5);if(s3==0){while(!s3);{if(key==1){miao--;if((miao&0x0f)>9)miao=miao-6;if(miao==0)miao=0x59;write_sfm(6,miao);Ds1302Write(0x8e,0x00);Ds1302Write(0x80,miao);//秒数据写入Ds1302Write(0x8e,0x80);write_sfm(6,miao);write_com(0x80+0x40+6);write_add(1,miao);}if(key==2){fen--;if((fen&0x0f)>9)fen=fen-6;if(fen==0)fen=0x59;write_sfm(3,fen);Ds1302Write(0x8e,0x00);Ds1302Write(0x82,fen);Ds1302Write(0x8e,0x80);write_sfm(3,fen);write_com(0x80+0x40+3);write_add(2,fen);}if(key==3){shi--;if((shi&0x0f)>9)shi=shi-6;if(shi==0)shi=0x23;write_sfm(0,shi);Ds1302Write(0x8e,0x00);Ds1302Write(0x84,shi);Ds1302Write(0x8e,0x80);write_sfm(0,shi);write_com(0x80+0x40+0);write_add(0,shi);}if(key==4){ri--;if((ri&0x0f)>9)ri=ri-6;if(ri==0)ri=0x31;Ds1302Write(0x8e,0x00);Ds1302Write(0x86,ri);Ds1302Write(0x8e,0x80);write_nyr(8,ri);write_com(0x80+0x40+8);write_add(4,ri);}if(key==5){yue--;if((yue&0x0f)>9)yue=yue-6;if(yue==0)yue=0x12;Ds1302Write(0x8e,0x00);Ds1302Write(0x88,yue);Ds1302Write(0x8e,0x80);write_nyr(5,yue);write_com(0x80+0x40+5);write_add(5,yue);}if(key==6){nian--;if((nian&0x0f)>9)nian=nian-6;if(nian==0)nian=0x99;Ds1302Write(0x8e,0x00);Ds1302Write(0x8c,nian);Ds1302Write(0x8e,0x80);write_nyr(2,nian);write_com(0x80+0x40+2);write_add(6,nian);}}}}}void main(){init();while(1){wendu(Ds18b20ReadTemp()); // 温度keyscan();if(key==0){Ds1302ReadTime();write_sfm(6,miao);write_add(1,miao);write_sfm(3,fen);write_add(2,fen);write_sfm(0,shi);write_add(3,shi);write_nyr(8,ri);write_add(4,ri);write_nyr(5,yue);write_add(5,yue);write_nyr(2,nian);write_add(6,nian);}if(key!=0){Ds1302Write(0x8e,0X00); //禁止写保护,就是关闭写保护功能Ds1302Write(0x80,miao); // 秒Ds1302Write(0x82,fen); //分Ds1302Write(0x84,shi); //时// Ds1302Write(0x8a,zhou); //周Ds1302Write(0x86,ri); //日Ds1302Write(0x88,yue); //月Ds1302Write(0x8c,nian); //年Ds1302Write(0x8e,0x80); //打开写保护功能}}}Ds1302程序#include"ds1302.h"void Ds1302Write(unsigned char addr, unsigned char dat) //ds1302 {unsigned char n;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1;_nop_();for (n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++){DSIO = dat & 0x01;dat >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}RST = 0;_nop_();}uchar Ds1302Read(uchar addr){uchar n,dat,dat1;EA =0;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1;_nop_();for(n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}_nop_();for(n=0; n<8; n++){dat1 = DSIO;dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;_nop_();}RST = 0;_nop_();SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();EA = 1;return dat;}DS24c02程序#include"1602.h"void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//液晶写命令函数{ lcden=0;rs=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date)//液晶写数据函数{ lcden=0;rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}DS18B20程序#include"24c02.h"void delay0() //24c02{;;}void start() //24c02{sda=1;delay0();scl=1;delay0();sda=0;delay0();}void stop() //24c02{sda=0;delay0();scl=1;delay0();sda=1;delay0();}void respons() //24c02{unsigned char i;scl=1;delay0();while((sda=1)&&(i<250))i++;scl=0;delay0();}void init_24c02() //24c02{sda=1;delay0();scl=1;delay0();}void write_byte(unsigned char date) //24c02 {unsigned char i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay0();sda=CY;delay0();scl=1;delay0();}scl=0;delay0();sda=1;delay0();}unsigned char read_byte() //24c02{unsigned char i,k;scl=0;delay0();sda=1;delay0();for(i=0;i<8;i++){scl=1;delay0();k=(k<<1)|sda;scl=0;delay0();}return k;}void write_add(unsigned char address,unsigned char date) //24c02{start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}char read_add(unsigned char address) //24c02 {unsigned char date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}Ds18b20#include"temp.h"void Delay1ms(unsigned int y){unsigned int x;for(y;y>0;y--)for(x=110;x>0;x--);}unsigned char Ds18b20Init(){unsigned int i;DSPORT=0;i=70;while(i--);DSPORT=1;i=0;while(DSPORT){i++;if(i>5000)return 0;}return 1;}void Ds18b20WriteByte(unsigned char dat) {unsigned int i,j;for(j=0;j<8;j++){DSPORT=0;i++;DSPORT=dat&0x01;i=6;while(i--);DSPORT=1;dat>>=1;}}unsigned char Ds18b20ReadByte() {unsigned char byte,bi;unsigned int i,j;for(j=8;j>0;j--){DSPORT=0;i++;DSPORT=1;i++;i++;bi=DSPORT;byte=(byte>>1)|(bi<<7);i=4;while(i--);}return byte;}void Ds18b20ChangTemp(){Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0x44);}void Ds18b20ReadTempCom(){Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);}int Ds18b20ReadTemp(){int temp=0;unsigned char tmh,tml;Ds18b20ChangTemp();Ds18b20ReadTempCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh;temp<<=8;temp|=tml;return temp;}#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>sbit DSPORT=P2^0;void Delay1ms(unsigned int );unsigned char Ds18b20Init();void Ds18b20WriteByte(unsigned char com); unsigned char Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#endif。

相关文档
最新文档