wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機電子鐘程序完美版(帶鬧鐘溫度功能)

作者:未知   來源:本站原創   點擊數:  更新時間:2014年07月07日   【字體:

本電子鐘已經全部測試OK,帶鬧鐘功能,年月日時分秒星期溫度,四個按鍵可設置鬧鐘調節時間,溫度可以顯示正125度到負的55度之間,時間走時的話,我測試了一個月,誤差不到1分鐘。本人已經錄制成視頻,視頻里面有詳細的介紹,感興趣的可以看看 。視頻及多圖還有源代碼的地址: http://m.izizhuan.cn/bbs/dpj-26057-1.html

程序:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;//寄存器選擇
sbit rw=P1^1;//讀寫信號線
sbit lcden=P1^2;//led使能端

sbit scl=P1^3;//時鐘線
sbit rst=P1^5;//復位線
sbit io=P1^4;//數據口

sbit key_set_time=P3^4;//設置時間鍵
sbit key_add=P3^5;//加鍵
sbit key_minus=P3^6;//減鍵
sbit key_set_alarm=P3^7;//設置鬧鐘鍵
sbit bee=P1^6;//蜂鳴器接口
sbit dq=P1^7;//ds18b20測溫

uchar getTimebuf[7];//存放時間數據
uchar time[]={"  :  :  "};//時間格式字符串
uchar date[]={"20  -  -  "};//日期格式字符串
uchar weeklist[]={"SunMonTueWedThuFriSat"};//星期字符列表
uchar week[]={"   "};//星期格式字符串

int count;//設定秒分時日月星期年的時候count的值分別為1235647
int alarm;//是否進入鬧鐘設置界面 123分別代表開關 分 小時的設置
int isOpen;//鬧鐘是否開啟  默認不開啟
int fen,shi;//鬧鐘的分鐘小時
int isRing;//鬧鐘是否在響

uchar isInit_1302;//是否初始化時鐘完畢

int num;
int temperature;//溫度
int temp_flag;//溫度正負標志

