微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机电子钟制作-升级版

51单片机电子钟制作-升级版

时间:11-29 来源:互联网 点击:
经过两天熬夜的艰苦奋战,在原程序基础上进行升级,添加按键多功能操作

新增功能:1. K1模式转换,可自由切换:主界面显示,时间调整,闹钟设置,温度上下限设定等。等 2. K2选定需要调整的位数。

切换至时间调整时,通过K3-"加",K4-"减"按键调整数值。

切换至闹钟设置时,通过K3-"加",K4-"减"按键调整数值。

切换至温度上下限设定时,通过K3-"加",K4-"减"按键调整数值。

准备扩展的新功能:闹钟音乐,喇叭开启和关闭,。

操作说明:

开机进入主界面,显示时钟和温度。按下K1时,进入模式选择,(有时间调整,闹钟设置,温度上下限设定等),当K1按下四次后,长响一声,回到主界面。

当K1(模式选择键)按下第一次,选择在时间调整时,按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回时间调整界面。

再按下K1(模式选择键)按下第二次,进入到下一个模式,闹钟设置。按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回闹钟设置界面。

再按下K1(模式选择键)按下第三次,进入到下一个模式,温度上下限设定。按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回温度上下限设定界面。

当K1(模式选择键)按下第四次,返回到时钟和温度主界面显示。





下面是我录制的一段视频文件:

采用的是stc89c51单片机,代码为自己原创,没有进行整理和优化,有点乱,还有些没有加注释说明
完整的源代码下载地址:http://www.51hei.com/f/dianzz5.rar

#include"reg51.h"#define uchar unsigned char #define uint unsigned int/****温度 端口定义******/sbit wx5=P2^4;sbit wx6=P2^5;sbit wx7=P2^6;sbit wx8=P2^7;sbit DQ=P3^6;uint temp, temp1,temp2, xs,H1,H2,L1,L2;             uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0X9c,0xc6,0x91,0xfc,0XE3};   /******延时程序*******/ void delay1(uint m){uint i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m){while(m--);}void Init_DS18B20()  {unsigned char x=0;DQ = 1;          //DQ复位 ds18b20通信端口 delay(8); //稍做延时DQ = 0;          //单片机将DQ拉低delay(80); //精确延时 大于 480usDQ = 1;          //拉高总线   delay(4);x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 高电平拉成低电平时读周期开始dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;   // delay(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;          //从高电平拉至低电平时,写周期的开始DQ = dat&0x01;   //数据的最低位先写入delay(5);        //60us到120us延时DQ = 1;        dat>>=1;         //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned  b=0;unsigned  t=0;Init_DS18B20();WriteOneChar(0xCC);   // 跳过读序号列号的操作WriteOneChar(0x44);   // 启动温度转换 delay(1);            // this message is wery importantInit_DS18B20();WriteOneChar(0xCC);   //跳过读序号列号的操作WriteOneChar(0xBE);   //读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay(1);a=ReadOneChar();      //读取温度值低位  b=ReadOneChar();      //读取温度值高位    temp1=b<4;           //高8位中后三位数的值 temp1+=(a&0xf0)>>4;   //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值temp2=a&0x0f;         //小数的值temp=((b*256+a)>>4);  //当前采集温度值除16得 实际温度值    zhenshu    xs=temp2*0.0625*10;   //小数位,若为0.5则算为5来显示  xs小数    xiaoshu}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////****时钟 端口定义******/sbit wx1=P2^0;sbit wx2=P2^1;sbit wx3=P2^2;sbit wx4=P2^3;uchar  qian,bai,shi,ge,miao1,miao2,count1,count2;uchar  n1,n2,z1,z2;//设置闹钟变量uchar code table1[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82};/////////////////////////////////////////////***************按键调时程序***************/ sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit K4=P3^3;sbit BEEP=P3^7;    //// 定义蜂鸣器口uchar K1num,K2num,K3num,K4num,K5num,K6num,K7num;///////////////////////////////////////////**********报警声音**************/bi(uint t){int c,n;for(c=0;c				            

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top