毕业设计| 谁的大学没有一个万年历

2023-04-24  

先来看下功能有哪些:

1、可以显示当前时间、星期、日期

2、可以修改当前时间、星期、日期

3、可以获取环境的温度,并显示到LCD

4、可以设置闹钟,当时间到蜂鸣器鸣叫、按下按键后关闭鸣叫


主控选择:STC89C52RC

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。目前STC89C52还是有一些市场的。


显示屏选择:LCD1602

LCD1602不用说了,硬件毕设最常见的。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。


时钟芯片选择:DS1302

DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。


温度传感器选择:DS18B20

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。[1] DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。


外围器件:按键、蜂鸣器、开关、纽扣电池、电位器、三极管


原理图设计上,首先是单片机的最小系统,包含供电、晶振、复位电路。


显示屏电路:数据线接到P0,注意要接1K上拉电阻

时钟芯片电路:3个引脚接到单片机IO口控制


#include "reg52.h"       //此文件中定义了单片机的一些特殊功能寄存器

#include "ds1302.h"

#include "temp.h"

#include "lcd.h"

#include "eeprom.h"


sbit k1 = P1^0;        //按键

sbit k2 = P1^1;       

sbit k3 = P1^2;

sbit k4 = P1^3;


sbit lcdled = P2^4;        //lcd背光

sbit beep = P1^4;      //蜂鸣器


unsigned int ti=0,alarm=0;       //修改第几个时间参数 、修改第几个闹钟参数

unsigned char alarm_hour=0x12,alarm_min=0x00;   //闹钟时、分参数


enum Mode        //定义枚举、三种模式

{

  DISPLAYDATA,MODIFYDATA,SETALARMCLOCK,NONE,ALARMCLOCK

}mode;


enum Alarmswitch   //定义闹钟开关

{

  OFF,ON

}alarmswitch;


/*********延时函数***********/      

void delay(unsigned int t)   //短延时

{

   while(t--);

}

void delay_ms(unsigned int t)  //毫秒延时

{

  unsigned int a,b;

  for(a=0;a  for(b=0;b<120;b++);

}


/********显示日期、时间、星期***********/

void display_data(void)

{

  LcdWriteCom(0x80);

  LcdWritestr("20");  

  LcdWriteData(TIME[6]/16+0x30);    //年

  LcdWriteData(TIME[6]%16+0x30);

  LcdWriteData('-');

  LcdWriteData(TIME[4]/16+0x30);    //月

  LcdWriteData(TIME[4]%16+0x30);

  LcdWriteData('-');

  LcdWriteData(TIME[3]/16+0x30);    //日

  LcdWriteData(TIME[3]%16+0x30);


  LcdWritestr("  ");

  switch(TIME[5])             //显示星期

  {    

    case 0:LcdWritestr("Mon"); break;

    case 1:LcdWritestr("Tue"); break;

    case 2:LcdWritestr("Wed"); break;

    case 3:LcdWritestr("Thu"); break;

    case 4:LcdWritestr("Fri"); break;

    case 5:LcdWritestr("Sat"); break;

    case 6:LcdWritestr("Sun"); break;

  }

  if(alarmswitch==ON)LcdWriteData('.');

  else LcdWriteData(' ');


  LcdWriteCom(0xC0);

  LcdWriteData(' ');

  LcdWriteData(TIME[2]/16+0x30);    //时

  LcdWriteData(TIME[2]%16+0x30);

  LcdWriteData(':');

  LcdWriteData(TIME[1]/16+0x30);    //分

  LcdWriteData(TIME[1]%16+0x30);

  LcdWriteData(':');

  LcdWriteData(TIME[0]/16+0x30);    //秒

  LcdWriteData(TIME[0]%16+0x30);

  LcdWritestr(" ");

}


/*********显示温度***********/

void displaytemp(int temp)    //显示温度

{

     float tp;  

  static char flag = 1;

  if(temp< 0)      

    {

    LcdWriteCom(0xca);

    LcdWriteData('-'); 

    temp=temp-1;

    temp=~temp;

    tp=temp;

    temp=tp*0.0625*100+0.5;  

 

    }

   else

    {      

    LcdWriteCom(0xca);

    LcdWriteData('+'); 

    tp=temp;

    temp=tp*0.0625*100+0.5;  

  }

    if(flag)

    {

      flag =0;

      temp = 2600;

    }

  if(temp==8500)

    return ;

  LcdWriteData(temp % 10000 / 1000 + 0x30);

  LcdWriteData(temp % 1000 / 100  + 0x30);

  LcdWriteData('.');

  LcdWriteData(temp % 100 / 10 + 0x30);

  LcdWriteData(temp % 10 + 0x30);

}



/*******************************************************************************

* 函 数 名         : keypros

* 函数功能       : 按键处理函数,判断按键K1是否按下

*******************************************************************************/

void keypros()       //初始页面按键检测

{

  if(k1 == 0)         //切换模式

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k1==0)   //再次判断按键是否按下

    {

      mode+= 1;if(mode == 3)mode = DISPLAYDATA;

    }

    while(k1 == 0);

  }

  else if(k2 == 0)        //蜂鸣器测试

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k2==0)   //再次判断按键是否按下

    {

      beep = !beep;  

    }

    while(k2 == 0);

  }

  else if(k3 == 0)       //背光灯测试

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k3==0)   //再次判断按键是否按下

    {

      lcdled = !lcdled;  

    }

    while(k3 == 0);

  }

  else if(k4 == 0)      //背光灯测试

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k4==0)   //再次判断按键是否按下

    {

      alarmswitch=!alarmswitch;  

    }

    while(k4 == 0);

  }    

}


