经过两天熬夜的艰苦奋战,在原程序基础上进行升级,添加按键多功能操作
新增功能: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单片机,代码:
#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); //精确延时 大于 480us DQ = 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 important Init_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
-
电路图
+关注
关注
10317文章
10718浏览量
527450 -
51单片机
+关注
关注
273文章
5697浏览量
123046 -
电子钟
+关注
关注
7文章
189浏览量
36899
原文标题:51单片机电子钟制作
文章出处:【微信号:changxuemcu,微信公众号:畅学单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论