void delay(uint x){
	int y;
	while(x--){
		for(y=100;y>0;y--);
	}
}
void write_1602com(uchar com){
	//1602寫指令
	rs=0;
	lcden=0;
	P2=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void write_1602data(uchar dat){
	//1602寫數據
	rs=1;
	lcden=0;
	P2=dat;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void init_1602(){
	//初始化1602液晶
	rw=0;
	lcden=0;
	write_1602com(0x38);//設置顯示模式
	write_1602com(0x0c);//顯示開關及光標是否顯示和閃動
	write_1602com(0x06);//光標移動方向
	write_1602com(0x01);//清屏
}
void write_ds1302_byte(uchar temp){
	//ds1302寫一個字節數據
	uchar i;
	for(i=0;i<8;i++){
		io=temp&0x01;//將數據放到IO口上
		scl=0;//scl為低時準備數據
		scl=1;//上升沿寫入
		temp>>=1;
	}
}
void write_ds1302(uchar add,uchar dat){
	//向地址add寫入數據dat
	rst=0;
	scl=0;
	rst=1;
	write_ds1302_byte(add);
	write_ds1302_byte(dat);
	scl=1;
	rst=0;
}
uchar read_ds1302(uchar add){
	//ds1302讀數據
	uchar i,dat;
	rst=0;
	scl=0;
	rst=1;
	write_ds1302_byte(add);//首先寫入要讀的數據處的地址
	for(i=0;i<8;i++){
		if(io==1){
			dat|=0x80;
		}
		scl=1;
		scl=0;//下降沿讀取數據
		dat>>=1;
	}
	scl=1;
	rst=0;
	return dat;
}
void read_time(uchar curr_time[]){
	  uchar i;
	  uchar ucAddr = 0x81;
	  for (i=0;i<7;i++){
		curr_time[i] = read_ds1302(ucAddr);//格式為: 秒 分 時 日 月 星期 年 
		ucAddr += 2;
	  }
}
void set_time(uchar *pSecDa){
	//設定時間
	uchar i;
	uchar ucAddr = 0x80;
	write_ds1302(0x8e,0x00);	
	for(i =7;i>0;i--){ 
		write_ds1302(ucAddr,*pSecDa); //秒 分 時 日 月 星期 年
		pSecDa++;
		ucAddr+=2;
	}
	write_ds1302(0x8e,0x80);
}
void init_ds1302(){
	//ds1302初始化
	isInit_1302=read_ds1302(0x81);//讀出時鐘狀態
	if(isInit_1302&0x80){//說明沒有初始化
		write_ds1302(0x8e,0x00);//關閉寫保護  以后一直開著
		write_ds1302(0x90,0xa5); //輔助電源充電命令 一個二極管  一個2K電阻
		write_ds1302(0x80,0x00);//秒 CH置0 開啟時鐘
		write_ds1302(0x82,0x59);//分
		write_ds1302(0x84,0x10);//時
		write_ds1302(0x86,0x07);//日
		write_ds1302(0x88,0x05);//月
		write_ds1302(0x8a,0x04);//星期
		write_ds1302(0x8c,0x14);//年
		write_ds1302(0x8e,0x80);
	}
}
char int_to_char(int temp){
	//把0到9對應的數字轉為字符
	char x='0';
	switch(temp){
		case 0:x='0';break;
		case 1:x='1';break;
		case 2:x='2';break;
		case 3:x='3';break;
		case 4:x='4';break;
		case 5:x='5';break;
		case 6:x='6';break;
		case 7:x='7';break;
		case 8:x='8';break;
		case 9:x='9';break;
	}
	return x;
}
int ds18b20_read_temp();
void display(){
	uchar bai,shi,ge,point,fuhao;
	read_time(getTimebuf);//時時讀取時間
    time[6]=(getTimebuf[0])/16+48;//格式化時間秒
    time[7]=(getTimebuf[0])%16+48;

    time[3]=(getTimebuf[1])/16+48;//格式化時間分
    time[4]=(getTimebuf[1])%16+48;

    time[0]=(getTimebuf[2])/16+48;//格式化時間小時
    time[1]=(getTimebuf[2])%16+48;

    date[8]=getTimebuf[3]/16+48;//格式化日期日
    date[9]=getTimebuf[3]%16+48;

    date[5]=getTimebuf[4]/16+48;//格式化日期月
    date[6]=getTimebuf[4]%16+48;

    date[2]=getTimebuf[6]/16+48;//格式化日期年
    date[3]=getTimebuf[6]%16+48;

    week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
    week[1]=weeklist[(getTimebuf[5]%10)*3+1];
    week[2]=weeklist[(getTimebuf[5]%10)*3+2];
	
	write_1602com(0x80+1);
	for(num=0;num<10;num++){
		write_1602data(date[num]);
	}

	write_1602data(' ');
	for(num=0;num<3;num++){
		write_1602data(week[num]);
	}

	write_1602com(0x80+0x40);
	for(num=0;num<8;num++){
		write_1602data(time[num]);
	}
	
	//顯示溫度值
	write_1602com(0x80+0x40+8);//設置數據指針
	temperature=ds18b20_read_temp();
	bai=temperature/1000+0x30;
	shi=temperature%1000/100+0x30;
	ge=temperature%100/10+0x30;
	point=temperature%100%10+0x30;
	if(temp_flag==1){//說明為正數  不顯示符號位 125.6 25.7兩種
		fuhao=0x20;//顯示空白
		if(bai==0x30){
			bai=0x20;//如果百位為0  不顯示
			if(shi==0x30){
				shi=0x20;//如果百位為0  十位也為0  都不顯示
			}
		}
		write_1602data(fuhao);
		write_1602data(bai);
		write_1602data(shi);
	}else{
		fuhao=0x2d;//顯示負號  -2.5  -25.8兩種
		write_1602data(0x20);//因為負數最低到55,所以不顯示百位
		if(shi==0x30){	
			write_1602data(0x20);
			write_1602data(fuhao);
		}else{
			write_1602data(fuhao);
			write_1602data(shi);
		}
	}
	write_1602data(ge);
	write_1602data('.');
	write_1602data(point);
	write_1602data(0xdf);
	write_1602data('C');
}
void display_alarm(uchar add,int dat){
	//把設定的時分顯示出來
	int x,y;
	x=dat/10;
	y=dat%10;
	write_1602com(add);
	write_1602data(int_to_char(x));
	write_1602com(add+1);//防止寫后地址自動向后加一  光標閃爍看不到
	write_1602data(int_to_char(y));
	write_1602com(add+1);
}
void init_alarm(){
	//鬧鐘設置界面  只有首次進入才執行
	uchar code x[]="SET ALARM";
	uchar i;
	if(alarm==0){
		write_1602com(0x01);//清屏
		write_1602com(0x80+3);//設置數據指針
		for(i=0;i<9;i++){
			write_1602data(x[i]);
		}
		display_alarm(0x80+0x40+5,shi);//載入鬧鐘的時分
		write_1602com(0x80+0x40+7);
		write_1602data(':');
		display_alarm(0x80+0x40+8,fen);
		if(isOpen){//初始化的時候如果已經設定鬧鐘則顯示ON
			write_1602com(0x80+0x40+13);
			write_1602data(' ');
			write_1602data('O');
			write_1602data('N');
		}else{
			write_1602com(0x80+0x40+13);
			write_1602data('O');
			write_1602data('F');
			write_1602data('F');
		}
	}
}
void key_scan(){
	int i;
	uchar code tips1[]="SET SUCCESS";//鬧鐘設置成功的提示
	uchar code tips2[]="CANCEL SUCCESS";//取消鬧鐘的提示
	if(key_set_time==0){//檢測是否按下
		delay(10);//消抖
		if(key_set_time==0){//再次檢測是否按下
			while(!key_set_time);//檢測是否松開
			delay(10);//延時消抖
			while(!key_set_time);//再次檢測是否松開
			if(alarm==0){//當沒有顯示鬧鐘界面時才顯示時間設定
				count++;
				write_ds1302(0x80,0x80);//讓時鐘停止
				if(count==8){
					//繼續走時,說明時間已經設定好了
					write_1602com(0x0c);//讓光標消失
					write_ds1302(0x80,0);//讓時鐘繼續
					set_time(getTimebuf);//寫入新的時間
					count=0;
					return;
				}
				switch(count){
					case 1:
						write_1602com(0x80+0x40+7);//在秒的位置
						break;
					case 2:
						write_1602com(0x80+0x40+4);//在分的位置
						break;
					case 3:
						write_1602com(0x80+0x40+1);//在時的位置
						break;
					case 4:
						write_1602com(0x80+14);//在星期的位置
						break;
					case 5:
						write_1602com(0x80+10);//在日的位置
						break;
					case 6:
						write_1602com(0x80+7);//在月的位置
						break;
					case 7:
						write_1602com(0x80+4);//在年的位置
						break;
				}
				write_1602com(0x0f);//讓光標閃爍
			}
		}
	}
	if(key_add==0){//檢測是否按下
		delay(10);//消抖
		if(key_add==0){//再次檢測是否按下
			while(!key_add);//檢測是否松開
			delay(10);//延時消抖
			while(!key_add);//再次檢測是否松開
			if(count!=0){
				switch(count){
				case 1:
					//在秒的位置
					getTimebuf[0]++;
					if(getTimebuf[0]==0x5a){
						getTimebuf[0]=0;
					}
					if(getTimebuf[0]==0x4a){
						getTimebuf[0]=0x50;
					}
					if(getTimebuf[0]==0x3a){
						getTimebuf[0]=0x40;
					}
					if(getTimebuf[0]==0x2a){
						getTimebuf[0]=0x30;
					}
					if(getTimebuf[0]==0x1a){
						getTimebuf[0]=0x20;
					}
					if(getTimebuf[0]==0x0a){
						getTimebuf[0]=0x10;
					}
					time[6]=(getTimebuf[0])/16+48;//格式化時間秒
					time[7]=(getTimebuf[0])%16+48;
					write_1602com(0x80+0x40+6);//在秒的位置
					write_1602data(time[6]);
					write_1602com(0x80+0x40+7);//在秒的位置
					write_1602data(time[7]);
					write_1602com(0x80+0x40+7);//讓光標在秒的位置閃爍
					break;
				case 2:
					//在分的位置
					getTimebuf[1]++;
					if(getTimebuf[1]==0x5a){
						getTimebuf[1]=0;
					}
					if(getTimebuf[1]==0x4a){
						getTimebuf[1]=0x50;
					}
					if(getTimebuf[1]==0x3a){
						getTimebuf[1]=0x40;
					}
					if(getTimebuf[1]==0x2a){
						getTimebuf[1]=0x30;
					}
					if(getTimebuf[1]==0x1a){
						getTimebuf[1]=0x20;
					}
					if(getTimebuf[1]==0x0a){
						getTimebuf[1]=0x10;
					}
					time[3]=(getTimebuf[1])/16+48;//格式化時間分
					time[4]=(getTimebuf[1])%16+48;
					write_1602com(0x80+0x40+3);//在分的位置
					write_1602data(time[3]);
					write_1602com(0x80+0x40+4);//在分的位置
					write_1602data(time[4]);
					write_1602com(0x80+0x40+4);//讓光標在分的位置閃爍
					break;
				case 3:
					//在時的位置
					getTimebuf[2]++;
					if(getTimebuf[2]==0x24){
						getTimebuf[2]=0;
					}
					if(getTimebuf[2]==0x1a){
						getTimebuf[2]=0x20;
					}
					if(getTimebuf[2]==0x0a){
						getTimebuf[2]=0x10;
					}
					time[0]=(getTimebuf[2])/16+48;//格式化時間小時
					time[1]=(getTimebuf[2])%16+48;
					write_1602com(0x80+0x40+0);//在小時的位置
					write_1602data(time[0]);
					write_1602com(0x80+0x40+1);
					write_1602data(time[1]);
					write_1602com(0x80+0x40+1);
					break;
				case 4:
					//在星期的位置
					getTimebuf[5]++;
					if(getTimebuf[5]==0x08){
						getTimebuf[5]=0x01;
					}
					if((getTimebuf[5]%10)*3==21){//輪完了  重新開始
						week[0]=weeklist[0];
						week[1]=weeklist[1];
						week[2]=weeklist[2];
					}else{
						week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
						week[1]=weeklist[(getTimebuf[5]%10)*3+1];
						week[2]=weeklist[(getTimebuf[5]%10)*3+2];
					}
					write_1602com(0x80+12);
					write_1602data(week[0]);
					write_1602com(0x80+13);
					write_1602data(week[1]);
					write_1602com(0x80+14);
					write_1602data(week[2]);
					write_1602com(0x80+14);
					break;
				case 5:
					//在日的位置
					getTimebuf[3]++;
					if(getTimebuf[3]==0x32){
						getTimebuf[3]=0x01;
					}
					if(getTimebuf[3]==0x2a){
						getTimebuf[3]=0x30;
					}
					if(getTimebuf[3]==0x1a){
						getTimebuf[3]=0x20;
					}
					if(getTimebuf[3]==0x0a){
						getTimebuf[3]=0x10;
					}
					date[8]=(getTimebuf[3])/16+48;
					date[9]=(getTimebuf[3])%16+48;
					write_1602com(0x80+9);
					write_1602data(date[8]);
					write_1602com(0x80+10);
					write_1602data(date[9]);
					write_1602com(0x80+10);
					break;
				case 6:
					//在月的位置
					getTimebuf[4]++;
					if(getTimebuf[4]==0x13){
						getTimebuf[4]=0x01;
					}
					if(getTimebuf[4]==0x0a){
						getTimebuf[4]=0x10;
					}
					date[5]=(getTimebuf[4])/16+48;
					date[6]=(getTimebuf[4])%16+48;
					write_1602com(0x80+6);
					write_1602data(date[5]);
					write_1602com(0x80+7);
					write_1602data(date[6]);
					write_1602com(0x80+7);
					break;
				case 7:
					//在年的位置
					getTimebuf[6]++;
					if(getTimebuf[6]==0x9a){
						getTimebuf[6]=0x00;
					}
					if(getTimebuf[6]==0x8a){
						getTimebuf[6]=0x90;
					}
					if(getTimebuf[6]==0x7a){
						getTimebuf[6]=0x80;
					}
					if(getTimebuf[6]==0x6a){
						getTimebuf[6]=0x70;
					}
					if(getTimebuf[6]==0x5a){
						getTimebuf[6]=0x60;
					}
					if(getTimebuf[6]==0x4a){
						getTimebuf[6]=0x50;
					}
					if(getTimebuf[6]==0x3a){
						getTimebuf[6]=0x40;
					}
					if(getTimebuf[6]==0x2a){
						getTimebuf[6]=0x30;
					}
					if(getTimebuf[6]==0x1a){
						getTimebuf[6]=0x20;
					}
					if(getTimebuf[6]==0x0a){
						getTimebuf[6]=0x10;
					}
					date[2]=(getTimebuf[6])/16+48;
					date[3]=(getTimebuf[6])%16+48;
					write_1602com(0x80+3);
					write_1602data(date[2]);
					write_1602com(0x80+4);
					write_1602data(date[3]);
					write_1602com(0x80+4);
					break;
				}
			}
			if(alarm!=0){
				switch(alarm){
					case 1:
						//調節鬧鐘的開與關
						if(isOpen==0){
							isOpen=1;
							write_1602com(0x80+0x40+13);
							write_1602data(' ');
							write_1602data('O');
							write_1602data('N');
						}else{
							isOpen=0;
							write_1602com(0x80+0x40+13);
							write_1602data('O');
							write_1602data('F');
							write_1602data('F');
						}
						//防止寫后地址自動向后加一  光標閃爍看不到
						write_1602com(0x80+0x40+15);
						break;
					case 2:
						//調節鬧鐘的分
						fen++;
						if(fen==60){
							fen=0;
						}
						display_alarm(0x80+0x40+8,fen);
						break;
					case 3:
						//調節鬧鐘的小時
						shi++;
						if(shi==24){
							shi=0;
						}
						display_alarm(0x80+0x40+5,shi);
						break;
				}
			}
		}
	}
	if(key_minus==0){//檢測是否按下
		delay(10);//消抖
		if(key_minus==0){//再次檢測是否按下
			while(!key_minus);//檢測是否松開
			delay(10);//延時消抖
			while(!key_minus);//再次檢測是否松開
			if(count!=0){
				switch(count){
				case 1:
					//在秒的位置
					getTimebuf[0]--;
					if(getTimebuf[0]==0xff){
						getTimebuf[0]=0x59;
					}
					if(getTimebuf[0]==0x4f){
						getTimebuf[0]=0x49;
					}
					if(getTimebuf[0]==0x3f){
						getTimebuf[0]=0x39;
					}
					if(getTimebuf[0]==0x2f){
						getTimebuf[0]=0x29;
					}
					if(getTimebuf[0]==0x1f){
						getTimebuf[0]=0x19;
					}
					if(getTimebuf[0]==0x0f){
						getTimebuf[0]=0x09;
					}
					time[6]=(getTimebuf[0])/16+48;//格式化時間秒
					time[7]=(getTimebuf[0])%16+48;
					write_1602com(0x80+0x40+6);//在秒的位置
					write_1602data(time[6]);
					write_1602com(0x80+0x40+7);//在秒的位置
					write_1602data(time[7]);
					write_1602com(0x80+0x40+7);//讓光標在秒的位置閃爍
					break;
				case 2:
					//在分的位置
					getTimebuf[1]--;
					if(getTimebuf[1]==0xff){
						getTimebuf[1]=0x59;
					}
					if(getTimebuf[1]==0x4f){
						getTimebuf[1]=0x49;
					}
					if(getTimebuf[1]==0x3f){
						getTimebuf[1]=0x39;
					}
					if(getTimebuf[1]==0x2f){
						getTimebuf[1]=0x29;
					}
					if(getTimebuf[1]==0x1f){
						getTimebuf[1]=0x19;
					}
					if(getTimebuf[1]==0x0f){
						getTimebuf[1]=0x09;
					}
					time[3]=(getTimebuf[1])/16+48;//格式化時間分
					time[4]=(getTimebuf[1])%16+48;
					write_1602com(0x80+0x40+3);//在分的位置
					write_1602data(time[3]);
					write_1602com(0x80+0x40+4);//在分的位置
					write_1602data(time[4]);
					write_1602com(0x80+0x40+4);//讓光標在分的位置閃爍
					break;
				case 3:
					//在時的位置
					getTimebuf[2]--;
					if(getTimebuf[2]==0xff){
						getTimebuf[2]=0x23;
					}
					if(getTimebuf[2]==0x1f){
						getTimebuf[2]=0x19;
					}
					if(getTimebuf[2]==0x0f){
						getTimebuf[2]=0x09;
					}
					time[0]=(getTimebuf[2])/16+48;//格式化時間小時
					time[1]=(getTimebuf[2])%16+48;
					write_1602com(0x80+0x40+0);//在小時的位置
					write_1602data(time[0]);
					write_1602com(0x80+0x40+1);
					write_1602data(time[1]);
					write_1602com(0x80+0x40+1);
					break;
				case 4:
					//在星期的位置
					getTimebuf[5]--;
					if(getTimebuf[5]==0){
						getTimebuf[5]=0x07;
					}
					if((getTimebuf[5]%10)*3==21){//輪完了  重新開始
						week[0]=weeklist[0];
						week[1]=weeklist[1];
						week[2]=weeklist[2];
					}else{
						week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
						week[1]=weeklist[(getTimebuf[5]%10)*3+1];
						week[2]=weeklist[(getTimebuf[5]%10)*3+2];
					}
					write_1602com(0x80+12);
					write_1602data(week[0]);
					write_1602com(0x80+13);
					write_1602data(week[1]);
					write_1602com(0x80+14);
					write_1602data(week[2]);
					write_1602com(0x80+14);
					break;
				case 5:
					//在日的位置
					getTimebuf[3]--;
					if(getTimebuf[3]==0){
						getTimebuf[3]=0x31;
					}
					if(getTimebuf[3]==0x2f){
						getTimebuf[3]=0x29;
					}
					if(getTimebuf[3]==0x1f){
						getTimebuf[3]=0x19;
					}
					if(getTimebuf[3]==0x0f){
						getTimebuf[3]=0x09;
					}
					date[8]=(getTimebuf[3])/16+48;
					date[9]=(getTimebuf[3])%16+48;
					write_1602com(0x80+9);
					write_1602data(date[8]);
					write_1602com(0x80+10);
					write_1602data(date[9]);
					write_1602com(0x80+10);
					break;
				case 6:
					//在月的位置
					getTimebuf[4]--;
					if(getTimebuf[4]==0){
						getTimebuf[4]=0x12;
					}
					if(getTimebuf[4]==0x0f){
						getTimebuf[4]=0x09;
					}
					date[5]=(getTimebuf[4])/16+48;
					date[6]=(getTimebuf[4])%16+48;
					write_1602com(0x80+6);
					write_1602data(date[5]);
					write_1602com(0x80+7);
					write_1602data(date[6]);
					write_1602com(0x80+7);
					break;
				case 7:
					//在年的位置
					getTimebuf[6]--;
					if(getTimebuf[6]==0xff){
						getTimebuf[6]=0x99;
					}
					if(getTimebuf[6]==0x8f){
						getTimebuf[6]=0x89;
					}
					if(getTimebuf[6]==0x7f){
						getTimebuf[6]=0x79;
					}
					if(getTimebuf[6]==0x6f){
						getTimebuf[6]=0x69;
					}
					if(getTimebuf[6]==0x5f){
						getTimebuf[6]=0x59;
					}
					if(getTimebuf[6]==0x4f){
						getTimebuf[6]=0x49;
					}
					if(getTimebuf[6]==0x3f){
						getTimebuf[6]=0x39;
					}
					if(getTimebuf[6]==0x2f){
						getTimebuf[6]=0x29;
					}
					if(getTimebuf[6]==0x1f){
						getTimebuf[6]=0x19;
					}
					if(getTimebuf[6]==0x0f){
						getTimebuf[6]=0x09;
					}
					date[2]=(getTimebuf[6])/16+48;
					date[3]=(getTimebuf[6])%16+48;
					write_1602com(0x80+3);
					write_1602data(date[2]);
					write_1602com(0x80+4);
					write_1602data(date[3]);
					write_1602com(0x80+4);
					break;
				}
			}
			if(alarm!=0){
				switch(alarm){
					case 1:
						//調節鬧鐘的開與關
						if(isOpen==0){
							isOpen=1;
							write_1602com(0x80+0x40+13);
							write_1602data(' ');
							write_1602data('O');
							write_1602data('N');
						}else{
							isOpen=0;
							write_1602com(0x80+0x40+13);
							write_1602data('O');
							write_1602data('F');
							write_1602data('F');
						}
						//防止寫后地址自動向后加一  光標閃爍看不到
						write_1602com(0x80+0x40+15);
						break;
					case 2:
						//調節鬧鐘的分
						fen--;
						if(fen<0){
							fen=59;
						}
						display_alarm(0x80+0x40+8,fen);
						break;
					case 3:
						//調節鬧鐘的小時
						shi--;
						if(shi<0){
							shi=23;
						}
						display_alarm(0x80+0x40+5,shi);
						break;
				}
			}
		}
	}
	if(key_set_alarm==0){//檢測是否按下
		delay(10);//消抖
		if(key_set_alarm==0){//再次檢測是否按下
			while(!key_set_alarm);//檢測是否松開
			delay(10);//延時消抖
			while(!key_set_alarm);//再次檢測是否松開
			if(count==0){//時間在正常走動的時候才能設置鬧鐘
				init_alarm();
				alarm++;//說明進入鬧鐘設置界面
				if(alarm==4){
					alarm=0;//說明鬧鐘設置完畢
					write_1602com(0x01);//清屏以便顯示時間
					write_1602com(0x0c);//關閉光標
					//顯示設置成功或取消的提示
					if(isOpen){
						write_1602com(0x80+2);
						for(i=0;i<11;i++){
							write_1602data(tips1[i]);
						}
					}else{
						write_1602com(0x80+1);
						for(i=0;i<14;i++){
							write_1602data(tips2[i]);
						}
					}
					//延時2ms后清屏顯示時間
					delay(2000);
					write_1602com(0x01);
				}else{
					switch(alarm){
						case 1:
							write_1602com(0x80+0x40+15);
							break;
						case 2:
							write_1602com(0x80+0x40+9);
							break;
						case 3:
							write_1602com(0x80+0x40+6);
							break;
					}
					write_1602com(0x0f);
				}
			}
		}
	}
}
void beep(){
	//檢測鬧鐘  并且報警
	if(time[0]==int_to_char(shi/10)&&time[1]==int_to_char(shi%10)&&time[3]==int_to_char(fen/10)&&time[4]==int_to_char(fen%10)){
		isRing=1;//鬧鐘響起,此時如果進入鬧鐘設置界面 改變時分,鬧鐘就關閉了
		bee=0;
		delay(250);
		bee=1;
		delay(250);
	}else{
		isRing=0;//關閉鬧鐘或者一分鐘后鬧鐘自動關閉
		bee=1;
	}
}
void delay1(int i){
	while(i--);
}
void ds18b20_init(){
	uchar x=0;
	dq = 1;    //DQ復位
	delay1(8);  //稍做延時
	dq = 0;    //單片機將DQ拉低
	delay1(80); //精確延時 大于 480us
	dq = 1;    //拉高總線
	delay1(14);
	x=dq;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
	delay1(20);
}
uchar ds18b20_read(){
	//讀一個字節
	uchar i=0;
	uchar dat = 0;
	for (i=8;i>0;i--)
	{
		dq = 0; // 給脈沖信號
		dat>>=1;
		dq = 1; // 給脈沖信號
		if(dq)
			dat|=0x80;
		delay1(4);
	}
	return(dat);
}
void ds18b20_write(char dat){
	//寫一個字節
	uchar i=0;
	for (i=8; i>0; i--)
	{
		dq = 0;
		dq = dat&0x01;
		delay1(5);
		dq = 1;
		dat>>=1;
	}
}
int ds18b20_read_temp(){
	//讀取溫度
	uchar low;
	uchar high;
	unsigned long tmp;
	float value;
	int t;//溫度
	ds18b20_init();
	ds18b20_write(0xCC); //跳過讀序列號的操作
	ds18b20_write(0x44); //啟動溫度轉換
	ds18b20_init();
	ds18b20_write(0xCC); //跳過讀序列號的操作
	ds18b20_write(0xBE); //讀取溫度寄存器  共九個  前兩個代表溫度
	low=ds18b20_read();//低八位數據
	high=ds18b20_read();//高八位數據

	tmp=high;
	tmp<<=8;
	tmp=tmp|low;
	//此處有正負之分
	if(tmp>=63488){//ffff f000 0000 0000-->(f800)
		temp_flag=0;
		//8位全為1時,加1才進位
		if((~low)==0xff){//判斷low取反加1之后是否進位
			high=(~high)+1;
			low=0;
		}else{
			high=~high;
			low=(~low)+1;
		}
		tmp=high*256+low;
	}else{
		temp_flag=1;
	}
	value=tmp*0.0625;
	t=value*10+((temp_flag==1)?+0.5:-0.5);//放大十倍輸出并四舍五入
	return t;
}
void main(){
	init_1602();
	init_ds1302();
	while(1){
		if(isOpen){//只有開啟鬧鐘的時候才檢測
			beep();//不斷檢測鬧鐘
		}
		key_scan();
		if(count==0&&alarm==0){//沒有設定時間  也沒有在鬧鐘界面的時候時間才顯示
			display();
		}
	}
}
關閉窗口

相關文章

亚洲影院在线播放| 久久夜色精品国产噜噜av| 久久一二三区| 成人国产亚洲欧美成人综合网| 国产精品伦一区| 色综合色综合色综合色综合色综合| 欧美mv和日韩mv国产网站| 久久久久www| 成人有码在线播放| 老司机av福利| 性久久久久久久久久久久久久| 美女av免费看| 国产99999| 深夜福利网站| 国产日本在线视频| 日韩黄色三级在线观看| 91欧美国产| 国产一区二区三区美女| 有码一区二区三区| 亚洲成人免费网站| 国产精品狼人色视频一区| 一区二区三区四区久久| 女人扒开腿免费视频app| 91视频免费在线看| 天天操天天干天天| 成人网18免费看| 99久久精品免费观看国产| 97se亚洲国产一区二区三区| 韩日精品在线| 久久久久久久网| 8x8x8国产精品| 久久露脸国产精品| 亚洲国产欧美不卡在线观看| 人妻换人妻仑乱| 中文字幕一区二区人妻电影| 国产精品入口免费麻豆| av网站在线免费播放| 91夜夜蜜桃臀一区二区三区| 丝袜亚洲精品中文字幕一区| 亚洲精品国产成人久久av盗摄 | 91精品国产高清久久久久久久久 | 久久亚洲国产中v天仙www| 亚洲裸体视频| 国产日韩一区二区三免费高清| 国产手机视频一区二区 | 岛国一区二区三区| 一本色道a无线码一区v| 色在人av网站天堂精品| 欧美日韩亚洲一区二区三区在线观看| 亚洲 欧美 日韩系列| 影音先锋亚洲天堂| 同性gay免费| 污视频在线看网站| 91亚洲一区| 国产欧美日韩一区二区三区在线观看| 欧美va在线播放| 91精品久久久久久久久久久久久久 | 成人字幕网zmw| 日韩中文字幕三区| 国产一级特黄a高潮片| 精品一区二区三区在线成人| 日本精品在线| 色偷偷综合网| 欧美国产精品劲爆| 一本色道久久88综合日韩精品| 精品一卡二卡三卡四卡日本乱码 | 肉色超薄丝袜脚交一区二区| 欧美色视频免费| 亚洲第一福利专区| 9久草视频在线视频精品| 精品久久久久av影院| www.久久久| 蜜臀av粉嫩av懂色av| 亚洲免费成人网| 国产在线视频你懂得| 欧洲视频一区| 亚洲欧洲精品一区二区精品久久久| 在线观看日韩www视频免费| 欧美午夜精品理论片a级大开眼界| 天堂www中文在线资源| 亚洲AV无码精品色毛片浪潮| 四虎在线观看| 日韩一区欧美| 一区二区三区四区激情 | 国产精品视频xxxx| 国产高清av片| 日本xxxx人| 国产剧情在线| 亚洲高清资源| 欧洲一区在线电影| 国产精品二区在线| 韩国三级hd中文字幕| 国产精品免费视频一区二区三区 | 欧美性欧美巨大黑白大战| 国产精品视频一区二区高潮| 国产又粗又长又爽又黄的视频| 亚洲第一天堂网| 麻豆系列在线观看| 99国产精品99久久久久久粉嫩| 色先锋资源久久综合| 亚洲www视频| 实拍女处破www免费看| 国产激情网址| 国产日韩欧美中文在线| 久久久美女毛片| 九九久久久久久久久激情| 中国丰满人妻videoshd| 国产精品乱码久久久| 尤物视频在线免费观看| 亚洲欧美不卡| 精品免费视频.| 亚洲一区尤物| 无码人妻丰满熟妇精品| 番号集在线观看| 激情久久一区| 日韩欧美国产一二三区| 一本一本久久a久久精品综合妖精| 日本一级一片免费视频| 久久精品国产亚洲a∨麻豆| 亚洲性图久久| 精品国产不卡一区二区三区| 亚洲第一在线综合在线| 日本一区二区免费在线观看| 亚洲成人福利| 日韩午夜免费视频| 亚洲成人av在线| 国产精品8888| 国产精品羞羞答答在线| 青春草视频在线| 国产精品综合一区二区| 日韩视频中文字幕| 香蕉视频999| 国产区卡一卡二卡三乱码免费| 99视频有精品高清视频| 亚洲欧洲精品一区二区三区不卡| 国产精品欧美一区二区三区奶水| 亚洲区自拍偷拍| 九色porn| 亚洲高清免费| 亚洲精品视频在线观看视频| 人人妻人人添人人爽欧美一区| 女人18毛片水真多18精品| 亚洲第一会所001| 欧美国产日韩a欧美在线观看| 欧美一级电影久久| 免费看污片网站| 日韩男人天堂| 一本久道综合久久精品| 亚洲欧美日韩天堂| 国产3p在线播放| 奇米色在线视频| 色综合蜜月久久综合网| 91精品国产丝袜白色高跟鞋| 国产精品videossex国产高清| 天天色综合久久| 日韩在线观看中文字幕| 精品高清美女精品国产区| 日韩资源av在线| 亚洲天堂avav| av有声小说一区二区三区| 亚洲柠檬福利资源导航| 国产在线一区二| 中文字幕+乱码+中文| 91九色美女在线视频| 久久久www免费人成精品| 国产精品夜间视频香蕉| 国产性猛交普通话对白| www红色一片_亚洲成a人片在线观看_| 国产成人在线观看免费网站| 日韩69视频在线观看| 国产一二三区精品| 成人影院www在线观看| 久久久久久久一区| 国产成人看片| 97在线公开视频| 日韩第二十一页| 黄网站色欧美视频| 国产日产欧美一区二区| 男人女人靠逼视频| 综合亚洲自拍| 亚洲高清久久网| 下面一进一出好爽视频| 国产经典视频一区| 免费精品视频最新在线| 欧美一级免费视频| 国产精选第一页| 亚洲一级少妇| 婷婷成人激情在线网| 天堂а√在线中文在线| 欧美另类videos黑人极品| 日韩精品第一区| 中文字幕亚洲国产| 香蕉网在线播放| 成人午夜电影在线观看| 2020国产精品久久精品美国| 福利精品视频| 囯产精品久久久久久| 亚洲性视频大全| 国产视频一区在线| 国产呦小j女精品视频| 在线观看a视频| 亚洲国产精品黑人久久久 | 国产精品福利视频一区二区三区| 日韩免费高清| 中文字幕成人在线| 久草福利资源在线| av福利在线导航| 午夜精品免费在线| 无码专区aaaaaa免费视频| 黄视频在线观看www| 日韩综合在线视频| 国产欧美精品久久久| 亚洲综合免费视频| 婷婷综合成人| 在线丨暗呦小u女国产精品| 蜜桃av免费看| 女子免费在线观看视频www| 亚欧色一区w666天堂| 日韩精品视频久久| 免费xxxxx网站中文字幕| 粉嫩13p一区二区三区| 久久综合九九| 久久精品成人欧美大片免费| 亚洲经典在线看| 国产精品高清在线| 亚洲AV无码乱码国产精品牛牛 | av在线播放天堂| 好看的av网站| 粉嫩在线一区二区三区视频| 欧美久久久久久| 2022国产麻豆剧果冻传媒剧情| 狂野欧美性猛交xxxx巴西| 91精品视频在线播放| 天堂在线资源8| 亚洲性视频h| 成人免费看黄网站| 五月天婷婷视频| 亚洲国产激情| 成人日韩av在线| 亚洲区小说区图片区| 亚洲婷婷免费| 成人免费大片黄在线播放| 男女啪啪a级毛片| 国产精品久久久久久模特| 91麻豆国产语对白在线观看| 久热免费在线视频| 日韩精品91亚洲二区在线观看| 99re在线国产| ed2k情侣啪啪91av| 国产精品性做久久久久久| 日本一区二区视频| 比比资源先锋| 91啪亚洲精品| 日韩日韩日韩日韩日韩| 麻豆传媒在线播放| 亚洲免费高清视频在线| 日本黄大片一区二区三区| 老司机午夜在线视频| 在线免费观看日本欧美| 亚洲最大免费视频| 欧美成人精品一区二区男人小说| 精品黑人一区二区三区久久| 又嫩又硬又黄又爽的视频| 成人激情久久| 久久久国产精品免费| 7777久久亚洲中文字幕| 欧美一区影院| 91精品久久久久久蜜桃| 俄罗斯性欧美| www.66久久| 欧美三级一级片| 永久av在线| 日韩一区二区三免费高清| 久久人妻无码aⅴ毛片a片app | 国产精品一区二区不卡视频| 91九色porn蝌蚪| 不卡av免费在线观看| 国产一二三在线视频| 精品99又大又爽又硬少妇毛片| 高跟丝袜欧美一区| 国产又粗又猛又爽又黄av | 五月婷婷伊人网| 老司机午夜精品| 一区二区日本| 全色精品综合影院| 欧美日韩美少妇| 欧美精品一区二区成人| 国产成人高清| 91精品免费久久久久久久久| 本道综合精品| 日本一区二区免费在线| 亚洲欧洲日本精品| 午夜激情电影在线播放| 在线观看视频99| 国产黄色片免费| 精品一区二区三区影院在线午夜 | 综合中文字幕| 欧美中文字幕在线| 国产精品视频第一区二区三区 | 精品视频一区二区在线观看| 日韩精品一区二区三区免费观影| 91天堂在线视频| 激情亚洲综合网| 精品高清一区二区三区| 福利视频第一页| 欧美色图在线播放| 国产91精品一区二区绿帽| 国产国语**毛片高清视频 | 欧美tickling挠脚心丨vk| 久久国产黄色片| 中日韩男男gay无套| 亚洲三区在线观看| 国产高清免费在线播放| 亚洲国产精品va在线观看黑人| 中日韩av在线| 免费观看在线综合色| 日韩av资源在线| 国模套图日韩精品一区二区| 欧美日韩成人在线播放| 韩国视频一区| 亚洲视频一区二区在线| 99精品欧美一区二区| 教室别恋欧美无删减版| 久久精品国产综合精品| 在线观看av每日更新免费| 日韩小视频在线观看专区| 在线观看毛片网站| 国产美女一区二区三区| 国产视频1区2区3区| 国产免费区一区二区三视频免费 | 久久久久免费观看| 亚洲高清无码久久| 啪啪亚洲精品| 欧美日韩电影一区二区三区| 国产精品天堂| 在线播放国产一区中文字幕剧情欧美| 亚洲天堂电影在线观看| 国产精品视频一区二区三区不卡| x88av在线| 欧美在线免费一级片| 在线观看成人免费| 美女网站在线看| 欧洲日韩成人av| 成年人在线免费观看视频网站| 欧美精品亚洲二区| 精品国产无码一区二区| 91麻豆swag| 亚洲毛片亚洲毛片亚洲毛片| 欧美国内亚洲| 日韩精品一区在线视频| jvid一区二区三区| 成人在线中文字幕| 日韩二区三区| 日韩在线不卡视频| 色一情一乱一伦一视频免费看| 五月天亚洲精品| 免费精品一区二区| 成人小视频在线| 久久久久国产精品区片区无码| 色乱码一区二区三区网站| 中文字幕乱码一区二区三区| 手机在线观看av| 国产精品久久久久久av下载红粉| 日本1区2区3区中文字幕| 精品久久久久香蕉网| 全国男人的天堂天堂网| 一个色综合网站| 欧美日韩一级黄色片| 成人午夜视频网站| 欧美激情视频二区| 久久久蜜桃一区二区人| 91在线第一页| 婷婷亚洲五月| 黄色免费观看视频网站| 大香伊人久久精品一区二区| 久久五月天婷婷| 欧美少妇网站| 91成人理论电影| 在线中文字幕-区二区三区四区| 5278欧美一区二区三区| 在线观看av网| 久久6精品影院| 大地资源高清播放在线观看| 在线观看免费高清视频97| 777丰满影院| 精品丝袜一区二区三区| 伊人免费视频| 日韩欧美123| 国产精品免费麻豆入口| 欧美日韩国产乱码电影| 原谅我中文字幕| 欧美三级视频在线观看| 国产精品无码99re| 欧洲视频一区二区| 中文字幕jux大岛优香| 欧美性videosxxxxx| 九九久久久2| 欧美日韩国产高清一区二区三区| 香蕉国产在线视频| 在线免费精品视频|