本程序还是在原有基础上小修改了一下,去掉了星期显示,把原来整点闹钟改成了可自由设定小时+分钟的闹钟,其他的功能还是不变。
功能:时间,时分闹钟设置,上下限温度设置,温度显示。
闹钟可设置到分钟,响铃时间还是10秒钟。
可扩展功能:音乐响铃,一个星期中的任何一天闹钟设定,需要添加或者修改一下程序即可,程序只是简单的整理了一下,很多地方很乱,需要程序的朋友最好有较好的编程能力,否者很难理解程序的写作思维。
仿真图
完整的源代码下载: http://www.51hei.com/ziliao/file/1602_naoz.rar
#include"reg51.h"#define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; //// 定义蜂鸣器口 unsigned char L,H,Z,Y; //// 定义高低温度变量///////////////////////////////////////////////////////////////////////////////////////////////// /**********报警声音**************/ bi(uint t) { int c,n; for(c=0;c<t;c++) { for(n=0;n<50;n++); BEEP=~BEEP; //按位取反BEEP } return(t); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**********18b20温度程序**********/ sbit DQ=P3^6; //定义温度数据口 int xs; //定义小数 unsigned int temp,temp1,temp2; //定义温度转换变量 ////////////////////////////////////////////////////////////////////////////////////////////// /*********18B20延时程序************/ void delay_18B20(unsigned int i) { while(i--); }///////////////////////////////////////////////////////////////////////////////////////////////*********ds18b20初始化函数*********/void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 ds18b20通信端口 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(4); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); }////////////////////////////////////////////////////////////////////////////////////////////********ds18b20读一个字节**********/unsigned char ReadOneChar(void) { unsigned char i=0,dat = 0; for (i=8;i>0;i--) { DQ = 0; //高电平拉成低电平时读周期开始 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(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_18B20(5); //60us到120us延时 DQ = 1; dat>>=1; //从最低位到最高位传入 } }/////////////////////////////////////////////////////////////////////////////////////////////**************读取ds18b20当前温度************/void ReadTemperature(void) { unsigned char a=0,b=0,t=0; Init_DS18B20 ( ); WriteOneChar ( 0xCC ); // 跳过读序号列号的操作 WriteOneChar ( 0x44 ); // 启动温度转换 delay_18B20 ( 100 ); // this message is wery important Init_DS18B20 ( ); WriteOneChar ( 0xCC ); //跳过读序号列号的操作 WriteOneChar ( 0xBE ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20 ( 100 ); 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 }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*********************1602液晶程序********************/ /******定义液晶控制口*******/ sbit lcdrs=P2^5; //定义液晶三个控制口 sbit lcdrw=P2^6; sbit lcden=P2^7; sbit K1=P3^0; //定义三个开关 sbit K2=P3^1; sbit K3=P3^2; //////////////////////////////////////////////////////////////////////////////////////////////////******定义变量*******/ uchar count,shi,fen,miao,xq,K1num; //定义时间程序里所需要的变量//////////////////////////////////////////////////////////////////////////////////////////////////******定义数组*******/ // uchar code table [ ]= "H:38 L:25 00 Q:7"; //液晶界面显示的内容 // uchar code table1[ ]= "23:59:55 . C"; uchar code table [ ]= "01:00:55 01-01"; //液晶界面显示的内容 uchar code table1[ ]= "H:38 L:25 . C";///////////////////////////////////////////////////////////////////////////////////////////////////******延时程序*******/ void delay(uint m) //液晶延时程序 { uint i,j; for(i=m;i>0;i--) for(j=110;j>0;j--); }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /**********写指令*************/ void write_com(uchar com) { lcdrs=0; lcdrw=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } //////////////////////////////////////////////////////////////////////////////////////************写数据*************/ void write_data(uchar date) { lcdrs=1; lcdrw=0; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /***************液晶显示程序***************/ /*********时分秒数的分离**********/ void write_sfm(uchar add,uchar date) { uchar shi,ge; //分离数字,如35,分成3和5 shi=date/10; ge=date%10; write_com ( 0x80+add ); write_data ( 0x30+shi ); write_data ( 0x30+ge ); } ///////////////////////////////////////////////////////////////////**********星期***********/ void write_xq(uchar add1,uchar date1) { uchar ge; //星期只需要一个数字显示 ge=date1%10; write_com ( 0x80+add1 ); write_data ( 0x30+ge ); } //////////////////////////////////////////////////////////////// /************高温低温数的分离************/ void write_HL(uchar add2,uchar date2) { uchar shi,ge; shi=date2/10; ge=date2%10; write_com(0x80+0x40+add2); write_data( 0x30+shi ); write_data( 0x30+ge ); } ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// /***************按键调时程序***************/ void keycan() { /**********功能选择**********/ if( K1==0 ) { K1num++; delay(1); if( K1==0 ) { while(!K1);bi(200); if( K1num==1 ) { TR0=0; write_com ( 0x80+1 ); write_com(0x0f); } //时 if( K1num==2 ) { write_com ( 0x80+4 ); } //分 if( K1num==3 ) { write_com ( 0x80+7 ); } //秒 //if( K1num==4 ) { write_com ( 0x80+11 ); } //星期 if( K1num==4 ) { write_com ( 0x80+12 ); } //闹钟 if( K1num==5 ) { write_com ( 0x80+15 ); } if( K1num==6 ) { write_com ( 0x80+0x40+3 ); } //上限 if( K1num==7 ) { write_com ( 0x80+0x40+8 ); } //下限 if( K1num==8 ) { K1num=0; write_com(0x0c); TR0=1; } //退出设置 } }///////////////////////////////////////////////////////////////////////////////////////////////// /*********功能加*********/ if( K1num!=0 ) { if( K2==0 ) { delay(1); if( K2==0 ) { while(!K2);bi(200); if( K1num==1 ) { shi++; if( shi==24 ) shi=0; write_sfm ( 0,shi ); write_com ( 0x80+1 ); } if( K1num==2 ) { fen++; if( fen==60 ) fen=0; write_sfm ( 3,fen ); write_com ( 0x80