历史上的今天
今天是:2024年12月16日(星期一)
2019年12月16日 | 自己制作的单片机万年历 程序+原理图
2019-12-16 来源:51hei
单片机万年历仿真原理图如下
仿真

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; open1 = 1; a_a = 1; write_eeprom(); //保存数据 } } /***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 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(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_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 } /******************写星期函数*******************/ void write_week(uchar hang,uchar add,uchar week)//写星期函数 { if(hang==1) write_com(0x80+add); else write_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'); for(j=0;j<120;j++);
史海拾趣
|
WinCE里面做Win32应用程序,十分郁闷的就是其控件Z次序分配与VS里面完全相反,VS里面后创建的控件在前,但是在CE里面却是先创建的控件在前,造成很多不便,比如说要声明一个Group Button,再以这个Group Button作为父窗口在里面再创建 ...… 查看全部问答> |
|
做一个登陆界面,输入一个四位的密码,若密码错误,就弹出错误消息 类 class CPASSWORDDlg : public CDialog {} 然后函数 BOOL CPASSWORDApp::InitInstance() { CPASSWORDDlg dlg;   ...… 查看全部问答> |
|
描述:MSP430F6638IO端口中断时,它的IO端口捕捉中断时是捕捉的上升沿还是下降沿?我知道能在PXIES中设置,相应的位为0时是上升沿,为1时是下降沿中断,但是如果初始化时不设置的话也就是默认的话是上升沿还是下降沿捕捉中断呢?手册上是说PXIES复 ...… 查看全部问答> |
|
【Nucleo+BLUENRG心得】+无意连接出错! 昨天再试BLUENRG时,居然出现以下错误! 而设备管理器中,ST-LINK还是正常的! 找找ST有没有配套擦除工具:STM32 ST-LINK Utility 擦除时要按着B1,然后才可以擦除。 … 查看全部问答> |
|
天猫盒子,还是那时候0.01元抢购的,相信当时有不少坛友也抢到了。盒子用了这么久,还不错。期间优酷什么的被禁了,但是上有政策下有对策。装了泰捷视频,继续满血复活。闲话不说了,拉回主题。这个盒子有个主要的问题,就是遥控器。 ...… 查看全部问答> |




