基于51单片机的电子万年历的设计-源代码
电子万年历的设计目录
电子万年历的设计
电子万年历的系统整体设计框图
所需要的元件
DS18B20模块
DS18B20的特点
DS18B20内部结构
DS18B20管脚排列
DS1302模块
SPI时序的初步认识
SPI的四种模式
实时时钟芯片DS1302
5DS1302寄存器介绍
液晶显示模块LCD1602
学校的开发板就有时钟芯片和温度检测模块
具体的电路图 (黄圈的就是)
万年历其实很简单
系统总流程图
温度模块程序流程图
DS1302时钟程序流程图
LCD显示程序流程图
源代码
源代码文件
源代码仿真资源
电子万年历的设计
设计要求:
利用51单片机、专用时钟芯片DS1302、DS18B20数字温度采集器及1602液晶显示器件设计一个万年历;
- 正确显示年月日,时分秒,星期等信息;
- 显示环境温度;
- 能够通过按键调整时间和设置闹钟。
电子万年历的系统整体设计框图
为使时钟走时与标准时间一致,校时电路是必不可少的,键盘模块用来校正液晶上显示的时间;温度传感器则用来检测当前的环境温度;STC89C52单片机通过输出各种电脉冲信号来驱动控制各部分正常工作;而系统的时间、温度等数据则最终通过液晶模块显示出来。
本电路是以STC89C52单片机为控制核心,该芯片具有在线编程功能,功耗低,能在3.3V的超低压下工作;时钟芯片采用DS1302,它是一款高性能、低功耗、自带RAM的实时时钟芯片,具有使用寿命长,精度高和功耗低等特点,同时具有掉电自动保存功能,可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,其工作电压为2.5V~5.5V;温度检测模块由DS18B20构成,它采用独特的单线接口仅需一个端口引脚进行通讯, 具有测量精度高、测量范围广等优点,其测温范围在-55~+125℃,工作电压为3v~5.5v;显示部份使用1602液晶显示屏来实现,该显示屏具有低功耗、寿命长、可靠性高的特点,其工作电压为5v。
所需要的元件
STC89C52单片机
时钟芯片DS1302
温度检测模块DS18B20
LCD 1602
我所采用的51单片机是学校的开发板
DS18B20模块
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
采用单总线的接口方式。与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。
测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。
DS18B20的特点
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:
( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
( 2 )测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.0625°C 。
( 3 )在使用中不需要任何外围元件。
( 4 )持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
( 5 )供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。
( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
( 7 ) 负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
( 8 )掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
DS18B20内部结构
主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作 是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X^8+X^5+X^4+1)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20管脚排列
DS18B20的管脚排列
1. GND为电源 地;
2. DQ为数字信号输入/输出端;
3. VDD为外接供电电源输入端(在寄生电源接线方式时接地)
DS1302模块
SPI时序的初步认识
- SPI :Serial Peripheral Interface 是一种高速的、全双工、同步通信总线。
- 应用:单片机和EEPROM、实时时钟、数字信号处理器
- SSEL:片选,也写做SCS,从设备片选使能信号。
- SCLK:时钟,也写作SCK,由主机产生,和SCL类似
- MOSI:主机输出从机输入,Master Output/Slave Input,主机给从机发送指令或者数据的通道。
- MISO:主机输入从机输出,Master Input/Slave Output,主机读取从机的状态或者数据的通道
SPI的四种模式
- CPOL:Clock Polarity,即时钟极性。
- 空闲状态为高电平,则CPOL=1,空闲状态为低电平,则CPOL=0。
- CPHA:Clock Phase,即时钟相位。
- CPHA=1表示数据的输出是在一个时钟周期的第一个沿。CPHA=0表示数据的采样是在一个时钟周期的第一个沿。
实时时钟芯片DS1302
- 1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
- 2、拥有31字节数据存储RAM。
- 3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
- 4、DS1302的工作电压比较宽,在2.0~5.5V的范围内都可以正常工作。
- 5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
- 6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。
- 7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
- 8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样做是为了在系统掉电的情况下,我们的时钟还会继续走。
引脚编号 |
引脚名称 |
引脚功能 |
1 |
Vcc2 |
主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由Vcc2供电,当Vcc2低于Vcc1时,由Vcc1供电。 |
2 |
X1 |
这两个引脚需要接一个32.768K的晶振,给DS1302提供一个基准。特别注意,要求这个晶振的引脚负载电容必须是6pF,而不是要加6pF的电容。如果使用有源晶振的话,接到X1上即可,X2悬空。 |
3 |
X2 |
|
4 |
GND |
接地。 |
5 |
CE |
DS1302的使能输入引脚。当读写DS1302的时候,这个引脚必须是高电平,DS1302这个引脚内部有一个40k的下拉电阻。 |
6 |
I/O |
这个引脚是一个双向通信引脚,读写数据都是通过这个引脚完成。DS1302这个引脚的内部含有一个40k的下拉电阻。 |
7 |
SCLK |
输入引脚。SCLK是用来作为通信的时钟信号。DS1302这个引脚的内部含有一个40k的下拉电阻。 |
8 |
Vcc1 |
备用电源引脚。 |
5DS1302寄存器介绍
液晶显示模块LCD1602
本设计中由于要对时间、温度进行显示,所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。将L1602的RS端和P2.0,R/W端和P2.1, E 端和P2.2相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。
学校的开发板就有时钟芯片和温度检测模块
具体的电路图 (黄圈的就是)
万年历其实很简单
系统总流程图
电子万年历设计题目的系统总流程图如图8.1所示。流程图分析:首先系统初始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间、温度等数据送入液晶屏显示;在修改时间模式下设置时间完成后再送数据到液晶屏显示。
温度模块程序流程图
温度读取流程图如图8.2所示。流程图分析:开始进入初始化DS18B20,就是通过主机拉低单线产生复位脉冲然后释放该线,如果有应答脉冲,即发起ROM命令当成功的执行操作命令后,就使用Convert T命令即开始温度转换,当转换完后,又初始化DS18B20是否有应答脉冲,若有,就发起Read Scratchpad(读取暂存器和CRC字节)命令,既同时读出第1,2个字节,即为温度的数据。
DS1302时钟程序流程图
时钟流程图如图8.3所示。流程图分析:DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的数据送入液晶屏显示。这时若有设置键按下时,进行时间修改,完成后将数据送入时钟芯片;若没有按键按下,则直接存入EPROM,送入液晶屏显示。
LCD显示程序流程图
显示程序流程图如图8.4。流程图分析:首先对1602显示屏进行初始化(初始化大约持续10ms左右),然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止。
源代码
/*
对了,有问题要自己学会找问题,别什么都来问我,我不是你们爹
2021.6.18
端口自己改哈
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include "eeprom52.h"
#include "intrins.h"
bit flag_200ms ;
bit flag_100ms ;
sbit beep = P2^3; //蜂鸣器定义
bit flag_beep_en;
uint clock_value; //用作闹钟用的
sbit dq = P2^2; //18b20 IO口
uint temperature ; //温度
uchar menu_1,menu_2;
uchar key_time,flag_value; //连加中间变量
bit key_500ms ;
uchar n_nian,n_yue,n_ri,RP; //显示的函数
#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;open1 = 1;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; //释放总线dat >>= 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; //返回读出的温度 带小数
}void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)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); switch(week){case 1:write_data('M');//星期数为1时,显示write_data('O');write_data('N');break;case 2:write_data('T');//星期数据为2时显示write_data('U');write_data('E');break;case 3:write_data('W');//星期数据为3时显示write_data('E');write_data('D');break;case 4:write_data('T');//星期数据为4是显示write_data('H');write_data('U');break;case 5:write_data('F');//星期数据为5时显示write_data('R');write_data('I');break;case 6:write_data('S');//星期数据为6时显示write_data('T');write_data('A');break;case 7:write_data('S');//星期数据为7时显示write_data('U');write_data('N');break;}
}void init_1602_ds1302()
{write_sfm2_ds1302(1,1,shi); //显示时write_sfm2_ds1302(1,4,fen); //显示分write_sfm2_ds1302(1,7,miao); //显示秒write_week(2,12,week);//显示星期write_sfm3_18B20(1,12,temperature); //显示温度write_sfm2_ds1302(2,2,nian); //显示年write_sfm2_ds1302(2,5,yue); //显示月 write_sfm2_ds1302(2,8,ri); //显示日 write_sfm2_ds1302(2,8,ri); //显示日 write_sfm2_ds1302(1,10,RP);//显示闰年平年
} void init_time0() //定时器0初始化程序
{EA = 1; //开总中断TMOD = 0X01; //定时器0、工作方式1ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时
}void menu_dis()//闹钟报警
{static uchar mm,value;if(flag_100ms == 1) //100ms执行一次{flag_100ms = 0;if(open1 == 1) //如果闹钟打开{if((miao == 0) && (fen == fen1) && (shi == shi1)) { flag_beep_en = 1; //有报警蜂鸣器响标志位 } if(flag_beep_en == 1) //闹钟以被打开{clock_value++;if(clock_value <= 30) beep = ~beep; //蜂鸣器叫3秒else if(clock_value > 30){beep = 1; //蜂鸣器停1秒if(clock_value > 40)clock_value = 0;}}// 1 分钟后关闭闹钟value ++;if(value >= 10){value = 0;mm++;if(mm >= 60){mm = 0;flag_beep_en = 0;beep = 1; }} }} }uchar key_can;void key() //独立按键程序
{static uchar key_new;key_can = 20;P3 |= 0xff;if((P3 & 0xff) != 0xff) //按键按下{delay_1ms(1); //按键消抖动if(((P3 & 0xff) != 0xff) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P3 & 0xff){case 0xef: key_can = 4; break; //得到按键值case 0xdf: key_can = 3; break; //得到按键值case 0xbf: key_can = 2; break; //得到按键值case 0x7f: key_can = 1; break; //得到按键值}} }else key_new = 1;
}void key_with()//设置函数
{if(key_can == 1) //设置键{menu_1++;if(menu_1 == 1) //设置时间{menu_2 = 1;write_string(1,0," : : W: "); write_string(2,0," 20 - - "); }if(menu_1 == 2) //设置闹钟{menu_2 = 1;write_string(1,0," set clock "); write_string(2,0," Y 00:00 "); }if(menu_1 > 2) //回到正常显示{menu_1 = 0;write_guanbiao(1,2,0); //关闭光标init_1602_dis_csf(); //初始化液晶显示 }}if(key_can == 2) //选择键{flag_200ms = 1;if(menu_1 == 1) //设置时间{menu_2 ++;if(menu_2 > 7)menu_2 = 1;}if(menu_1 == 2) //设置闹钟{menu_2 ++;if(menu_2 > 3)menu_2 = 1; }}if(menu_1 == 1){if(menu_2 == 1) //设置时{if(key_can == 3) //加{shi+=0x01;if((shi & 0x0f) >= 0x0a)shi = (shi & 0xf0) + 0x10; ///***shi & 0xf0低四位清零,(shi & 0xf0) + 0x10向高位进1(高四位加1)***/// if(shi >= 0x24)shi = 0;} if(key_can == 4) //减{if(shi == 0x00) shi = 0x24;if((shi & 0x0f) == 0x00) shi = (shi | 0x0a) - 0x10; ///***如果个位为0,高四位减1***///shi -- ; } }if(menu_2 == 2) //设置分{if(key_can == 3) //加{fen+=0x01;if((fen & 0x0f) >= 0x0a)fen = (fen & 0xf0) + 0x10;if(fen >= 0x60)fen = 0;} if(key_can == 4) //减 {if(fen == 0x00)fen = 0x5a;if((fen & 0x0f) == 0x00)fen = (fen | 0x0a) - 0x10;fen -- ;} }if(menu_2 == 3) //设置秒{if(key_can == 3) //加{miao+=0x01;if((miao & 0x0f) >= 0x0a)miao = (miao & 0xf0) + 0x10;if(miao >= 0x60)miao = 0;} if(key_can == 4) //减 {if(miao == 0x00)miao = 0x5a;if((miao & 0x0f) == 0x00)miao = (miao | 0x0a) - 0x10;miao -- ; }}if(menu_2 == 4) //设置星期{if(key_can == 3) //加{week+=0x01;if((week & 0x0f) >= 0x0a)week = (week & 0xf0) + 0x10;if(week >= 0x08)week = 1;} if(key_can == 4) //减 {if(week == 0x01)week = 0x08;if((week & 0x0f) == 0x00)week = (week | 0x0a) - 0x10;week -- ;} }if(menu_2 == 5) //设置年{if(key_can == 3) //加{nian+=0x01;if((nian & 0x0f) >= 0x0a)nian = (nian & 0xf0) + 0x10;if(nian >= 0x9a)nian = 1;} if(key_can == 4) //减 {if(nian == 0x01)nian = 0x9a;if((nian & 0x0f) == 0x00)nian = (nian | 0x0a) - 0x10;nian -- ; } }if(menu_2 == 6) //设置月{if(key_can == 3) //加{yue+=0x01;if((yue & 0x0f) >= 0x0a)yue = (yue & 0xf0) + 0x10;if(yue >= 0x13)yue = 1;} if(key_can == 4) //减 {if(yue == 0x01)yue = 0x13;if((yue & 0x0f) == 0x00)yue = (yue | 0x0a) - 0x10;yue -- ; } }if(menu_2 == 7) //设置日{if(key_can == 3) //加{ri+=0x01;if((ri & 0x0f) >= 0x0a)ri = (ri & 0xf0) + 0x10;if(ri >= 0x32)ri = 0; } if(key_can == 4) //减 {if(ri == 0x01)ri = 0x32;if((ri & 0x0f) == 0x00)ri = (ri | 0x0a) - 0x10;ri -- ; } }write_sfm2_ds1302(1,2,shi); ///第一行第二字节开始显示时///write_sfm2_ds1302(1,5,fen); //显示分write_sfm2_ds1302(1,8,miao); //显示秒write_sfm1(1,14,week); //显示星期 write_sfm2_ds1302(2,3,nian); //显示年write_sfm2_ds1302(2,6,yue); //显示月write_sfm2_ds1302(2,9,ri); //显示日switch(menu_2) // 光标显示{case 1: write_guanbiao(1,2,1); break;case 2: write_guanbiao(1,5,1); break;case 3: write_guanbiao(1,8,1); break;case 4: write_guanbiao(1,14,1); break;case 5: write_guanbiao(2,3,1); break;case 6: write_guanbiao(2,6,1); break;case 7: write_guanbiao(2,9,1); break;}write_time(); //把时间写进去}
/***************设置闹钟*********************/if(menu_1 == 2){if(menu_2 == 1) //设置闹钟开关{if(key_can == 3) {open1 = 1; //闹钟开} if(key_can == 4) {open1 = 0; //闹钟关} }if(menu_2 == 2) //设置闹钟时{if(key_can == 3) //加{shi1+=0x01;if((shi1 & 0x0f) >= 0x0a)shi1 = (shi1 & 0xf0) + 0x10;if(shi1 >= 0x24)shi1 = 0;} if(key_can == 4) //减 {if(shi1 == 0x00)shi1 = 0x5a;if((shi1 & 0x0f) == 0x00)shi1 = (shi1 | 0x0a) - 0x10;shi1 -- ;} }if(menu_2 == 3) //设置秒{if(key_can == 3) //加{fen1+=0x01;if((fen1 & 0x0f) >= 0x0a)fen1 = (fen1 & 0xf0) + 0x10;if(fen1 >= 0x60)fen1 = 0;} if(key_can == 4) //减 {if(fen1 == 0x00)fen1 = 0x5a;if((fen1 & 0x0f) == 0x00)fen1 = (fen1 | 0x0a) - 0x10;fen1 -- ; }}if(open1 == 1)write_string(2,4,"Y"); else write_string(2,4,"N"); write_sfm2_ds1302(2,7,shi1); //显示闹钟时write_sfm2_ds1302(2,10,fen1); //显示闹钟分switch(menu_2) // 光标显示{case 1: write_guanbiao(2,4,1); break;case 2: write_guanbiao(2,7,1); break;case 3: write_guanbiao(2,10,1); break;} write_eeprom(); //保存闹钟时间}
}/*****************主函数********************/
void main()
{ P0 = P1 = P2 = P3 = 0xff;init_time0();init_1602(); //lcd1602初始化init_1602_dis_csf(); //lcd1602初始化显示init_eeprom(); //开始初始化保存的数据temperature = read_temp(); //先读出温度的值delay_1ms(650);temperature = read_temp(); //先读出温度的值while(1){//判断闰年。平年 RP标志位if(nian%400==0)RP=0;else{if(nian%4==0&&nian%100!=0)RP=0;elseRP=1;}key(); //按键程序if(key_can < 10){if(flag_beep_en == 0) //只有闹钟关了的时候才能进入设置key_with(); else {flag_beep_en = 0; //按下任意键关闭闹钟beep = 1;clock_value = 0;read_time();}}if(flag_200ms == 1){ flag_200ms = 0;if(menu_1 == 0){read_time(); //读时间temperature = read_temp(); //先读出温度的值init_1602_ds1302(); //显示时钟}}menu_dis(); //闹钟报警函数delay_1ms(1);}
}/**************定时器0中断程序*****************/
void time0() interrupt 1
{ static uchar value;TH0 = 0X3C;TL0 = 0XB0; //50msvalue ++; if((value % 2) == 0) //100ms flag_100ms = 1; if(value >= 6) //200ms{value = 0;flag_200ms = 1;}
}
源代码文件
链接: 点我(百度云)
提取码: tshw
源代码仿真资源
基于51单片机的电子万年历的设计-源代码-电路仿真图https://download.csdn.net/download/Delisa/85299462
基于51单片机的电子万年历的设计-源代码相关推荐
- 万年历设计单片机c语言,基于51单片机的电子万年历的设计
基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...
- 基于51单片机的电子万年历的设计
(24条消息) 基于51单片机的电子万年历的设计说明书(完整word版本说明书+原理图+代码)资源-CSDN文库 摘 要 电子万年历是单片机系统的一个应用,由硬件和软件相配合使用.硬件由主控器.时钟电 ...
- 【002】基于51单片机的电子万年历proteus仿真设计
一.资料内容(私信获取) (1).基于51单片机的电子万年历proteus仿真设计一份: (2).基于51单片机的电子万年历proteus仿真设计keli源代码一份: (3).基于51单片机的电子万年 ...
- 基于51单片机的电子万年历设计
基于51单片机的电子万年历 1)LCD1602显示时间.日期.星期.温度 2)按键可调整时间日期星期 3)整点报时 4)DS1302时钟芯片 5)DS18B20温度传感器 6)闹钟功能 7)判断闰年 ...
- 基于51单片机智能电子密码锁的设计
该题目是作者课程设计时所写题目,隔了段时间了,之前一直放到自己的网站上的,现在网站资源过期了,就放到这里保存了. 题目要求如下: 内容及要求 以MCS-51单片机为核心,设计一个通过面板键盘输入密码的 ...
- c语言编写闹钟主程序流程图,基于STC15W4K58S4单片机的电子万年历设计源码与报告(数码管显示)...
基于STC15W4K58S4单片机的电子万年历(数码管显示)该压缩包包含源码TXT文件 源工程文件(Keil uVision4文件)和课程设计报告 电子时钟的设计 -单片机综合设计报告 目录 1 任 ...
- 基于51单片机的电子时钟设计
基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...
- 基于51单片机的电子血压温度计(单片机健康检测系统设计)proteus仿真设计(仿真+程序+演示视频)
基于51单片机的电子血压温度计proteus仿真设计 (仿真+程序+演示视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:S0026 演示视频: 51单片机的 ...
- 基于51单片机的lcd1602万年历设计_温度+闹钟心得
基于51单片机的lcd1602万年历设计_温度+闹钟心得 下载地址 https://download.csdn.net/download/weixin_44017446/10908985 当看到这个学 ...
最新文章
- 哈希(Hash)算法是一种单向密码体制(它是一个从明文到密文的不可逆的映射只有加密过程没有解密过程)
- http://www.huihoo.com/ 灰狐网站 Linux 专业网站
- 软件测试学习笔记:找代码中的fault,并设计特定的测试用例
- Android压缩文件(压缩目录)
- Random Forest 实用经验(转)
- Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?
- 牛客网暑期ACM多校训练营(第三场)
- mysql sql%rowcount_sql%rowcount 返回影响行数
- java list resultset_Java工具类 通过ResultSet对象返回对应的实体List集合
- dockerHub国内镜像设置
- 堆排序的Python实现
- 信息化工程监理规范_房建工程监理资料管理存在的问题及应对措施
- Pulseaudio之meson编译(十二)
- [Beta阶段]第十次Scrum Meeting
- php整人代码,HTML代码整人。。
- 手把手教你使用python的zipfile模块巧解word批量生成问题
- animation动画及3D
- html5获取蓝牙设备列表,【报Bug】官方H5+示例中 搜索蓝牙设备,部分机型搜索不到任何蓝牙...
- 修改css样式后刷新网页无改变
- 按键精灵 官方废了 , 不更新了