51单片机+LCD12864的万年历Proteus仿真

发布者:beta12最新更新时间:2020-01-29 来源: 51hei关键字:51单片机  LCD12864  万年历 手机看文章 扫描二维码
随时随地手机看文章

原理图如下

QQ图片20190611101147.png

部分程序如下
QQ图片20190611101259.png

单片机源程序如下:

#include

#include "DS18B20.h"

#include "DS1302.h"

#include "LCD12864.h"


char a;

sbit KEY1=P3^4;

sbit KEY2=P3^5;

sbit KEY3=P3^6;


bit  flag=1; //进入/退出设置标志

uchar  choose=0x01; //切换标志

void delay10(void) //延时10ms

{

        unsigned char i,j;

        for(i=0;i<255;i++)

        for(j=0;j<200;j++);

}

void delay5ms(void)   //误差 0us

{

    unsigned char a,b;

    for(b=19;b>0;b--)

        for(a=130;a>0;a--);

}


//设置时ds1302寄存器值循环 如秒寄存器59时加一变为00

unsigned char conver(unsigned char a,unsigned char b,unsigned char c)

{        


        if((a&0x0f)==0x0a) a=a+6;

          if(a==b)  a=c;

        return a;  

}


void digplay() {


        //时间

                ShowNumber16_32(2,0,TIME[2]>>4&0x03); //时 十位

                ShowNumber16_32(2,16, TIME[2]&0x0f);//时  个位

                 ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分  十位

                ShowNumber16_32(2,64, TIME[1]&0x0f);//分  个位

                ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位

                ShowNumber16_32(2,112, TIME[0]&0x0f);//秒  个位

                

                

                //日期

                ShowNumber(0,0,2);

                ShowNumber(0,8,0);

    ShowNumber(0,16,TIME[6]>>4&0x0f);

          ShowNumber(0,24, TIME[6]&0x0f);//年

                

          ShowNumber(0,40,TIME[4]>>4&0x01);

          ShowNumber(0,48, TIME[4]&0x0f);//月

                

                ShowNumber(0,64,TIME[3]>>4&0x03);

                ShowNumber(0,72, TIME[3]&0x0f);//日


          ShowChina(0,112,(TIME[5]&0x07)-1);//周

}

void wendu() {

                //温度

                a=Read_Temperature();          //读取DS18B20的温度

                if(a<0)                                          //处理温度正负

                {        

                                a = (-1)*a;         // 取补

                                ShowNumber(6,88,11);          //温度计图标—

                 }

                 else 

                { 

                                         ShowNumber(6,88,12);//温度计图标+

                 }

                        ShowNumber(6,96,a/10%10);  //显示温度中位

           

                ShowNumber(6,104,a%10);           //显示温度低位


}


void digplaystart() {//开机显示

        uchar i=0;

                ShowChina(2,64-16*1.5,19);

                ShowChina(2,64-16*0.5,20);

                ShowChina(2,64+16*0.5,21);

                ShowChina(2,64+16*1.5,22);

        for (i=0;i<10;i++) {

        ShowNumber(4,32+8*i,16);           

                delay5ms();

                delay5ms();

        }

        ClearScreen(0);//清屏

}


void main(void) 

