用普中开发板做的51单片机的智能时钟具有闹钟功能

发布者:RadiantSmile最新更新时间:2020-08-27 来源: 51hei关键字:普中开发板  51单片机  智能时钟  闹钟功能 手机看文章 扫描二维码
随时随地手机看文章

本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。

使用了LCD1602DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。


单片机源程序如下:

#include

#include

#include

#include

#include

#include


#define normal 0//正常显示时钟界面

#define settime 1//设定时钟界面

#define setalarm 2//设定闹钟界面

#define displayalarm 3//显示闹钟界面

#define normal_12 4//显示十二小时制界面

#define caidan 5


unsigned char system=normal;//我一开始就把界面切换为正常显示时钟界面


extern unsigned char i,k;


extern unsigned int code song[3][300];


unsigned char code *week[8]={"NO ","Mon ","Tue ","Wed ","Thu ","Fri ","Sat ","Sun "};


unsigned char code *clockzifu[4]={"ON ","OFF ","REP ","NRE "};


struct Time timeset={0x18,0x01,0x16,0x14,0x30,0x50,0x03};


//第一个闹钟

//第二个闹钟

//第三个闹钟

//第四个闹钟

//第五个闹钟

struct alarmtime xdata clock[5]={{1,16,14,31,0,1,0,1},{1,8,14,32,3,0,0,0},{1,7,18,49,1,1,1,0},{0,0,0,0,0,0,1,0},{1,25,0,0,0,0,1,2}};


unsigned char alarmnum;//闹钟


unsigned char a;


unsigned char flag=0;


unsigned char xinghao=0;


unsigned char tentoBCD(unsigned char dat)//十进制转换为BCD码函数

{

        unsigned char dat1,dat2;

        dat1=dat/10;

        dat2=dat%10;

        dat2=dat2+dat1*16;

        return dat2;

}


unsigned char BCDtoten(unsigned char dat)//BCD码转为十进制函数

{

        unsigned char dat1,dat2;

        dat1=dat/16;

        dat2=dat%16;

        dat2=dat2+dat1*10;

        return dat2;

}


void DS18B20deal(int temp)//DS18B20数据处理函数 显示温度更新温度         

{

    //先判断温度值是否大于0或小于0等于0

           float tp;//保存的数据可能带小数  

        if(temp<0)//当温度值为负数

          {

                LCD1602_writechar(9,1,0x2D);//ASCII码中的-符号

                temp=temp-1;//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

                temp=~temp;//还原读取的数据

                tp=temp;//保存到变量里面

                temp=tp*0.0625*100+0.5;//强制转换成一个整形的数据.留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就算加上0.5,还是在小数点后面。       

          }

        else//当温度值为正数

          {                       

                LCD1602_writechar(9,1,0x20);//ASCII码中的空格

                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量。如果温度是正的那么,那么正数的原码就是补码它本身

                temp=tp*0.0625*100+0.5;//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点。后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就算加上0.5,还是在小数点后面。       

        }

        LCD1602_writechar(10,1,temp/10000+'0');//温度百位

        LCD1602_writechar(11,1,temp%10000/1000+'0');//温度十位

        LCD1602_writechar(12,1,temp%1000/100+'0');//温度个位

    LCD1602_writechar(13,1,0x2E);//ASCII码小数点

        LCD1602_writechar(14,1,temp%100/10+'0');//小数点后一位

        LCD1602_writechar(15,1,temp%10+'0');//小数点后两位

}


void updatetime()//更新时钟上的时间

{

        unsigned char time[9];//存储变量

        DS1302_gettime(×et);//读取时间

        time[0]=BCDtoten(timeset.hour)/10+'0';//小时的十位

        time[1]=BCDtoten(timeset.hour)%10+'0';//小时的个位

        time[2]=':';

        time[3]=BCDtoten(timeset.min)/10+'0';//分的十位

        time[4]=BCDtoten(timeset.min)%10+'0';//分的个位

        time[5]=':';

        time[6]=BCDtoten(timeset.sec)/10+'0';//秒的十位

        time[7]=BCDtoten(timeset.sec)%10+'0';//秒的个位

        time[8]='';//字符串结束标志


        LCD1602_writestr(0,1,time);//在LCD上面打印时间

}


void updatetime_12()//更新十二小时制界面的时间

