| 查看: 1955 | 回復(fù): 15 | ||
[求助]
求各位大神幫我看下一個小小的程序,只需要你一點兒時間。就會幫我很大的忙
|
||
|
各位大牛們。我來小木蟲,有四年了,從大學(xué)開始到現(xiàn)在馬上畢業(yè)。 學(xué)習(xí)到了很多知識,想過很多路要走。出國,考研,找工作。 在最后時刻,我進(jìn)了移動。我學(xué)的通信,對C語言方面實在是頭疼。 懇請各位幫助我一下。、 將一個很簡單的電子萬年歷的程序。畫一個流程圖、、、、、如果誰愿意。。加我QQ 我在線等、到時候把源程序給你們看看。不多。就500行左右的程序。如果可以,幫我講解一下。也許會浪費一點時間 ![]() ![]() ![]() 。但是對我的幫助不可估量,謝謝了。。。。。 |
|
#include<reg51.h> //調(diào)用頭文件 #define uchar unsigned char //宏定義用 uchar 來代表 unsigned char #define uint unsigned int //宏定義用 uint 來代表 unsigned int sbit io=P1^3; //定義DS1302數(shù)據(jù)引腳 sbit rst=P1^4; //定義DS1302復(fù)位引腳 sbit sclk=P1^2; //定義DS1302時鐘引腳 sbit rs=P1^0; //定義LCD1602數(shù)據(jù)/命令選擇引腳 sbit en=P1^1; //定義LCD1602使能端引腳 sbit moshi=P1^7; //定義模式鍵 sbit jia =P3^1; //定義按鍵加 sbit jian =P3^4; //定義按鍵減 sbit nz =P3^7; //定義鬧鐘鍵 sbit beep =P2^6; //定義蜂鳴器輸出端 sbit DQ =P2^0; //定義DS18B20數(shù)據(jù)段 uchar code tab[10]={"0123456789"}; //定義0~9ASCLL碼數(shù)組 uchar code tab_xingqi[7][3]={{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; //定義星期數(shù)組 uchar code tab_alarm[2][16]={{"alarm clock: OFF"},{"alarm clock: ON "}}; char second,minute,hour,date,month,year,day,key,shi,fen,num; //定義年月日時分秒數(shù)據(jù)變量 uint value; //定義數(shù)據(jù)變量(用于數(shù)據(jù)轉(zhuǎn)換前暫時存貯) bit alarmclock,xianshiclock; bit s1,s2,s3,s4,s5,s6,s7,kai=1; void delay(uint z) //延時子程序 { uint x; uchar y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay1302(uint z) { for(z=z;z>0;z--); } void delay_18B20(unsigned int i) //DS18B20延時子延時 { while(i--); } //初始化函數(shù) void Init_DS18B20(void) //DS18B20初始化 { unsigned char x=0; DQ = 1; //DQ復(fù)位 delay_18B20(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay_18B20(80); //精確延時 大于 480us DQ = 1; //拉高總線 delay_18B20(14); x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20); } ReadOneChar(void) //讀一個字節(jié) { 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_18B20(4); } return(dat); } void WriteOneChar(unsigned char dat) //寫一個字節(jié) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } //讀取溫度 ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換 delay_18B20(100); Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 a=ReadOneChar(); b=ReadOneChar(); //傳感器返回值除16得實際溫度值 //為了得到2位小數(shù)位,先乘100,再除16,考慮整型數(shù)據(jù)長度, //技巧處理后先乘25,再除4,除4用右移實現(xiàn) t = (b*256+a)*25; return( t >> 2 ); } void lcdcom (uchar com) //LCD1602寫入地址 { rs=0; P0=com; delay(5); en=1; delay(5); en=0; delay(5); } void lcddata (uchar dat)//LCD1602寫入數(shù)據(jù) { rs=1; P0=dat; delay(5); en=1; delay(5); en=0; delay(5); } void lcddisplay(uchar a,uchar b) //LCD1602顯示程序 { lcdcom(a); lcddata(b); } void lcdinit() //LCD1602初始化 { en=0; lcdcom(0x38); lcdcom(0x0c); lcdcom(0x06); lcdcom(0x01); } void write(uchar dat) //寫數(shù)據(jù) { uchar i; sclk=0; delay1302(1); for(i=0;i<8;i++) { io=dat&0x01; delay1302(1); sclk=1; //sclk上升沿接收數(shù)據(jù)有效 delay1302(1); sclk=0; delay1302(1); dat>>=1; } } void writeset(uchar cmd,uchar dat) //DS1302寫入數(shù)據(jù) { rst=0; delay1302(1); sclk=0; delay1302(1); rst=1; delay1302(1); write(cmd); write(dat); sclk=1; delay1302(1); rst=0; } unsigned char read() //讀數(shù)據(jù) { uchar i,dat; delay1302(1); for(i=0;i<8;i++) { dat>>=1; if(io==1) dat|=0x80; sclk=1; delay1302(1); sclk=0; delay1302(1); } return dat; } unsigned char readset(uchar cmd) //DS1302讀出數(shù)據(jù) { uchar dat; rst=0; delay1302(1); sclk=0; delay1302(1); rst=1; write(cmd); dat=read(); sclk=1; delay1302(1); rst=0; return dat; } void initDS1302() //DS1302初始化 { writeset(0x8E,0x00); writeset(0x80,((0/10)<<4|(0%10))); writeset(0x82,((0/10)<<4|(0%10))); writeset(0x84,((12/10)<<4|(12%10))); writeset(0x86,((1/10)<<4|(1%10))); writeset(0x88,((1/10)<<4|(1%10))); writeset(0x8c,((10/10)<<4|(10%10))); } void xianshi() //顯示子程序 { uchar i; uint tmp; if(xianshiclock==0) { lcddisplay(0x80,'2'); //顯示 2 lcddata('0'); //顯示 0 value = readset(0x8d); //讀取年 year=((value&0x70)>>4)*10 + (value&0x0F); //數(shù)據(jù)轉(zhuǎn)換 if(s1==0) { lcddata(tab[year/10]); //顯示年十位 lcddata(tab[year%10]); //顯示年個位 } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } lcddata('/'); //顯示 / value = readset(0x89); //讀取月 month=((value&0x70)>>4)*10 + (value&0x0F);//轉(zhuǎn)換月 if(s2==0) { lcddata(tab[month/10]); //顯示 月十位 lcddata(tab[month%10]); //顯示 月個位 } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } lcddata('/'); //顯示 / value = readset(0x87); //讀取日 date=((value&0x70)>>4)*10 + (value&0x0F); //轉(zhuǎn)換日 if(s3==0) { lcddata(tab[date/10]); //顯示 日十位 lcddata(tab[date%10]); //顯示 日個位 } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } value = readset(0x8b); //讀取星期 day = value; //轉(zhuǎn)換星期 lcdcom(0x8c); //寫入要顯示的地址 for(i=0;i<3;i++) { lcddata(tab_xingqi[day-1]);//顯示星期 } value = readset(0x85); //讀小時 hour=((value&0x70)>>4)*10 + (value&0x0F); //轉(zhuǎn)換小時 lcdcom(0xc0); if(s4==0) { lcddata(tab[hour/10]); //顯示小時十位 lcddata(tab[hour%10]); //顯示小時個位 } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } lcddata(':'); //顯示 : value = readset(0x83); //讀分鐘 minute=((value&0x70)>>4)*10 + (value&0x0F);//轉(zhuǎn)換分鐘 if(s5==0) { lcddata(tab[minute/10]); //顯示分鐘十位 lcddata(tab[minute%10]); //顯示分鐘個位 } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } lcddata(':'); //顯示 : value = readset(0x81); //讀取秒 second=((value&0x70)>>4)*10 + (value&0x0F); //轉(zhuǎn)換秒 lcddata(tab[second/10]); //顯示秒十位 lcddata(tab[second%10]); //顯示秒個位 tmp=ReadTemperature(); //讀取溫度 lcdcom(0xca); //寫入要現(xiàn)實的地址 lcddata(tab[tmp/1000%10]); lcddata(tab[tmp/100%10]); lcddata('.'); lcddata(tab[tmp/10%10]); lcddata(0xdf); lcddata('C'); //顯示℃ } else { lcdcom(0x80); for(i=0;i<16;i++) { lcddata(tab_alarm[alarmclock]); //顯示鬧鐘 } lcdcom(0xc6); if(s6==0) { lcddata(tab[shi/10]); lcddata(tab[shi%10]); } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } lcddata(':'); if(s7==0) { lcddata(tab[fen/10]); lcddata(tab[fen%10]); } else { lcddata(' '); //顯示空白實現(xiàn)閃爍 lcddata(' '); } } } void anjian() //按鍵檢測程序 { if(moshi==0) //如果模式鍵按下 { delay(100); //延時消抖 key++; //再次按下加一,切換下一位 if(key>7) { key=0; //按夠一圈返回 xianshiclock=0; //顯示時鐘 lcdcom(0x01); //清屏 s7=0; } switch(key) { case 1: ; break; case 2:s1=0; break; case 3:s2=0; break; case 4:s3=0; break; case 5:s4=0; break; case 6: lcdcom(0x01); xianshiclock=1; s5=0; break; case 7:xianshiclock=1; s6=0; break; } while(moshi==0) xianshi(); delay(100); } if(jia==0) { delay(100); switch(key) { case 1: year++; if(year>99) year=0; writeset(0x8c,((year/10)<<4|(year%10))); break; //年加一 case 2: month++; if(month>12) month=1; writeset(0x88,((month/10)<<4|(month%10))); break; //月加一 case 3: date++; if(date>31) date=1; writeset(0x86,((date/10)<<4|(date%10))); break; //日加一 case 4: hour++; if(hour>23) hour=0; writeset(0x84,((hour/10)<<4|(hour%10))); break; //小時加一 case 5: minute++; if(minute>59)minute=0; writeset(0x82,((minute/10)<<4|(minute%10))); break; //分加一 case 6: shi++; if(shi>23) shi=0; break; //鬧鐘小時加一 case 7: fen++; if(fen>59) fen=0; break; //鬧鐘分鐘加一 } while(jia==0) xianshi(); delay(100); } if(jian==0) { delay(100); switch(key) { case 1: year--; if(year<0) year=0; writeset(0x8c,((year/10)<<4|(year%10))); break; //年減一 case 2: month--; if(month<1) month=12; writeset(0x88,((month/10)<<4|(month%10))); break; //月減一 case 3: date--; if(date<1) date=31; writeset(0x86,((date/10)<<4|(date%10))); break; //日減一 case 4: hour--; if(hour<0) hour=23; writeset(0x84,((hour/10)<<4|(hour%10))); break; //小時減一 case 5: minute--; if(minute<0)minute=59; writeset(0x82,((minute/10)<<4|(minute%10))); break; //分減一 case 6: shi--; if(shi<0) shi=23; break; //鬧鐘小時減一 case 7: fen--; if(fen<0) fen=59; break; //鬧鐘分鐘減一 } while(jian==0) xianshi(); delay(100); } if(nz==0) { delay(100); xianshiclock=1; lcdcom(0x01); if((key==6)||(key==7)) { alarmclock=~alarmclock; lcdcom(0x01); } while(nz==0) xianshi(); if((key!=6)&&(key!=7))xianshiclock=0; lcdcom(0x01); delay(100); } } void spert() //蜂鳴器發(fā)聲程序 { uchar i; for(i=200;i>0;i--) { beep=1; delay(1); beep=0; delay(1); } delay(500); for(i=200;i>0;i--) { beep=1; delay(1); beep=0; delay(1); } for(i=6;i>0;i--) { xianshi(); if(nz==0) kai=1; } } void naozhong() //鬧鐘程序 { if(fen!=minute) kai=1; if(kai==1) if(alarmclock==1) { if((shi==hour)&&(fen==minute)) //比較現(xiàn)在時間和鬧鐘時間是否一致 { kai=0; while(kai==0) { spert(); //發(fā)聲 } delay(100); //延時消抖 while(nz==0) xianshi(); //松手檢測 delay(100); //延時消抖 kai=0; //關(guān)閉鬧鐘等待下次觸發(fā) } } } void main() { lcdinit(); //LCD1602初始化 TMOD=0X01; //配置定時器模式 ET0=1; //開啟定時器1 EA=1; //開啟總中斷 TR0=1; //開始計時 beep=0; //關(guān)閉蜂鳴器 if(jia==0) initDS1302();//DS1302初始化 while(1) { xianshi(); //顯示 anjian(); //檢測按鍵 naozhong(); //檢測鬧鐘 } } void timer0() interrupt 1 //定時器0 中斷函數(shù) { TH0=0; TL0=0; num++; if(num==8) //閃爍時間 { num=0; switch(key) //根據(jù)KEY的值來選擇哪一位閃爍(調(diào)節(jié)時候) { case 1: s1=~s1; break; case 2: s2=~s2; break; case 3: s3=~s3; break; case 4: s4=~s4; break; case 5: s5=~s5; break; case 6: s6=~s6; break; case 7: s7=~s7; break; } } } |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 求材料調(diào)劑 +10 | 隔壁陳先生 2026-03-12 | 10/500 |
|
|---|---|---|---|---|
|
[考研] 本科鄭州大學(xué)物理學(xué)院,一志愿華科070200學(xué)碩,346求調(diào)劑 +4 | 我不是一根蔥 2026-03-18 | 4/200 |
|
|
[考研] 一志愿吉林大學(xué)材料學(xué)碩321求調(diào)劑 +4 | Ymlll 2026-03-18 | 6/300 |
|
|
[考研] 一志愿天津大學(xué)化學(xué)工藝專業(yè)(081702)315分求調(diào)劑 +10 | yangfz 2026-03-17 | 10/500 |
|
|
[考研] 311求調(diào)劑 +11 | 冬十三 2026-03-15 | 12/600 |
|
|
[考研] 材料專碩306英一數(shù)二 +10 | z1z2z3879 2026-03-16 | 13/650 |
|
|
[考博] 環(huán)境領(lǐng)域全國重點實驗室招收博士1-2名 +3 | QGZDSYS 2026-03-13 | 5/250 |
|
|
[考研] 材料,紡織,生物(0856、0710),化學(xué)招生啦 +3 | Eember. 2026-03-17 | 9/450 |
|
|
[考研] 301求調(diào)劑 +9 | yy要上岸呀 2026-03-17 | 9/450 |
|
|
[考博] 26博士申請 +3 | 1042136743 2026-03-17 | 3/150 |
|
|
[考研] 290求調(diào)劑 +3 | p asserby. 2026-03-15 | 4/200 |
|
|
[考研] 290求調(diào)劑 +6 | 孔志浩 2026-03-12 | 11/550 |
|
|
[論文投稿] 有沒有大佬發(fā)小論文能帶我個二作 +3 | 增銳漏人 2026-03-17 | 4/200 |
|
|
[基金申請]
今年的國基金是打分制嗎?
50+3
|
zhanghaozhu 2026-03-14 | 3/150 |
|
|
[考研] 318求調(diào)劑 +3 | Yanyali 2026-03-15 | 3/150 |
|
|
[考研] 求老師收留調(diào)劑 +4 | jiang姜66 2026-03-14 | 5/250 |
|
|
[考研] 328求調(diào)劑 +3 | 5201314Lsy! 2026-03-13 | 6/300 |
|
|
[考研] 一志愿哈工大材料324分求調(diào)劑 +5 | 閆旭東 2026-03-14 | 5/250 |
|
|
[考研] 266求調(diào)劑 +4 | 學(xué)員97LZgn 2026-03-13 | 4/200 |
|
|
[考研] 274求調(diào)劑 +3 | S.H1 2026-03-12 | 3/150 |
|