| 查看: 1952 | 回復(fù): 15 | ||
jicai234銅蟲 (初入文壇)
|
[求助]
求各位大神幫我看下一個(gè)小小的程序,只需要你一點(diǎn)兒時(shí)間。就會(huì)幫我很大的忙
|
|
|
各位大牛們。我來小木蟲,有四年了,從大學(xué)開始到現(xiàn)在馬上畢業(yè)。 學(xué)習(xí)到了很多知識(shí),想過很多路要走。出國(guó),考研,找工作。 在最后時(shí)刻,我進(jìn)了移動(dòng)。我學(xué)的通信,對(duì)C語(yǔ)言方面實(shí)在是頭疼。 懇請(qǐng)各位幫助我一下。、 將一個(gè)很簡(jiǎn)單的電子萬(wàn)年歷的程序。畫一個(gè)流程圖、、、、、如果誰(shuí)愿意。。加我QQ 我在線等、到時(shí)候把源程序給你們看看。不多。就500行左右的程序。如果可以,幫我講解一下。也許會(huì)浪費(fèi)一點(diǎn)時(shí)間 ![]() ![]() ![]() 。但是對(duì)我的幫助不可估量,謝謝了。。。。。 |
銅蟲 (初入文壇)
銅蟲 (初入文壇)
銅蟲 (初入文壇)
銅蟲 (初入文壇)
銅蟲 (初入文壇)
銅蟲 (初入文壇)
|
#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時(shí)鐘引腳 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í)分秒數(shù)據(jù)變量 uint value; //定義數(shù)據(jù)變量(用于數(shù)據(jù)轉(zhuǎn)換前暫時(shí)存貯) bit alarmclock,xianshiclock; bit s1,s2,s3,s4,s5,s6,s7,kai=1; void delay(uint z) //延時(shí)子程序 { 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延時(shí)子延時(shí) { while(i--); } //初始化函數(shù) void Init_DS18B20(void) //DS18B20初始化 { unsigned char x=0; DQ = 1; //DQ復(fù)位 delay_18B20(8); //稍做延時(shí) DQ = 0; //單片機(jī)將DQ拉低 delay_18B20(80); //精確延時(shí) 大于 480us DQ = 1; //拉高總線 delay_18B20(14); x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20); } ReadOneChar(void) //讀一個(gè)字節(jié) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號(hào) dat>>=1; DQ = 1; // 給脈沖信號(hào) if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } void WriteOneChar(unsigned char dat) //寫一個(gè)字節(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); // 跳過讀序號(hào)列號(hào)的操作 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換 delay_18B20(100); Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 a=ReadOneChar(); b=ReadOneChar(); //傳感器返回值除16得實(shí)際溫度值 //為了得到2位小數(shù)位,先乘100,再除16,考慮整型數(shù)據(jù)長(zhǎng)度, //技巧處理后先乘25,再除4,除4用右移實(shí)現(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]); //顯示年個(gè)位 } else { lcddata(' '); //顯示空白實(shí)現(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]); //顯示 月個(gè)位 } else { lcddata(' '); //顯示空白實(shí)現(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]); //顯示 日個(gè)位 } else { lcddata(' '); //顯示空白實(shí)現(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); //讀小時(shí) hour=((value&0x70)>>4)*10 + (value&0x0F); //轉(zhuǎn)換小時(shí) lcdcom(0xc0); if(s4==0) { lcddata(tab[hour/10]); //顯示小時(shí)十位 lcddata(tab[hour%10]); //顯示小時(shí)個(gè)位 } else { lcddata(' '); //顯示空白實(shí)現(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]); //顯示分鐘個(gè)位 } else { lcddata(' '); //顯示空白實(shí)現(xiàn)閃爍 lcddata(' '); } lcddata(':'); //顯示 : value = readset(0x81); //讀取秒 second=((value&0x70)>>4)*10 + (value&0x0F); //轉(zhuǎn)換秒 lcddata(tab[second/10]); //顯示秒十位 lcddata(tab[second%10]); //顯示秒個(gè)位 tmp=ReadTemperature(); //讀取溫度 lcdcom(0xca); //寫入要現(xiàn)實(shí)的地址 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(' '); //顯示空白實(shí)現(xiàn)閃爍 lcddata(' '); } lcddata(':'); if(s7==0) { lcddata(tab[fen/10]); lcddata(tab[fen%10]); } else { lcddata(' '); //顯示空白實(shí)現(xiàn)閃爍 lcddata(' '); } } } void anjian() //按鍵檢測(cè)程序 { if(moshi==0) //如果模式鍵按下 { delay(100); //延時(shí)消抖 key++; //再次按下加一,切換下一位 if(key>7) { key=0; //按夠一圈返回 xianshiclock=0; //顯示時(shí)鐘 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; //小時(shí)加一 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; //鬧鐘小時(shí)加一 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; //小時(shí)減一 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; //鬧鐘小時(shí)減一 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)在時(shí)間和鬧鐘時(shí)間是否一致 { kai=0; while(kai==0) { spert(); //發(fā)聲 } delay(100); //延時(shí)消抖 while(nz==0) xianshi(); //松手檢測(cè) delay(100); //延時(shí)消抖 kai=0; //關(guān)閉鬧鐘等待下次觸發(fā) } } } void main() { lcdinit(); //LCD1602初始化 TMOD=0X01; //配置定時(shí)器模式 ET0=1; //開啟定時(shí)器1 EA=1; //開啟總中斷 TR0=1; //開始計(jì)時(shí) beep=0; //關(guān)閉蜂鳴器 if(jia==0) initDS1302();//DS1302初始化 while(1) { xianshi(); //顯示 anjian(); //檢測(cè)按鍵 naozhong(); //檢測(cè)鬧鐘 } } void timer0() interrupt 1 //定時(shí)器0 中斷函數(shù) { TH0=0; TL0=0; num++; if(num==8) //閃爍時(shí)間 { num=0; switch(key) //根據(jù)KEY的值來選擇哪一位閃爍(調(diào)節(jié)時(shí)候) { 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ā)表 | |
|---|---|---|---|---|
|
[考研] 一志愿武理材料305分求調(diào)劑 +3 | 想上岸的鯉魚 2026-03-18 | 4/200 |
|
|---|---|---|---|---|
|
[考研] 312求調(diào)劑 +8 | 陌宸希 2026-03-16 | 9/450 |
|
|
[考研] 288求調(diào)劑,一志愿華南理工大學(xué)071005 +4 | ioodiiij 2026-03-17 | 4/200 |
|
|
[考研] 0703化學(xué)調(diào)劑 +4 | pupcoco 2026-03-17 | 7/350 |
|
|
[考博] 環(huán)境領(lǐng)域全國(guó)重點(diǎn)實(shí)驗(yàn)室招收博士1-2名 +3 | QGZDSYS 2026-03-13 | 5/250 |
|
|
[考研] 考研求調(diào)劑 +3 | 橘頌. 2026-03-17 | 4/200 |
|
|
[考研] 296求調(diào)劑 +5 | 大口吃飯 身體健 2026-03-13 | 5/250 |
|
|
[考研] 275求調(diào)劑 +4 | 太陽(yáng)花天天開心 2026-03-16 | 4/200 |
|
|
[考研] 302求調(diào)劑 +4 | 小賈同學(xué)123 2026-03-15 | 8/400 |
|
|
[考研] 一志愿,福州大學(xué)材料專碩339分求調(diào)劑 +3 | 木子momo青爭(zhēng) 2026-03-15 | 3/150 |
|
|
[考研] 070300化學(xué)學(xué)碩求調(diào)劑 +6 | 太想進(jìn)步了0608 2026-03-16 | 6/300 |
|
|
[考研] 070303 總分349求調(diào)劑 +3 | LJY9966 2026-03-15 | 5/250 |
|
|
[考研] 080500,材料學(xué)碩302分求調(diào)劑學(xué)校 +4 | 初識(shí)可樂 2026-03-14 | 5/250 |
|
|
[考研] 中科大材料與化工319求調(diào)劑 +3 | 孟鑫材料 2026-03-14 | 3/150 |
|
|
[考研] 中科大材料專碩319求調(diào)劑 +3 | 孟鑫材料 2026-03-13 | 3/150 |
|
|
[考研] 復(fù)試調(diào)劑 +4 | z1z2z3879 2026-03-14 | 5/250 |
|
|
[考研] 學(xué)碩285求調(diào)劑 +13 | Wisjxn 2026-03-12 | 46/2300 |
|
|
[考研] 材料與化工(0856)304求B區(qū)調(diào)劑 +6 | 邱gl 2026-03-12 | 7/350 |
|
|
[考研] 329求調(diào)劑 +3 | miaodesi 2026-03-12 | 4/200 |
|
|
[考研] 311求調(diào)劑 +3 | 冬十三 2026-03-13 | 3/150 |
|