毕业设计- 谁的大学没有一个万年历(基础款分享)

本次分享的毕设是一个难度系数比较低的51单片机时钟万年历。如果你是零基础的话,是非常适合入手的。如果作为毕设的话,部分院校应该比较难通过,但是在此基础上可以添加更多的功能,让作品的难度有所提升,功能更加完善。


先来看下功能有哪些:

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口控制

PCB设计:

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:加微信领取资料




以下是完整代码,供参考学习:

#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;a400) time=0;
  
  delay_ms(1);
  
}
void setalarmclock(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);
  }
  if(k2 == 0)       //选择闹钟修改参数
  {
    delay(1000);   //消除抖动 一般大约10ms
    if(k2==0)   //再次判断按键是否按下
    {
      alarm++; 
      if(alarm == 3)alarm=0; 
    }
    while(k2 == 0);
  }
  
  switch(alarm)      //选择进入修改参数
  {
    case 0:
        if(k3 == 0)        //控制闹钟开
        {
          delay(1000);   //消除抖动 一般大约10ms
          if(k3==0)   //再次判断按键是否按下
          {
            alarmswitch = ON;
            SectorErase(0x2401);
            byte_write(0x2401,alarmswitch);
          }
          while(k3 == 0);
        }
        if(k4 == 0)       //控制闹钟关闭
        {
          delay(1000);   //消除抖动 一般大约10ms
          if(k4==0)   //再次判断按键是否按下
          {
            alarmswitch = OFF;
            SectorErase(0x2401);
            byte_write(0x2401,alarmswitch);
          }
          while(k4 == 0);
        }
        break;
    case 1:  
                        
            if(k3==0)      //控制闹钟时针加
            {
              delay(1000);   //消除抖动 一般大约10ms
              if(k3 ==0)   //再次判断按键是否按下
              {
                 alarm_hour++;
                 if(alarm_hour%16 == 0x0a)
                 {
                     alarm_hour += 16;
                  alarm_hour &= 0xf0;
                 }if(alarm_hour==0x24)alarm_hour=0;
                  SectorErase(0x2601);
                byte_write(0x2601,alarm_hour);
              }
              while(k3==0);
            }
            if(k4==0)        //控制闹钟时针减
            {
              delay(1000);   //消除抖动 一般大约10ms
              if(k4 ==0)   //再次判断按键是否按下
              {
                 alarm_hour--;
                 if(alarm_hour%16==0x0f && alarm_hour!=0xff)
                 {
                  alarm_hour &= 0xf9;
                 }
                 if(alarm_hour==0xff)alarm_hour=0x23;
                 SectorErase(0x2601);
                 byte_write(0x2601,alarm_hour);
              }
              while(k4==0);
            }
        break;
    case 2:
        
            if(k3==0)
            {
              delay(1000);   //消除抖动 一般大约10ms
              if(k3 ==0)   //再次判断按键是否按下
              {
                 alarm_min++;
                 if(alarm_min%16 == 0x0a)
                 {
                     alarm_min += 16;
                  alarm_min &= 0xf0;
                 }if(alarm_min==0x60)alarm_min=0;
                 SectorErase(0x2201);
                 byte_write(0x2201,alarm_min);
              }
              while(k3==0);
            }
            if(k4==0)
            {
              delay(1000);   //消除抖动 一般大约10ms
              if(k4 ==0)   //再次判断按键是否按下
              {
                 alarm_min--;
                 if(alarm_min%16==0x0f && alarm_min!=0xff)
                 {
                  alarm_min &= 0xf9;
                 }
                 if(alarm_min==0xff)alarm_min=0x59;
                 SectorErase(0x2201);
                 byte_write(0x2201,alarm_min);
              }
              while(k4==0);
            }
        break;
  }


  if(time == 200)
  {
    alarm_hour=byte_read(0x2601);
    alarm_min=byte_read(0x2201);
    alarmswitch=byte_read(0x2401);
    LcdWriteCom(0x80);       //显示
    LcdWritestr("alarm clock:    ");
    LcdWriteCom(0xc0); 
    if(alarmswitch == OFF)LcdWritestr("  OFF    ");
    else LcdWritestr("  ON     ");
    LcdWriteCom(0xc9); 
    LcdWriteData(alarm_hour/16+0x30);
    LcdWriteData(alarm_hour%16+0x30);
    LcdWriteData(':'); 
    LcdWriteData(alarm_min/16+0x30);
    LcdWriteData(alarm_min%16+0x30);
    LcdWritestr("    ");
  }  else if(time == 400)
  switch(alarm)           //选择进入修改参数
  {
    case 0: 
        LcdWriteCom(0xc0);
        LcdWritestr("      ");  
    break;
    case 1: 
        LcdWriteCom(0xc9);
        LcdWritestr("  ");
    break;
    case 2: 
        LcdWriteCom(0xcc);
        LcdWritestr("  ");
            
      break;
    
  }else if(time>400) time=0;
   
  delay_ms(1);
}


