標題: 電子時鐘設計 求大神給個思路 想自學單片機技術 [打印本頁]
作者: yb821416945 時間: 2016-11-26 23:00
標題: 電子時鐘設計 求大神給個思路 想自學單片機技術
電子時鐘設計:(1) 用51系列單片機作為控制器(2) 采用LCD液晶作為顯示設備(3) 可以分別設定小時,分鐘和秒(4) 能實現日期的設置,年、月、日
(5) 采用5V直流穩壓電源(6)匯編語言編寫(7)仿真圖,程序流程圖
作者: ning 時間: 2016-11-27 10:37
你這是設計吧!我看你等級也不低,這個項目應該不是問題吧!
作者: yb821416945 時間: 2016-11-27 11:21
純新手,求大神幫忙
作者: yhy02 時間: 2017-5-5 15:44
可以照著網上搜的原理圖,用仿真軟件畫出
作者: 123123123098 時間: 2018-6-18 19:15
- #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();
- }
- }
- }
復制代碼
| 歡迎光臨 (http://m.izizhuan.cn/bbs/) |
Powered by Discuz! X3.1 |
一色屋免费视频|
日本三级在线观看网站|
日本三级欧美三级|
国产欧美久久久久|
国产成人精品久久|
欧美日韩在线播放|
91亚洲精华国产精华精华液|
国产伦精品一区二区三区视频|
久久99精品久久久久久野外|
狠狠搞狠狠干|
亚洲风情第一页|
51精品免费网站|
韩国日本美国免费毛片|
九九九久久久|
91国产视频在线|
亚洲精美色品网站|
香港成人在线视频|
久久久久久久国产精品影院|
午夜在线精品偷拍|
国产一区不卡|
欧美亚洲黄色|
日韩伦理av|
污视频免费在线看|
黄色电影网站在线观看|
人成网站在线观看|
9i精品福利一区二区三区|
91精品国产自产|
欧美在线观看成人|
日韩中文不卡|
成人9ⅰ免费影视网站|
1769国内精品视频在线播放|
国产一区二区三区毛片|
欧美精品xxxxbbbb|
精品久久久久久|
中文字幕在线不卡一区
|
国产粉嫩一区二区三区在线观看|
久久91av|
美女视频一区二区三区在线|
日本中文字幕第一页|
女人裸体性做爰全过|
最新免费av网址|
www.com毛片|
日本特级黄色大片|
久久久久久久久久久久久久一区|
国产欧美日韩精品专区|
午夜精品一区二区三区视频免费看|
亚洲福利在线观看|
7777精品伊人久久久大香线蕉完整版
|
免费的av网站|
www.99av.com|
人妻熟妇乱又伦精品视频|
亚洲va久久久噜噜噜久久狠狠|
99re在线|
91久久国产自产拍夜夜嗨|
国产精品精品视频|
日本高清+成人网在线观看|
久久伊人精品天天|
亚洲色图五月天|
精品亚洲va在线va天堂资源站|
在线播放日韩导航|
欧美中文字幕一区二区三区亚洲|
一区二区在线免费观看|
综合色中文字幕|
国产精品第五页|
国产欧美日韩另类一区|
337p粉嫩大胆噜噜噜噜噜91av
|
91色视频在线|
日本不卡在线视频|
日本欧美一区二区|
丝袜亚洲另类欧美综合|
99综合精品|
日韩久久视频|
婷婷激情图片久久|
一本到12不卡视频在线dvd|
欧美在线色图|
成人精品亚洲|
国产韩国精品一区二区三区|
欧美人与牲禽动交com|
麻豆传媒在线观看|
国产福利第一视频在线播放|
日本a一级在线免费播放|
香蕉521av成人网|
成年人在线免费|
夜夜狂射影院|
136av视频导航|
99久久99热久久精品免费看|
欧美乱大交xxxx|
桃乃木香奈和黑人aⅴ在线播放
|
清纯唯美激情亚洲|
91精品麻豆|
九九热hot精品视频在线播放|
九九热hot精品视频在线播放|
亚洲第一福利社区|
欧美独立站高清久久|
亚洲性感美女99在线|
日韩二区三区四区|
粉嫩蜜臀av国产精品网站|
91视视频在线观看入口直接观看www|
久久你懂得1024|
亚洲最新在线观看|
欧美男同性恋视频网站|
欧美精品一区二区三区久久久|
亚洲精品视频播放|
久久久久999|
欧洲亚洲在线视频|
国产精品露出视频|
国产激情片在线观看|
大肉大捧一进一出好爽动态图|
午夜影院免费版|
99热6这里只有精品|
日本韩国欧美中文字幕|
黄色av小说在线观看|
国产在线视频精品视频免费看|
黄色动漫免费网站|
香蕉97视频观看在线观看|
成人影院www在线观看|
日本h片久久|
国产一区二区三区四区五区传媒|
影音国产精品|
成人精品亚洲人成在线|
亚洲精品视频在线|
日韩三级视频在线观看|
久久久91精品国产|
91精品国产综合久久香蕉的用户体验|
欧美日韩天天操|
妺妺窝人体色www在线小说|
中文字幕在线播放一区|
日本不卡在线播放|
日本一道本久久|
国产国语老龄妇女a片|
欧美高清视频一区二区三区|
精品人妻一区二区三区麻豆91
|
日本熟妇毛茸茸丰满|
www.五月婷婷|
bdsmchinese医疗折磨|
一级日本在线|
亚洲超碰在线观看|
av成人黄色|
久久蜜桃av一区精品变态类天堂
|
国产不卡一卡2卡三卡4卡5卡在线|
色爱综合网站|
黄色网页在线看|
亚洲一区二区三区日本久久九|
国产精品多人|
日本一区二区三级电影在线观看|
欧美日韩在线观看一区二区
|
杨幂一区二区国产精品|
激情综合五月网|
亚洲av激情无码专区在线播放|
天天做天天爱天天爽|
色屁屁www国产馆在线观看|
奇米影视777在线欧美电影观看|
丝袜美腿亚洲色图|
亚洲午夜国产一区99re久久|
一区二区三区四区在线观看视频
|
www一区二区三区|
精久久久久久|
亚洲欧洲www|
亚洲精品国精品久久99热一|
91精品久久久久久|
国产在线精品91|
日韩在线中文字幕视频|
高清av中文在线字幕观看1|
中文字幕大看焦在线看|
成人国产网站|
麻豆精品91|
五月综合激情网|
欧美国产日产韩国视频|
日本特级黄色大片|
国产一二三av|
欧美黑人性受xxxx精品|
午夜视频在线观看网站|
日韩精品免费一区二区夜夜嗨|
国产精品自在在线|
欧美人牲a欧美精品|
国产精品久久久91|
日本黄网站免费|
国产成人精品777777|
麻豆传媒mv|
欧美黄页在线免费观看|
免费高清成人在线|
欧美日韩免费不卡视频一区二区三区|
国内免费精品永久在线视频|
国产亚洲激情在线|
51成人做爰www免费看网站|
浓精h攵女乱爱av|
中文字幕一二三四|
天堂电影在线|
亚洲素人在线|
国产精品入口麻豆九色|
日韩中文字幕在线|
亚洲小视频在线播放|
一区二区视频免费看|
黄污视频在线看|
亚洲精品aa|
99免费精品视频|
在线a欧美视频|
黄色特一级视频|
国产无遮挡又黄又爽|
在线看片地址|
亚洲高清999|
国产日韩欧美精品在线|
欧美超级免费视 在线|
国产素人在线观看|
一级特黄色大片|
国产高清一级毛片在线不卡|
天天做天天爱综合|
欧美午夜无遮挡|
91在线观看欧美日韩|
v天堂中文在线|
国内精品免费视频精选在线观看|
伊伊综合在线|
www.亚洲人|
久久精品视频播放|
毛葺葺老太做受视频|
亚洲第一色视频|
第一中文字幕在线|
国产在线播精品第三|
亚洲人午夜精品|
俄罗斯av网站|
成人免费视频国产|
人狥杂交一区欧美二区|
国产成人综合视频|
精品国产区一区二区三区在线观看|
可以看毛片的网址|
国产suv一区二区|
青春草在线视频|
国产一区二区在线观看视频|
在线看日韩av|
99草草国产熟女视频在线|
五月天婷婷在线观看|
欧美freesex|
久久亚洲欧美国产精品乐播|
高清欧美性猛交xxxx黑人猛交|
在线一区二区不卡|
97精品高清一区二区三区|
成人激情自拍|
精品福利一区二区|
久久久久久久久久久久久9999|
国产日韩在线一区|
亚洲自拍偷拍图|
国产wwww|
黄色亚洲在线|
亚洲精品美女在线观看|
欧美色图色综合|
亚洲小说春色综合另类网蜜桃|
av成人免费|
亚洲欧美日韩久久精品|
av成人综合网|
国产精品久久久久久久久久久久久久久久久
|
国产欧美午夜|
日韩成人激情在线|
www.四虎成人|
日韩欧美在线视频一区二区|
一区二区三区视频播放|
黄网站色欧美视频|
性欧美videosex高清少妇|
国产乱码精品一区二区三区精东
|
www.欧美黄色|
天天操天天操天天干|
91成人精品观看|
午夜欧美2019年伦理|
日韩在线电影一区|
亚洲精品网站在线|
国产精品免费精品自在线观看|
一个色综合av|
一区二区三区四区国产|
日本美女一级视频|
国产精品巨作av|
欧美日韩午夜影院|
日本欧美黄色片|
www.91av.cn|
欧美成人日本|
在线日韩精品视频|
国产白嫩美女无套久久|
白虎精品一区|
精品一区二区在线视频|
日韩免费黄色av|
国产系列精品av|
91九色美女在线视频|
亚洲色图19p|
亚洲欧美成人一区|
四虎精品成人免费观看|
成人免费在线播放|
亚洲视频一区二区|
少妇特黄一区二区三区|
国产三级在线看|
久久精品亚洲乱码伦伦中文|
好吊妞www.84com只有这里才有精品
|
国产一级特黄毛片|
91豆花视频在线播放|
亚洲免费av观看|
日韩欧美精品久久|
美女把腿扒开让男人桶免费|
精品国精品国产自在久国产应用|
日韩精品视频免费在线观看|
免费看黄色片的网站|
欧美成人综合在线|
国产欧美日韩激情|
中文字幕一区二区三区有限公司|
性18欧美另类|
一本综合精品|
国产成人啪精品视频免费网|
亚洲精品成人在线视频|
国产精品亚洲综合在线观看
|
美女视频黄a视频全免费观看|
久久国产精品72免费观看|
国产日韩中文字幕|
www.97av|
欧美一区电影|
欧美区在线播放|
亚洲黄网在线观看|
红杏aⅴ成人免费视频|
亚洲国产欧美一区|
国产成人免费观看网站|
手机在线观看av|
在线成人小视频|
中文字幕 亚洲一区|
日本乱理伦在线|
一本色道亚洲精品aⅴ|
激情久久综合网|
啊v在线视频|
亚洲国产日韩一区二区|
日日摸日日碰夜夜爽av|
992tv在线观看|
国产精品视频免费|
日韩人妻无码精品久久久不卡|
国产成人综合美国十次|
91小视频在线免费看|
懂色av一区二区三区四区五区|
h视频在线观看网站|
国产91丝袜在线播放|
亚洲v国产v|
男人的天堂www|
国产日产欧美一区二区视频|
欧美图片激情小说|
欧美12一14sex性hd|
国产精品美日韩|
熟女少妇精品一区二区|
sese在线视频|
色婷婷综合久久久中文一区二区|
中文字幕在线视频一区二区|
曰本三级在线|
欧美精品乱码久久久久久按摩|
亚洲熟女乱综合一区二区三区
|
99在线精品一区二区三区|
国产成人生活片|
亚洲永久精品免费|
亚洲精品日产精品乱码不卡|
亚洲这里只有精品|
欧美黄色视屏|
亚洲第一区中文99精品|
精品无码人妻一区二区三区|
国产毛片久久久|
91精品国产高清自在线|
神宫寺奈绪一区二区三区|
日本成人中文字幕在线视频|
午夜精品电影在线观看|
特黄特色大片免费视频大全|
亚洲国产综合91精品麻豆|
亚洲最大视频网|
国产第一亚洲|
欧美成人小视频|
成人午夜视频一区二区播放|
日本成人中文字幕在线视频|
国产又黄又爽免费视频|
青青操视频在线|
欧美久久久久久久久|
国产性一乱一性一伧一色|
日韩dvd碟片|
97国产超碰|
h视频在线网站|
夜夜嗨av一区二区三区网页|
国产美女喷水视频|
国产区精品视频在线观看豆花|
欧美国产一区在线|
羞羞的视频在线|
日韩色淫视频|
久久精品在线播放|
五月天婷婷在线播放|
久久99国产精品尤物|
2021狠狠干|
a视频在线播放|
亚洲亚裔videos黑人hd|
国产一区二区在线不卡|
奶水喷射视频一区|
今天免费高清在线观看国语|
五月香视频在线观看|
欧美va亚洲va|
国产又粗又猛又爽又|
翔田千里一区二区|
一区二区免费在线观看|
国产福利第一视频在线播放|
制服丝袜日韩国产|
国产真人无遮挡作爱免费视频|
亚欧美中日韩视频|
妞干网在线视频观看|
av资源在线播放|
亚洲欧洲在线看|
性猛交富婆╳xxx乱大交天津|