{

        unsigned char time[9];

        DS1302_gettime(×et);//读取时间

        time[0]= BCDtoten(timeset.hour)%12/10+'0';//小时的十位

        time[1]= BCDtoten(timeset.hour)%12%10+'0';//小时的个位

        time[2]=':';

        time[3]= BCDtoten(timeset.min)/10+'0';//分的十位

        time[4]= BCDtoten(timeset.min)%10+'0';//分的个位

        time[5]=':';

        time[6]= BCDtoten(timeset.sec)/10+'0';//秒的十位

        time[7]= BCDtoten(timeset.sec)%10+'0';//秒的个位

        time[8]='';//字符串结束标志                                                                                                                                                                                                               

        LCD1602_writestr(3,1,"TIME:");//打印出TIME的字符串

        LCD1602_writestr(8,1,time);//在第二行第四列显示时间

        if(BCDtoten(timeset.hour)>12)//要是小时大于12时

        {

          LCD1602_writestr(0,1,"PM");//则显示PM

        }

        else//小时不大于12

        {

          LCD1602_writestr(0,1,"AM");//则显示AM

        }  

}


void updatedate()//更新日历

{

        unsigned char date[12];

        date[0]= '2';

        date[1]= '0';

        date[2]= BCDtoten(timeset.year)/10%10+'0';//年的十位

        date[3]= BCDtoten(timeset.year)%10+'0';//年的个位

        date[4]='.';

        date[5]= BCDtoten(timeset.mon)/10+'0';//月的十位

        date[6]= BCDtoten(timeset.mon)%10+'0';//月的个位

        date[7]='.';

        date[8]= BCDtoten(timeset.day)/10+'0';//日的十位

        date[9]= BCDtoten(timeset.day)%10+'0';//日的个位

        date[10]='';

        LCD1602_writestr(0,0,date);//显示年月日

        LCD1602_writestr(11,0,week[timeset.week]);//显示星期

}


void updatealarm()//更新闹钟设定值

{

        unsigned char str0[14];

        unsigned char str1[2];


        str0[0]=alarmnum+'0';

        str0[1]=' ';

        str0[2]=clock[alarmnum].mon/10+'0';//月份十位

        str0[3]=clock[alarmnum].mon%10+'0';//月份个位

        str0[4]='-';

        str0[5]=clock[alarmnum].day/10+'0';//日期十位

        str0[6]=clock[alarmnum].day%10+'0';//日期个位

        str0[7]=' ';

        str0[8]=clock[alarmnum].hour/10+'0';//小时十位

        str0[9]=clock[alarmnum].hour%10+'0';//小时个位

        str0[10]=':';

        str0[11]=clock[alarmnum].min/10+'0';//分钟十位

        str0[12]=clock[alarmnum].min%10+'0';//分钟个位

        str0[13]='';


        LCD1602_writestr(0,1,str0);


        str1[0]=clock[alarmnum].music+'0';//铃声

        str1[1]='';


        LCD1602_writestr(0,0,"U");

        LCD1602_writestr(1,0,str1);//显示铃声

        LCD1602_writestr(3,0,clockzifu[clock[alarmnum].alarmre+2]);//显示重不重复

        LCD1602_writestr(7,0,week[clock[alarmnum].week]);//显示星期

        LCD1602_writestr(11,0,clockzifu[clock[alarmnum].alarmon]);//显示开关       

}


void anjian4();


void anjian1()

{

  if(system==normal)

  {

    system=caidan;

        xinghao=0;

        LCD1602_clear();

        LCD1602_writechar(0,0,'*');

        LCD1602_writestr(1,0,"12");

        LCD1602_writestr(1,1,"alarm");

        LCD1602_writestr(8,0,"setclock");

        LCD1602_writestr(8,1,"setalarm");

  }

  else if(system==caidan&&xinghao==0)

  {

    system=normal_12;//切换到12小时制

        LCD1602_clear();//清屏

        updatetime_12();//显示12小时制的时间

        updatedate();//显示日期

  }

  else if(system==caidan&&xinghao==1)

  {

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
关键字:普中开发板  51单片机  智能时钟  闹钟功能 引用地址:用普中开发板做的51单片机的智能时钟具有闹钟功能

上一篇:51单片机读写RC522卡参考例程及上位机调试软件源码
下一篇:lcd1602万年历(时钟)+温度 带闹钟

推荐阅读最新更新时间:2024-11-08 17:12

51单片机C语言程序(三)数码管
程序一 利用动态扫描方法在六位数码管上显示出稳定的654321. 时钟频率为11.0592M #include reg52.h //52单片机头文件 #include intrins.h //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit dula=P2^6; //数码管段选锁存端 sbit wela=P2^7; ////数码管位选锁存端 uchar code table ={ //数码管显示编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0
[单片机]
基于51单片机控制的冲床控制器
  系统硬件配置以AT89S51单片机为核心。AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4Kb ISP(In-system programmable)可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,内置看门狗(WDT)电路。   功能强大的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。采用该单片机设计的冲床控制器,具有以下几个特点:    570)?'570px':'auto'; }" src="/uploadfile/mcu/uploadfile/201112/20111223