/*************修改时间************/

void modify(void)

{

  static int time=0;

  time++;

  if(k1 == 0)      //切换模式

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k1==0)   //再次判断按键是否按下

    {

      mode+= 1;if(mode == 3)mode = DISPLAYDATA;

    }


    while(k1 == 0);

  }

  else if(k2 == 0)       //选择修改参数

  {

    delay(1000);   //消除抖动 一般大约10ms

    if(k2==0)   //再次判断按键是否按下

    {

      ti++; 

      if(ti == 8)ti=0; 

    }

    while(k2 == 0);

  }

  else if(k3 == 0 ||k4 == 0)

  switch(ti)           //选择进入修改参数

  {

    case 0:

            if(k4==0 | k3==0)

            {

              delay(1000);   //消除抖动 一般大约10ms

              if(k4==0 | k3 ==0)   //再次判断按键是否按下

              {

                 TIME[0]=0;

              }

              while(k4 == 0 | k3==0);

            }

            

            break;    //?

    case 1:

            if(k3==0)

            {

              delay(1000);   //消除抖动 一般大约10ms

              if(k3 ==0)   //再次判断按键是否按下

              {

                 TIME[1]++;

                 if(TIME[1]%16 == 0x0a)

                 {

                     TIME[1] += 16;

                  TIME[1] &= 0xf0;

                 }if(TIME[1]==0x60)TIME[1]=0;

              }

              while(k3==0);

            }

            if(k4==0)

            {

              delay(1000);   //消除抖动 一般大约10ms

              if(k4 ==0)   //再次判断按键是否按下

              {

                 TIME[1]--;

                 if(TIME[1]%16==0x0f && TIME[1]!=0xff)

                 {

                  TIME[1] &= 0xf9;

                 }

                 if(TIME[1]==0xff)TIME[1]=0x59;

              }

              while(k4==0);

            }

            break;    //?

    case 2:

            if(k3==0)

            {

              delay(1000);   //消除抖动 一般大约10ms

              if(k3 ==0)   //再次判断按键是否按下

              {

                 TIME[2]++;

                 if(TIME[2]%16 == 0x0a)

                 {

                     TIME[2] += 16;

                  TIME[2] &= 0xf0;

                 }if(TIME[2]==0x24)TIME[2]=0;

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。