/************闹钟模式*****************/
void alarmclock(void)
{
    if(alarmswitch==ON && alarm_hour==TIME[2] && alarm_min==TIME[1])  //闹钟
  {      
    beep=1;
    delay_ms(100);
    beep=0;
    delay_ms(100);  
    beep=1;
    delay_ms(100);
    beep=0;
    LcdWriteCom(0x80);
    LcdWritestr("   time out!    ");
    LcdWriteCom(0xc0);
    LcdWritestr("now time: ");
    LcdWriteData(alarm_hour/16+0x30);
    LcdWriteData(alarm_hour%16+0x30);
    LcdWriteData(':'); 
    LcdWriteData(alarm_min/16+0x30);
    LcdWriteData(alarm_min%16+0x30);
    LcdWritestr("    ");
    delay_ms(500);
    LcdClean();  
  }
  else mode=DISPLAYDATA;
  if(k4==0)
  {
    delay(1000);   //消除抖动 一般大约10ms
    if(k4 ==0)   //再次判断按键是否按下
    {
       alarmswitch=OFF;
    }
    while(k4==0);
  }       
}
/*******************************************************************************
* 函 数 名         : main
*******************************************************************************/
void main(void)
{
  int ucount=0;
  unsigned char lastSec;
  beep= 0;
  LcdInit();       //lcd初始化
  //Ds1302Init();      //时钟初始化
  Ds18b20Init();      //温度传感器初始化
  SectorErase(0x2001);
//  byte_write(0x2001,0x08);     //执行一遍初始化
//  byte_write(0x2201,0x00);
//  byte_write(0x2401,0x00);
  alarm_hour=byte_read(0x2601);
  alarm_min=byte_read(0x2201);
  alarmswitch=byte_read(0x2401);


  while(1)    
  {
    switch(mode)  //模式选择
    {
      case DISPLAYDATA:    //时间显示模式
        Ds1302ReadTime(); //更新时间
        if(TIME[0] !=  lastSec)
        {
          lastSec = TIME[0];
          display_data();      //显示时间    秒分时日月周年
          displaytemp(Ds18b20ReadTemp());//显示温度
          if(alarmswitch==ON && alarm_hour==TIME[2] && alarm_min==TIME[1])  //闹钟
          {
            mode = ALARMCLOCK; 
          }
        }
         keypros();         //按键检测
        break;
      case MODIFYDATA:        //时间修改模式
        modify();
        break;
      case SETALARMCLOCK:         //设置闹钟模式
        setalarmclock();
        break;
      case ALARMCLOCK:         //闹钟模式
        alarmclock();
        break;
    }
  }        
}

文章链接:
https://mp.weixin.qq.com/s/DTIwMy7TD96cUtUNAN0wyw

转载自:达尔闻说 ,作者化作尘

文章链接:毕业设计| 谁的大学没有一个万年历(基础款分享)

展开阅读全文

页面更新:2024-04-23

标签:蜂鸣器   毕业设计   单片机   初始化   万年历   闹钟   时钟   按键   电路   芯片   模式   时间   基础   大学

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top