×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-12-25 发布时间:
|

原理图如下



部分程序如下


单片机源程序如下:

#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)

                        {


关键字:51单片机  LCD12864  万年历

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法