[单片机]
单片机为什么要晶振_51单片机晶振频率
首先解释一下单片机为什么需要晶振。 晶振是什么?全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。 第二个问题,是不是外接晶体的值可以随意选择呢? 当然不是,这就像不同的发动机有不同的最大功率一样,每种型号的的单片机都有最大能接受的晶体频率。先说51,它能够外接的最大晶体是24M,AVR单片机能够外接的最大晶振是16M。更高级的可编程芯片,例如FPGA,ARM,可以达到几百M,不过暂时不在我们的考虑范围之内。 第三个问题,为什么5
[单片机]
单片机为什么要晶振_<font color='red'>51单片机</font>晶振频率
51单片机知识点之独立按键设总开关与分开关
#include reg51.h #define uint8 unsigned char #define uint16 unsigned int sbit Key=P1^0; sbit Key1=P1^1; sbit Key2=P1^2; sbit Key3=P1^3; sbit Key4=P1^4; sbit speak=P1^6; sbit led=P1^7; void delay(uint16 dly) { uint16 x,y; for(x=dly;x 0;x--) for(y=247;y 0;y--); } main() { int i,j,k,m,n,
[单片机]
<font color='red'>51单片机</font>知识点之独立按键设总开关与分开关
51单片机常见的六个问题
  一,为何51单片机爱用11.0592MHZ晶振?   其一:由于它能够精确地划分红时钟频率,与UART(通用异步接纳器/发送器)量常见的波特率有关。特别是较高的波特率(19600,19200),不论多么古怪的值,这些晶振都是精确,常被运用的。   其二:用11.0592晶振的缘由是51单片机的定时器致使的。用51单片机的定时器做波特率发生器时,假如用11.0592Mhz的晶振,根据公式算下来需求定时器设置的值都是整数;假如用12Mhz晶振,则波特率都是有误差的,比如9600,用定时器取0XFD,实践波特率10000,通常波特率误差在4%摆布都是能够的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6
[单片机]
51单片机-点阵模块-横向移动-i love u
1.视频 bilibili视频地址: https://www.bilibili.com/video/av90119282 51单片机-点阵模块-横向移动-i love u 2.文件 代码下载地址: https://download.csdn.net/download/weixin_43130546/12171545 3.提示 8*8点阵模块原理图: 说明: 一块8*8点阵,可以和两块74HC595芯片,组成一个点阵模块。 一个模块最少占用三个单片机引脚:IO串口数据发送引脚,发送时钟,显示时钟。 高位595的/Q7,和低位595的SER(DIO)相连,数据从高位595挤到低位595。 595送数据的顺序
[单片机]
<font color='red'>51单片机</font>-点阵模块-横向移动-i love u
51单片机控制多普勒血流计系统的设计和实现
0 引言 多普勒血流计的出现标志着在微血管灌流方面取得重大进步。本设计采取双通道装置拾取多普勒信号,有效地抑制噪声信号,采用单片机来对信号进行控制及处理,既简化了电路,又有助于信号的处理及读取。运用12位的AD574A不但提高了信号精度,利用其双极性,也省去了以往信号处理中复杂的乘方、开方电路或绝对值电路。通过四位LED显示,直观、准确地读取血细胞灌流量的瞬时相对定量值,可精确到小数点后两位。并同时配有扬声器来形象表示信号的强弱和变化。还可通过绘图仪,对信号进行长时间检测、记录,以便研究和分析。 1 系统总体方案 系统组成框图如图1所示。系统工作时,从激光探头发射出一束激光照射到组织上,并穿透组织形成一个半径为1mm的半球,
[单片机]
<font color='red'>51单片机</font>控制多普勒血流计系统的设计和实现
MCS-51单片机内部RAM可分为几个区?以及作用?
00H-1FH为工作寄存器区,里面就是通用寄存器组R0-R7,每八个分一组,如第一组为R0-R7,地址位00-07H;假设第一组叫1(R0-R7),那么08-0FH为第二组,就叫2(R0-R7),依次类推共有4组。这个区域是最常用的数据区,数据的操作大部分在这里进行。通用寄存器分组的好处是:当程序切换(特别是被中断或抢占的时候)只需要切换一组寄存器就可以获得一组新的寄存器,而不必担心和别的程序冲突,也可以尽量少的进行入栈和出栈操作,提高运行效率。作用?当然是放数据,只不过这个地方最好用。 20H-2FH为可位寻址区,这里和通用寄存器组一样可以进行位寻址,也就是说可以比较方便的进行位操作,个人认为它和通用寄存器组的区别是,没有逐个
[单片机]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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