{        

        uchar i;

        InitLCD();          //初始化LCD12864

        digplaystart();

        delay5ms();

        Ds1302Init();//Ds1302初始化,并且附上设定的默认时间

        a=Read_Temperature();          //读取DS18B20的温度

                        ShowNumber(0,32,11);//-

                ShowNumber(0,56,11);//-

                ShowChina(0,96,7);//汉字周

          ShowNumber16_32(2,32,10);//:

                ShowNumber16_32(2,80,10);//:

                ShowChina(6,112,8);//℃

        while(1)

        {

                wendu();//温度显示

                if(flag==1) 

                                Ds1302ReadTime();                

                                        //读取DS1302的时间

                else  

                Ds1302WriteTime();


if(KEY1==0)                                  //按键1--处理设定时间和返回

                {

                        delay10();

                        if(KEY1==1)

                        {

                                delay10();

                                flag=~flag;        

                                

                                if(flag==0) {

                                ShowChina(6,48,9);

                                ShowChina(6,0,16);

                                ShowChina(6,16,17);

                                ShowNumber(6,32,10);

                                }

                                if(flag==1) {

                                                for( i=0;i<8;i++) {

                                                        ShowNumber(6,8*i,15);

                                        }

                                }

                        }

                }


                if(KEY2==0)                                  //按键2--处理选择设定时间的项目

                { 

                        delay10();

                        if(KEY2==1)

                        {

                                delay10();

                                choose++;

                                ShowChina(6,48,8+choose);

[1] [2]
关键字:51单片机  LCD12864  万年历 引用地址:51单片机+LCD12864的万年历Proteus仿真

上一篇:单片机带时钟1602计算器终极程序
下一篇:基于51单片机的LD3320的例程(口令模式+IO口控制程序)

推荐阅读最新更新时间:2024-11-05 11:28

从零开始51单片机教程 —— 14 单片机逻辑与或异或指令详解
单片机逻辑与或异或指令详解 ANL A,Rn ;A与Rn中的值按位'与',结果送入A中 ANL A,direct ;A与direct中的值按位'与',结果送入A中 ANL A,@Ri ;A与间址寻址单元@Ri中的值按位'与',结果送入A中 ANL A,#data ;A与立即数data按位'与',结果送入A中 ANL direct,A ;direct中值与A中的值按位'与',结果送入direct中 ANL direct,#data ;direct中的值与立即数data按位'与',结果送入direct中。 这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与 例:71H和56H相与则将两数写成二进制形式: (
[单片机]
基于51单片机的电压表-数码管显示
一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路,该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0~9V的电压值,并在四位LED数码管上显示电压值。如图: 二.设计功能 (1)ADC0832模数转换,0-9V电压测量; (2)4位数码管显示测量电压值; (3)10K可调电阻模拟电压测试; (4)当提供电源电源为精准的5V电源时,精度为正负0.02V; 三.设计原理图 (1)原理图主要采用AD软件进行设计,如图: (2)Protues仿真图如下: 四.软件设计 (1)程序流程图 (2)主程序源码 /**************
[单片机]
基于<font color='red'>51单片机</font>的电压表-数码管显示
基于51单片机和nRF905的无线通信装置的设计
0 引言 随着当前网络通信技术的高速发展,人们对各类场合下的无线通信的需求也随之增高。在短距离低成本的无线通信的应用中,基于51单片机以及Nordic公司的nRF905无线通信芯片的应用方案被广泛采用。比如,文献设计了一种基于51单片机与nRF905收发器的无线智能控制交通灯,文献设计了一种基于AT89S52和nRF905的无线遥控系统。 本文设计了一种基于AT89S52单片机和nRF905的无线通信装置。该装置适用于小范围的室内无线点对点文字信息交换应用。 1 系统总体设计 本文设计的装置是由发送和接收两个完全相同的节点模块构成,图1所示为系统示意图。需发送的信息通过PC机上的客户端软件输入,接收的信息显示在节点模
[单片机]
基于<font color='red'>51单片机</font>和nRF905的无线通信装置的设计
51单片机温度控制电路
51单片机温度控制电路 单片机硬件系统框图
[单片机]
<font color='red'>51单片机</font>温度控制电路
51单片机(AT89C52)定时器
#include #define uchar unsigned char #define uint unsigned int uchar i,temp; void init() { TMOD=0x01; TH0=(65536-46080)/256; TL0=(65536-46080)%256; ET0=1; EA=1; TR0=1; } void main() { i=0; temp=0x01; init(); while(1); } void timer0() interrupt 1 { TH0=(65536-46080)/256; TL0=(65536-46080)%256;
[单片机]
<font color='red'>51单片机</font>(AT89C52)定时器
基于MCS-51单片机的数码管显示自加1功能的实现
 本文主要介绍基于MCS-51单片机的数码管显示实现自加1功能,从1一直显示到999.以下是硬件电路图、功能实现图以及源代码。(电路:使用74HC573锁存器控制段选,74H138控制位选;) 实现数码管自加的代码:   #include reg52.h   #define uchar unsigned char   #define uint unsigned int   uchar code table = {0x3f,0x06,0x5b,0x4f,   0x66,0x6d,0x7d,0x07,0x7f,   0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //
[单片机]
基于MCS-<font color='red'>51单片机</font>的数码管显示自加1功能的实现
51单片机对SAA7113初始化和控制的程序
  用51单片机对7113初始化和控制   SAA7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过I2C总线来进行,很多可以控制I2C总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。   51单片机和7113的硬件连接非常简单,只要把单片机的两个I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管脚相连,再加上上拉电阻即可。   用单片机初始化7113的主要任务是程序的编写,首先要熟悉I2C总线协议,根据I2C总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出读写寄
[单片机]
51单片机PWM控制电机
小时候玩的四驱车,给直流马达接通电源就嗤嗤的跑出去了。电机种类众多,就属控制直流电机最简单,只要对调正负极就能改变电机的转向。另外,直流电机负载能力强,适合做越野车的驱动电机。为了做可调速的越野车,就有了这篇文章。 电源电压输出是固定的,电机的转速也因此是固定的,为了调节电机的转速,就得改变电源电压的输出(为嘛要改变电机转速?举个简单的列子,双电机驱动小车-一边一个电机-如何实现转向?让两边轮胎上的速度不同即可)。how?用PWM调制的方法,把恒定的直流电源电压调制成频率一定宽度可变的脉冲电压序列,从而可以改变平均输出电压的大小,以调节电机的转速。电源电压在此处就是51MCU的引脚输出,4.5-5V,只要在引脚上产生频率可调
[单片机]
<font color='red'>51单片机</font>PWM控制电机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved