熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
你話的D0-d7好像有問(wèn)題 |
你的中斷有問(wèn)題嗎 |
警告已經(jīng)告訴你了,是你的網(wǎng)絡(luò)D0到D7錯(cuò)誤,重畫(huà)一下 |
是否初始化光標(biāo)設(shè)置問(wèn)題。 下面是我常用的1602的初始化代碼 xie_zhiling(0x38); //顯示模式設(shè)置 dellay(10); xie_zhiling(0x38); //顯示模式設(shè)置 xie_zhiling(0x08); //關(guān)閉顯示 xie_zhiling(0x01); //顯示清屏 xie_zhiling(0x06); //顯示光標(biāo)移動(dòng)設(shè)置 xie_zhiling(0x0c); //顯示開(kāi)及光標(biāo)移動(dòng)設(shè)置 |
999333 發(fā)表于 2018-3-29 18:10 #include<reg51.h>//定義函數(shù) #include<intrins.h> typedef unsigned char uchar;//無(wú)符號(hào)8位整型變量 typedef unsigned int uint;//無(wú)符號(hào)16位整型變量 sbit RS=P2^7;//LCD1602數(shù)據(jù)/命令選擇端(H/L) sbit RW=P2^6;//LCD1602讀/寫(xiě)選擇端(H/L) sbit E=P2^5;//LCD1602使能信號(hào)端 sbit DATA=P3^6; sbit SCK=P3^7; sbit k1=P3^2;//總設(shè)置按鍵 sbit k2=P3^3;//設(shè)置按鍵 sbit k3=P3^4;//+按鍵 sbit k4=P3^5;//-按鍵 sbit beep=P2^0; sbit D1=P1^0;//高溫報(bào)警指示燈 sbit D2=P1^1;//低溫報(bào)警指示燈 sbit D3=P1^2;//高濕度報(bào)警指示燈 sbit D4=P1^3;//低濕度報(bào)警指示燈 sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit IO=P1^5; sbit SCLK=P1^6; sbit RST=P1^7; uchar idata wendu[6]; uchar idata shidu[6]; uchar code table1[]=" 2013-08-30 "; uchar code table2[]=" QQ:383459194 "; uchar code table3[]=" gaowenbaojing "; uchar code table4[]=" diwenbaojing "; uchar code table5[]="gaoshidubaojing "; uchar code table6[]=" dishidubaojing "; uchar code table7[]="gaowen+gaoshidu "; uchar code table8[]=" gaowen+dishidu "; uchar code table9[]=" diwen+gaoshidu "; uchar code table10[]=" diwen+dishidu "; uchar code table11[]=" this is ok "; uchar code table12[]=" "; uchar code table13[]=" : : "; enum {TEMP,HUMI}; typedef union //定義共用同類型 { uint i; float f; } value; uchar a,b,c,d,num,flag=0,m=0,num1=0; char miao,shi,fen; uchar ccc,ri,yue,nian,zhou,flag1; //延時(shí)子函數(shù) void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } //按鍵提示音子函數(shù) void di() { beep=0; delay(100); beep=1; } //往DS1302時(shí)鐘芯片寫(xiě)入一字節(jié)子函數(shù) void inputbyte(uchar add) { uchar i; ACC=add; for(i=8;i>0;i--) { IO=ACC0; SCLK=1; SCLK=0; ACC=ACC>>1; } } //DS1302時(shí)鐘芯片輸出一字節(jié)子函數(shù) uchar outputbyte() { uchar i; for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=IO; SCLK=1; SCLK=0; } return ACC; } //往DS1302時(shí)鐘芯片寫(xiě)入數(shù)據(jù)子函數(shù) void write_ds(uchar add,uchar ucda) { RST=0; SCLK=0; RST=1; inputbyte(add); inputbyte(ucda); SCLK=1; RST=0; } //從DS1302時(shí)鐘芯片讀出數(shù)據(jù)子函數(shù) uchar read_ds(uchar add) { uchar ucda; RST=0; SCLK=0; RST=1; inputbyte(add); ucda=outputbyte(); SCLK=1; RST=0; return(ucda); } //設(shè)置DS1302時(shí)鐘芯片子函數(shù) void write_setds(uchar addr,uchar date) { write_ds(0x8e,0x00); write_ds(addr,date); write_ds(0x8e,0x80); } //檢查L(zhǎng)CD1602液晶忙位子函數(shù) void LCD1602_busy() { uchar i=0; RS=0; RW=1; E=1; P0=0xff; i=0; while(((P0&0x80)==0x80)&&i<150) i++; E=0; } //LCD1602液晶寫(xiě)指令子函數(shù) void write_com(uchar com) { LCD1602_busy(); RS=0; RW=0; P0=com; E=1; E=0; } //LCD1602液晶寫(xiě)數(shù)據(jù)子函數(shù) void write_date(uchar date) { LCD1602_busy(); RS=1; RW=0; P0=date; E=1; E=0; } //LCD1602液晶初始化子函數(shù) void LCD1602_init() //初始化設(shè)置 { //uchar i; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); /*write_com(0x80); for(i=0;i<16;i++) { write_date(table1); delay(500); } write_com(0xc0); for(i=0;i<16;i++) { write_date(table2); delay(500); }*/ a=35; b=10; c=65; d=40; } //SHT10寫(xiě)字節(jié)子函數(shù) char s_write_byte(uchar value) { uchar i,error=0; for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移 { if(i&value) DATA=1;//和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位 else DATA=0; SCK=1; _nop_(); _nop_(); _nop_();//延時(shí)3us SCK=0; } DATA=1; //釋放數(shù)據(jù)線 SCK=1; error=DATA; //檢查應(yīng)答信號(hào),確認(rèn)通訊正常 _nop_(); _nop_(); _nop_(); SCK=0; DATA=1; return error; //error=1 通訊錯(cuò)誤 } //SHT10讀字節(jié)子函數(shù) char s_read_byte(uchar ack) { uchar i,val=0; DATA=1; //釋放數(shù)據(jù)線 for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移 { SCK=1; if(DATA) val=(val|i); //讀一位數(shù)據(jù)線的值 SCK=0; } DATA=!ack; //如果是校驗(yàn),讀取完后結(jié)束通訊; SCK=1; _nop_(); _nop_(); _nop_();//延時(shí)3us SCK=0; _nop_(); _nop_(); _nop_(); DATA=1; //釋放數(shù)據(jù)線 return val; } //SHT10啟動(dòng)傳輸子函數(shù) void s_transstart() { DATA=1; SCK=0; //準(zhǔn)備 _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; } //SHT10連接復(fù)位子函數(shù) void s_connectionreset() { uchar i; DATA=1; SCK=0;//準(zhǔn)備 for(i=0;i<9;i++) //DATA保持高,SCK時(shí)鐘觸發(fā)9次,發(fā)送啟動(dòng)傳輸,通迅即復(fù)位 { SCK=1; SCK=0; } s_transstart(); //啟動(dòng)傳輸 } //SHT10溫濕度檢測(cè)子函數(shù) char s_measure(uchar *p_value,uchar *p_checksum,uchar mode) { unsigned error=0; uint i; s_transstart(); //啟動(dòng)傳輸 switch(mode) //選擇發(fā)送命令 { case TEMP: error+=s_write_byte(0x03); break; //測(cè)量溫度 case HUMI: error+=s_write_byte(0x05); break; //測(cè)量濕度 default: break; } for(i=0;i<65535;i++) if(DATA==0) break; //等待測(cè)量結(jié)束 if(DATA) error+=1; // 如果長(zhǎng)時(shí)間數(shù)據(jù)線沒(méi)有拉低,說(shuō)明測(cè)量錯(cuò)誤 *(p_value)=s_read_byte(1); //讀第一個(gè)字節(jié),高字節(jié) (MSB) *(p_value+1)=s_read_byte(1); //讀第二個(gè)字節(jié),低字節(jié) (LSB) *p_checksum=s_read_byte(0); //read CRC校驗(yàn)碼 return error; // error=1 通訊錯(cuò)誤 } //SHT10溫濕度值標(biāo)度變換及溫度補(bǔ)償子函數(shù) void calc_sth10(float *p_humidity ,float *p_temperature) { const float C1=-4.0; // 12位濕度精度 修正公式 const float C2=+0.0405; // 12位濕度精度 修正公式 const float C3=-0.0000028; // 12位濕度精度 修正公式 const float T1=+0.01; // 14位溫度精度 5V條件 修正公式 const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式 float rh=*p_humidity; // rh: 12位 濕度 float t=*p_temperature; // t: 14位 溫度 float rh_lin; // rh_lin: 濕度 linear值 float rh_true; // rh_true: 濕度 ture值 float t_C; // t_C : 溫度 ℃ t_C=t*0.01-40; //補(bǔ)償溫度 rh_lin=C3*rh*rh+C2*rh+C1; //相對(duì)濕度非線性補(bǔ)償 rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對(duì)濕度對(duì)于溫度依賴性補(bǔ)償 if(rh_true>100) rh_true=100; //濕度最大修正 if(rh_true<0.1) rh_true=0.1; //濕度最小修正 *p_temperature=t_C; //返回溫度結(jié)果 *p_humidity=rh_true; //返回濕度結(jié)果 } //往LCD1602液晶寫(xiě)入日期子函數(shù) void write_nyr(uchar add,uchar date) { uchar shi,ge ; shi=date/10; ge=date%10; write_com(0x80+0x01+add); write_date(0x30+shi); write_date(0x30+ge); } //往LCD1602液晶寫(xiě)入時(shí)間子函數(shù) void write_sfm1(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x42+add); write_date(0x30+shi); write_date(0x30+ge); } //電子萬(wàn)年歷顯示子函數(shù) void display1() { if(flag1!=1) { uchar d; d=read_ds(0x81); miao=(d/16)*10+(d%16); write_sfm1(8,miao); d=read_ds(0x83); fen=(d/16)*10+(d%16); write_sfm1(5,fen); d=read_ds(0x85); shi=(d/16)*10+(d%16); write_sfm1(2,shi); d=read_ds(0x87); ri=(d/16)*10+(d%16); write_nyr(8,ri); d=read_ds(0x89); yue=(d/16)*10+(d%16); write_nyr(5,yue); d=read_ds(0x8b); zhou=d%16; write_nyr(12,zhou); d=read_ds(0x8d); nian=(d/16)*10+(d%16); write_nyr(2,nian); } } //溫濕度顯示子函數(shù) void display() { write_com(0x80+1); write_date('T'); write_com(0x80+2); write_date('='); write_com(0x80+3); write_date(wendu[0]); write_com(0x80+4); write_date(wendu[1]); write_com(0x80+5); write_date(wendu[2]); write_com(0x80+6); write_date(wendu[3]); write_com(0x80+7); write_date(wendu[4]); write_com(0x80+8); write_date(' '); write_com(0x80+9); write_date('R'); write_com(0x80+10); write_date('='); write_com(0x80+11); write_date(shidu[0]); write_com(0x80+12); write_date(shidu[1]); write_com(0x80+13); write_date(shidu[2]); write_com(0x80+14); write_date(shidu[3]); write_com(0x80+15); write_date(shidu[4]); } //LCD1602液晶寫(xiě)參數(shù)子函數(shù) void write_sfm(uchar aaa,uchar bbb) { uchar shi,ge; shi=bbb/10; ge=bbb%10; write_com(0x80+0x40+aaa); write_date(0x30+shi); write_date(0x30+ge); } //按鍵掃描子函數(shù) void keyscan() { uchar i=100,e; if(k1==0&&num==0&&num1==0) { delay(10); if(k1==0&&num==0&&num1==0) { while(k1==0&&num1==0&&num==0&&i) { i--; delay(10); } di(); flag++; if(flag==1) { write_com(0x01); delay(5); write_com(0x80+1); write_date('2'); write_com(0x80+2); write_date('0'); write_com(0x80+5); write_date('-'); write_com(0x80+8); write_date('-'); write_com(0xc0+6); write_date(':'); write_com(0xc0+9); write_date(':'); } if(flag>=2) { write_com(0x01); delay(5); flag=0; } } } if(k2==0&&flag==0&&num1==0) { delay(10); if(k2==0&&flag==0&&num1==0) { while(k2==0&&num1==0&&flag==0&&i) { i--; delay(10); } di(); num++; if(num==1) { write_com(0xc0); for(e=0;e<16;e++) write_date(table12[e]); write_com(0xc0+4); write_date('T'); write_com(0xc0+5); write_date('H'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(a/10+0x30); write_com(0xc0+8); write_date(a%10+0x30); write_com(0xc0+9); write_date(0xdf); write_com(0xc0+10); write_date(0x43); } if(num==2) { write_com(0xc0+4); write_date('T'); write_com(0xc0+5); write_date('L'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(b/10+0x30); write_com(0xc0+8); write_date(b%10+0x30); write_com(0xc0+9); write_date(0xdf); write_com(0xc0+10); write_date(0x43); } if(num==3) { write_com(0xc0); for(e=0;e<16;e++) write_date(table12[e]); write_com(0xc0+4); write_date('R'); write_com(0xc0+5); write_date('H'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(c/10+0x30); write_com(0xc0+8); write_date(c%10+0x30); write_com(0xc0+9); write_date('%'); } if(num==4) { write_com(0xc0+4); write_date('R'); write_com(0xc0+5); write_date('L'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(d/10+0x30); write_com(0xc0+8); write_date(d%10+0x30); write_com(0xc0+9); write_date('%'); } if(num>=5) { num=0; } } } if(num!=0&&flag==0&&num1==0) { if(k3==0) { delay(10); if(k3==0) { while(k3==0&&i) { i--; delay(10); } di(); if(num==1) { a++; if(a==50) a=35; write_sfm(7,a); write_com(0xc0+8); } if(num==2) { b++; if(b==30) b=10; write_sfm(7,b); write_com(0xc0+8); } if(num==3) { c++; if(c==95) c=65; write_sfm(7,c); write_com(0xc0+8); } if(num==4) { d++; if(d==60) d=40; write_sfm(7,d); write_com(0xc0+8); } } } if(k4==0) { delay(10); if(k4==0) { while(k4==0&&i) { i--; delay(10); } di(); if(num==1) { a--; if(a==15) a=35; write_sfm(7,a); write_com(0xc0+8); } if(num==2) { b--; if(b==0) b=10; write_sfm(7,b); write_com(0xc0+8); } if(num==3) { c--; if(c==40) c=65; write_sfm(7,c); write_com(0xc0+8); } if(num==4) { d--; if(d==0) d=40; write_sfm(7,d); write_com(0xc0+8); } } } } if(k2==0&&flag==1&&num==0) { delay(10); if(k2==0&&flag==1&&num==0) { while(k2==0&&flag==1&&num==0&&i) { i--; delay(10); } di(); num1++; if(num1==1) { flag1=1; write_ds(0x8e,0x80); write_com(0x80+0x40+10); write_com(0x0f); write_ds(0x8e,0x00); ccc=read_ds(0x81); miao=(ccc/16)*10+ccc%16; ccc=read_ds(0x83); fen=(ccc/16)*10+ccc%16; ccc=read_ds(0x85); shi=(ccc/16)*10+ccc%16; ccc=read_ds(0x87); ri=(ccc/16)*10+ccc%16; ccc=read_ds(0x89); yue=(ccc/16)*10+ccc%16; ccc=read_ds(0x8b); zhou=(ccc/16)*10+ccc%16; ccc=read_ds(0x8d); nian=(ccc/16)*10+ccc%16; } if(num1==2) write_com(0x80+0x40+7); if(num1==3) write_com(0x80+0x40+4); if(num1==4) write_com(0x80+0x0d); if(num1==5) write_com(0x80+0x09); if(num1==6) write_com(0x80+6); if(num1==7) write_com(0x80+3); if(num1==8) { num1=0; write_com(0x0c); write_ds(0x8e,0x80); flag1=0; } } } if(num1!=0&&flag==1&&num==0)//判斷num值 { if(k3==0&&flag==1&&num==0)//判斷k2按鍵是否按下 { delay(10);//延時(shí)5毫秒 if(k3==0&&flag==1&&num==0)//再次判斷k2按鍵是否按下 { while(k3==0&&flag==1&&num==0&&i)//判斷按鍵松手檢測(cè) { i--; delay(10); } di();//調(diào)用蜂鳴器子函數(shù) if(num1==1) { miao++; if(miao==61) miao=1 ; write_sfm1(8,miao); write_com(0x80+0x4a); } if(num1==2) { fen++; if(fen==60) fen=0; write_sfm1(5,fen); write_com(0x80+0x48); } if(num1==3) { shi++; if(shi==24) shi=0; write_sfm1(2,shi); write_com(0x80+0x40+5); } if(num1==4) { zhou++; if(zhou==8) zhou=1; write_nyr(12,zhou); write_com(0x80+0x0d); } if(num1==5) { ri++; if(ri==32) ri=1; write_nyr(8,ri); write_com(0x80+0x0a); } if(num1==6) { yue++; if(yue==13) yue=1; write_nyr(5,yue); write_com(0x80+7); } if(num1==7) { nian++; write_nyr(2,nian); write_com(0x80+4); } } } if(k4==0&&flag==1&&num==0)//判斷k3按鍵是否按下 { delay(10);//延時(shí)10毫秒 if(k4==0&&flag==1&&num==0)//再次判斷k3按鍵是否按下 { while(k4==0&&flag==1&&num==0&&i)//判斷按鍵松手檢測(cè) { i--; delay(10); } di();//調(diào)用蜂鳴器子函數(shù) if(num1==1) { miao--; if(miao==-1) miao=59; write_sfm1(8,miao); write_com(0x80+0x4a); } if(num1==2) { fen--; if(fen==-1) fen=59; write_sfm1(5,fen); write_com(0x80+0x48); } if(num1==3) { shi--; if(shi==-1) shi=23; write_sfm1(2,shi); write_com(0x80+0x45); } if(num1==4) { zhou--; if(zhou==0) zhou=7; write_nyr(12,zhou); write_com(0x80+0x0d); } if(num1==5) { ri--; if(ri==-1) ri=1; write_nyr(8,ri); write_com(0x80+0x0a); } if(num1==6) { yue--; if(yue==0) yue=12; write_nyr(5,yue); write_com(0x87); } if(num1==7) { nian--; write_nyr(2,nian); write_com(0x84); } } } write_ds(0x80,(miao/10)*16+miao%10); write_ds(0x82,(fen/10)*16+fen%10); write_ds(0x84,(shi/10)*16+shi%10); write_ds(0x86,(ri/10)*16+ri%10); write_ds(0x88,(yue/10)*16+yue%10); write_ds(0x8a,(zhou/10)*16+zhou%10); write_ds(0x8c,(nian/10)*16+nian%10); } } //主函數(shù) void main() { uint temp,humi,i; uint aa,bb,cc,dd; value humi_val,temp_val; //定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度 uchar error; //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤 uchar checksum; LCD1602_init();//調(diào)用LCD1602液晶初始化子函數(shù) //delay(5000);//延時(shí) //write_com(0x01); write_setds(0x80,0x50); write_setds(0x82,0x59); write_setds(0x84,0x10); write_setds(0x86,0x17); write_setds(0x88,0x03); write_setds(0x8a,0x03); write_setds(0x8c,0x10); write_setds(0x90,0xa4); s_connectionreset(); while(1)//大循環(huán) { keyscan(); if(flag==1) { display1(); } if(flag==0&&num==0&&error==0&&num1==0) { aa=a*10; bb=b*10; cc=c*10; dd=d*10; if(temp>aa&&temp>bb&&humi<cc&&humi>dd) { D1=0; D2=1; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table3); } } if(temp<aa&&temp<bb&&humi<cc&&humi>dd) { D1=1; D2=0; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table4); } } if(temp<aa&&temp>bb&&humi>cc&&humi>dd) { D1=1; D2=1; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table5); } } if(temp<aa&&temp>bb&&humi<cc&&humi<dd) { D1=1; D2=1; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table6); } } if(temp>aa&&temp>bb&&humi>cc&&humi>dd) { D1=0; D2=1; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table7); } } if(temp>aa&&temp>bb&&humi<cc&&humi<dd) { D1=0; D2=1; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table8); } } if(temp<aa&&temp<bb&&humi>cc&&humi>dd) { D1=1; D2=0; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table9); } } if(temp<aa&&temp<bb&&humi<cc&&humi<dd) { D1=0; D2=0; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table10); } } if(temp<aa&&temp>bb&&humi<cc&&humi>dd) { D1=1; D2=1; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table11); } } } if(flag==0) { error=0; //初始化error=0,即沒(méi)有錯(cuò)誤 error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //溫度測(cè)量 error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //濕度測(cè)量 if(error!=0) s_connectionreset();//如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位 else { humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù) temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù) calc_sth10(&humi_val.f,&temp_val.f); //修正相對(duì)濕度及溫度 temp=temp_val.f*10; humi=humi_val.f*10; wendu[0]=temp/1000+'0'; //溫度百位 wendu[1]=temp%1000/100+'0'; //溫度十位 wendu[2]=temp%100/10+'0'; //溫度個(gè)位 wendu[3]=0x2E; //小數(shù)點(diǎn) wendu[4]=temp%10+'0'; //溫度小數(shù)點(diǎn)后第一位 shidu[0]=humi/1000+'0'; //濕度百位 shidu[1]=humi%1000/100+'0'; //濕度十位 shidu[2]=humi%100/10+'0'; //濕度個(gè)位 shidu[3]=0x2E; //小數(shù)點(diǎn) shidu[4]=humi%10+'0'; //濕度小數(shù)點(diǎn)后第一位 display(); } delay(800); } } } |
|
#include<reg51.h>//定義函數(shù) #include<intrins.h> typedef unsigned char uchar;//無(wú)符號(hào)8位整型變量 typedef unsigned int uint;//無(wú)符號(hào)16位整型變量 sbit RS=P2^7;//LCD1602數(shù)據(jù)/命令選擇端(H/L) sbit RW=P2^6;//LCD1602讀/寫(xiě)選擇端(H/L) sbit E=P2^5;//LCD1602使能信號(hào)端 sbit DATA=P3^6; sbit SCK=P3^7; sbit k1=P3^2;//總設(shè)置按鍵 sbit k2=P3^3;//設(shè)置按鍵 sbit k3=P3^4;//+按鍵 sbit k4=P3^5;//-按鍵 sbit beep=P2^0; sbit D1=P1^0;//高溫報(bào)警指示燈 sbit D2=P1^1;//低溫報(bào)警指示燈 sbit D3=P1^2;//高濕度報(bào)警指示燈 sbit D4=P1^3;//低濕度報(bào)警指示燈 sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit IO=P1^5; sbit SCLK=P1^6; sbit RST=P1^7; uchar idata wendu[6]; uchar idata shidu[6]; uchar code table1[]=" 2013-08-30 "; uchar code table2[]=" QQ:383459194 "; uchar code table3[]=" gaowenbaojing "; uchar code table4[]=" diwenbaojing "; uchar code table5[]="gaoshidubaojing "; uchar code table6[]=" dishidubaojing "; uchar code table7[]="gaowen+gaoshidu "; uchar code table8[]=" gaowen+dishidu "; uchar code table9[]=" diwen+gaoshidu "; uchar code table10[]=" diwen+dishidu "; uchar code table11[]=" this is ok "; uchar code table12[]=" "; uchar code table13[]=" : : "; enum {TEMP,HUMI}; typedef union //定義共用同類型 { uint i; float f; } value; uchar a,b,c,d,num,flag=0,m=0,num1=0; char miao,shi,fen; uchar ccc,ri,yue,nian,zhou,flag1; //延時(shí)子函數(shù) void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } //按鍵提示音子函數(shù) void di() { beep=0; delay(100); beep=1; } //往DS1302時(shí)鐘芯片寫(xiě)入一字節(jié)子函數(shù) void inputbyte(uchar add) { uchar i; ACC=add; for(i=8;i>0;i--) { IO=ACC0; SCLK=1; SCLK=0; ACC=ACC>>1; } } //DS1302時(shí)鐘芯片輸出一字節(jié)子函數(shù) uchar outputbyte() { uchar i; for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=IO; SCLK=1; SCLK=0; } return ACC; } //往DS1302時(shí)鐘芯片寫(xiě)入數(shù)據(jù)子函數(shù) void write_ds(uchar add,uchar ucda) { RST=0; SCLK=0; RST=1; inputbyte(add); inputbyte(ucda); SCLK=1; RST=0; } //從DS1302時(shí)鐘芯片讀出數(shù)據(jù)子函數(shù) uchar read_ds(uchar add) { uchar ucda; RST=0; SCLK=0; RST=1; inputbyte(add); ucda=outputbyte(); SCLK=1; RST=0; return(ucda); } //設(shè)置DS1302時(shí)鐘芯片子函數(shù) void write_setds(uchar addr,uchar date) { write_ds(0x8e,0x00); write_ds(addr,date); write_ds(0x8e,0x80); } //檢查L(zhǎng)CD1602液晶忙位子函數(shù) void LCD1602_busy() { uchar i=0; RS=0; RW=1; E=1; P0=0xff; i=0; while(((P0&0x80)==0x80)&&i<150) i++; E=0; } //LCD1602液晶寫(xiě)指令子函數(shù) void write_com(uchar com) { LCD1602_busy(); RS=0; RW=0; P0=com; E=1; E=0; } //LCD1602液晶寫(xiě)數(shù)據(jù)子函數(shù) void write_date(uchar date) { LCD1602_busy(); RS=1; RW=0; P0=date; E=1; E=0; } //LCD1602液晶初始化子函數(shù) void LCD1602_init() //初始化設(shè)置 { //uchar i; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); /*write_com(0x80); for(i=0;i<16;i++) { write_date(table1[i]); delay(500); } write_com(0xc0); for(i=0;i<16;i++) { write_date(table2[i]); delay(500); }*/ a=35; b=10; c=65; d=40; } //SHT10寫(xiě)字節(jié)子函數(shù) char s_write_byte(uchar value) { uchar i,error=0; for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移 { if(i&value) DATA=1;//和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位 else DATA=0; SCK=1; _nop_(); _nop_(); _nop_();//延時(shí)3us SCK=0; } DATA=1; //釋放數(shù)據(jù)線 SCK=1; error=DATA; //檢查應(yīng)答信號(hào),確認(rèn)通訊正常 _nop_(); _nop_(); _nop_(); SCK=0; DATA=1; return error; //error=1 通訊錯(cuò)誤 } //SHT10讀字節(jié)子函數(shù) char s_read_byte(uchar ack) { uchar i,val=0; DATA=1; //釋放數(shù)據(jù)線 for(i=0x80;i>0;i>>=1) //高位為1,循環(huán)右移 { SCK=1; if(DATA) val=(val|i); //讀一位數(shù)據(jù)線的值 SCK=0; } DATA=!ack; //如果是校驗(yàn),讀取完后結(jié)束通訊; SCK=1; _nop_(); _nop_(); _nop_();//延時(shí)3us SCK=0; _nop_(); _nop_(); _nop_(); DATA=1; //釋放數(shù)據(jù)線 return val; } //SHT10啟動(dòng)傳輸子函數(shù) void s_transstart() { DATA=1; SCK=0; //準(zhǔn)備 _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; } //SHT10連接復(fù)位子函數(shù) void s_connectionreset() { uchar i; DATA=1; SCK=0;//準(zhǔn)備 for(i=0;i<9;i++) //DATA保持高,SCK時(shí)鐘觸發(fā)9次,發(fā)送啟動(dòng)傳輸,通迅即復(fù)位 { SCK=1; SCK=0; } s_transstart(); //啟動(dòng)傳輸 } //SHT10溫濕度檢測(cè)子函數(shù) char s_measure(uchar *p_value,uchar *p_checksum,uchar mode) { unsigned error=0; uint i; s_transstart(); //啟動(dòng)傳輸 switch(mode) //選擇發(fā)送命令 { case TEMP: error+=s_write_byte(0x03); break; //測(cè)量溫度 case HUMI: error+=s_write_byte(0x05); break; //測(cè)量濕度 default: break; } for(i=0;i<65535;i++) if(DATA==0) break; //等待測(cè)量結(jié)束 if(DATA) error+=1; // 如果長(zhǎng)時(shí)間數(shù)據(jù)線沒(méi)有拉低,說(shuō)明測(cè)量錯(cuò)誤 *(p_value)=s_read_byte(1); //讀第一個(gè)字節(jié),高字節(jié) (MSB) *(p_value+1)=s_read_byte(1); //讀第二個(gè)字節(jié),低字節(jié) (LSB) *p_checksum=s_read_byte(0); //read CRC校驗(yàn)碼 return error; // error=1 通訊錯(cuò)誤 } //SHT10溫濕度值標(biāo)度變換及溫度補(bǔ)償子函數(shù) void calc_sth10(float *p_humidity ,float *p_temperature) { const float C1=-4.0; // 12位濕度精度 修正公式 const float C2=+0.0405; // 12位濕度精度 修正公式 const float C3=-0.0000028; // 12位濕度精度 修正公式 const float T1=+0.01; // 14位溫度精度 5V條件 修正公式 const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式 float rh=*p_humidity; // rh: 12位 濕度 float t=*p_temperature; // t: 14位 溫度 float rh_lin; // rh_lin: 濕度 linear值 float rh_true; // rh_true: 濕度 ture值 float t_C; // t_C : 溫度 ℃ t_C=t*0.01-40; //補(bǔ)償溫度 rh_lin=C3*rh*rh+C2*rh+C1; //相對(duì)濕度非線性補(bǔ)償 rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對(duì)濕度對(duì)于溫度依賴性補(bǔ)償 if(rh_true>100) rh_true=100; //濕度最大修正 if(rh_true<0.1) rh_true=0.1; //濕度最小修正 *p_temperature=t_C; //返回溫度結(jié)果 *p_humidity=rh_true; //返回濕度結(jié)果 } //往LCD1602液晶寫(xiě)入日期子函數(shù) void write_nyr(uchar add,uchar date) { uchar shi,ge ; shi=date/10; ge=date%10; write_com(0x80+0x01+add); write_date(0x30+shi); write_date(0x30+ge); } //往LCD1602液晶寫(xiě)入時(shí)間子函數(shù) void write_sfm1(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x42+add); write_date(0x30+shi); write_date(0x30+ge); } //電子萬(wàn)年歷顯示子函數(shù) void display1() { if(flag1!=1) { uchar d; d=read_ds(0x81); miao=(d/16)*10+(d%16); write_sfm1(8,miao); d=read_ds(0x83); fen=(d/16)*10+(d%16); write_sfm1(5,fen); d=read_ds(0x85); shi=(d/16)*10+(d%16); write_sfm1(2,shi); d=read_ds(0x87); ri=(d/16)*10+(d%16); write_nyr(8,ri); d=read_ds(0x89); yue=(d/16)*10+(d%16); write_nyr(5,yue); d=read_ds(0x8b); zhou=d%16; write_nyr(12,zhou); d=read_ds(0x8d); nian=(d/16)*10+(d%16); write_nyr(2,nian); } } //溫濕度顯示子函數(shù) void display() { write_com(0x80+1); write_date('T'); write_com(0x80+2); write_date('='); write_com(0x80+3); write_date(wendu[0]); write_com(0x80+4); write_date(wendu[1]); write_com(0x80+5); write_date(wendu[2]); write_com(0x80+6); write_date(wendu[3]); write_com(0x80+7); write_date(wendu[4]); write_com(0x80+8); write_date(' '); write_com(0x80+9); write_date('R'); write_com(0x80+10); write_date('='); write_com(0x80+11); write_date(shidu[0]); write_com(0x80+12); write_date(shidu[1]); write_com(0x80+13); write_date(shidu[2]); write_com(0x80+14); write_date(shidu[3]); write_com(0x80+15); write_date(shidu[4]); } //LCD1602液晶寫(xiě)參數(shù)子函數(shù) void write_sfm(uchar aaa,uchar bbb) { uchar shi,ge; shi=bbb/10; ge=bbb%10; write_com(0x80+0x40+aaa); write_date(0x30+shi); write_date(0x30+ge); } //按鍵掃描子函數(shù) void keyscan() { uchar i=100,e; if(k1==0&&num==0&&num1==0) { delay(10); if(k1==0&&num==0&&num1==0) { while(k1==0&&num1==0&&num==0&&i) { i--; delay(10); } di(); flag++; if(flag==1) { write_com(0x01); delay(5); write_com(0x80+1); write_date('2'); write_com(0x80+2); write_date('0'); write_com(0x80+5); write_date('-'); write_com(0x80+8); write_date('-'); write_com(0xc0+6); write_date(':'); write_com(0xc0+9); write_date(':'); } if(flag>=2) { write_com(0x01); delay(5); flag=0; } } } if(k2==0&&flag==0&&num1==0) { delay(10); if(k2==0&&flag==0&&num1==0) { while(k2==0&&num1==0&&flag==0&&i) { i--; delay(10); } di(); num++; if(num==1) { write_com(0xc0); for(e=0;e<16;e++) write_date(table12[e]); write_com(0xc0+4); write_date('T'); write_com(0xc0+5); write_date('H'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(a/10+0x30); write_com(0xc0+8); write_date(a%10+0x30); write_com(0xc0+9); write_date(0xdf); write_com(0xc0+10); write_date(0x43); } if(num==2) { write_com(0xc0+4); write_date('T'); write_com(0xc0+5); write_date('L'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(b/10+0x30); write_com(0xc0+8); write_date(b%10+0x30); write_com(0xc0+9); write_date(0xdf); write_com(0xc0+10); write_date(0x43); } if(num==3) { write_com(0xc0); for(e=0;e<16;e++) write_date(table12[e]); write_com(0xc0+4); write_date('R'); write_com(0xc0+5); write_date('H'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(c/10+0x30); write_com(0xc0+8); write_date(c%10+0x30); write_com(0xc0+9); write_date('%'); } if(num==4) { write_com(0xc0+4); write_date('R'); write_com(0xc0+5); write_date('L'); write_com(0xc0+6); write_date('='); write_com(0xc0+7); write_date(d/10+0x30); write_com(0xc0+8); write_date(d%10+0x30); write_com(0xc0+9); write_date('%'); } if(num>=5) { num=0; } } } if(num!=0&&flag==0&&num1==0) { if(k3==0) { delay(10); if(k3==0) { while(k3==0&&i) { i--; delay(10); } di(); if(num==1) { a++; if(a==50) a=35; write_sfm(7,a); write_com(0xc0+8); } if(num==2) { b++; if(b==30) b=10; write_sfm(7,b); write_com(0xc0+8); } if(num==3) { c++; if(c==95) c=65; write_sfm(7,c); write_com(0xc0+8); } if(num==4) { d++; if(d==60) d=40; write_sfm(7,d); write_com(0xc0+8); } } } if(k4==0) { delay(10); if(k4==0) { while(k4==0&&i) { i--; delay(10); } di(); if(num==1) { a--; if(a==15) a=35; write_sfm(7,a); write_com(0xc0+8); } if(num==2) { b--; if(b==0) b=10; write_sfm(7,b); write_com(0xc0+8); } if(num==3) { c--; if(c==40) c=65; write_sfm(7,c); write_com(0xc0+8); } if(num==4) { d--; if(d==0) d=40; write_sfm(7,d); write_com(0xc0+8); } } } } if(k2==0&&flag==1&&num==0) { delay(10); if(k2==0&&flag==1&&num==0) { while(k2==0&&flag==1&&num==0&&i) { i--; delay(10); } di(); num1++; if(num1==1) { flag1=1; write_ds(0x8e,0x80); write_com(0x80+0x40+10); write_com(0x0f); write_ds(0x8e,0x00); ccc=read_ds(0x81); miao=(ccc/16)*10+ccc%16; ccc=read_ds(0x83); fen=(ccc/16)*10+ccc%16; ccc=read_ds(0x85); shi=(ccc/16)*10+ccc%16; ccc=read_ds(0x87); ri=(ccc/16)*10+ccc%16; ccc=read_ds(0x89); yue=(ccc/16)*10+ccc%16; ccc=read_ds(0x8b); zhou=(ccc/16)*10+ccc%16; ccc=read_ds(0x8d); nian=(ccc/16)*10+ccc%16; } if(num1==2) write_com(0x80+0x40+7); if(num1==3) write_com(0x80+0x40+4); if(num1==4) write_com(0x80+0x0d); if(num1==5) write_com(0x80+0x09); if(num1==6) write_com(0x80+6); if(num1==7) write_com(0x80+3); if(num1==8) { num1=0; write_com(0x0c); write_ds(0x8e,0x80); flag1=0; } } } if(num1!=0&&flag==1&&num==0)//判斷num值 { if(k3==0&&flag==1&&num==0)//判斷k2按鍵是否按下 { delay(10);//延時(shí)5毫秒 if(k3==0&&flag==1&&num==0)//再次判斷k2按鍵是否按下 { while(k3==0&&flag==1&&num==0&&i)//判斷按鍵松手檢測(cè) { i--; delay(10); } di();//調(diào)用蜂鳴器子函數(shù) if(num1==1) { miao++; if(miao==61) miao=1 ; write_sfm1(8,miao); write_com(0x80+0x4a); } if(num1==2) { fen++; if(fen==60) fen=0; write_sfm1(5,fen); write_com(0x80+0x48); } if(num1==3) { shi++; if(shi==24) shi=0; write_sfm1(2,shi); write_com(0x80+0x40+5); } if(num1==4) { zhou++; if(zhou==8) zhou=1; write_nyr(12,zhou); write_com(0x80+0x0d); } if(num1==5) { ri++; if(ri==32) ri=1; write_nyr(8,ri); write_com(0x80+0x0a); } if(num1==6) { yue++; if(yue==13) yue=1; write_nyr(5,yue); write_com(0x80+7); } if(num1==7) { nian++; write_nyr(2,nian); write_com(0x80+4); } } } if(k4==0&&flag==1&&num==0)//判斷k3按鍵是否按下 { delay(10);//延時(shí)10毫秒 if(k4==0&&flag==1&&num==0)//再次判斷k3按鍵是否按下 { while(k4==0&&flag==1&&num==0&&i)//判斷按鍵松手檢測(cè) { i--; delay(10); } di();//調(diào)用蜂鳴器子函數(shù) if(num1==1) { miao--; if(miao==-1) miao=59; write_sfm1(8,miao); write_com(0x80+0x4a); } if(num1==2) { fen--; if(fen==-1) fen=59; write_sfm1(5,fen); write_com(0x80+0x48); } if(num1==3) { shi--; if(shi==-1) shi=23; write_sfm1(2,shi); write_com(0x80+0x45); } if(num1==4) { zhou--; if(zhou==0) zhou=7; write_nyr(12,zhou); write_com(0x80+0x0d); } if(num1==5) { ri--; if(ri==-1) ri=1; write_nyr(8,ri); write_com(0x80+0x0a); } if(num1==6) { yue--; if(yue==0) yue=12; write_nyr(5,yue); write_com(0x87); } if(num1==7) { nian--; write_nyr(2,nian); write_com(0x84); } } } write_ds(0x80,(miao/10)*16+miao%10); write_ds(0x82,(fen/10)*16+fen%10); write_ds(0x84,(shi/10)*16+shi%10); write_ds(0x86,(ri/10)*16+ri%10); write_ds(0x88,(yue/10)*16+yue%10); write_ds(0x8a,(zhou/10)*16+zhou%10); write_ds(0x8c,(nian/10)*16+nian%10); } } //主函數(shù) void main() { uint temp,humi,i; uint aa,bb,cc,dd; value humi_val,temp_val; //定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度 uchar error; //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤 uchar checksum; LCD1602_init();//調(diào)用LCD1602液晶初始化子函數(shù) //delay(5000);//延時(shí) //write_com(0x01); write_setds(0x80,0x50); write_setds(0x82,0x59); write_setds(0x84,0x10); write_setds(0x86,0x17); write_setds(0x88,0x03); write_setds(0x8a,0x03); write_setds(0x8c,0x10); write_setds(0x90,0xa4); s_connectionreset(); while(1)//大循環(huán) { keyscan(); if(flag==1) { display1(); } if(flag==0&&num==0&&error==0&&num1==0) { aa=a*10; bb=b*10; cc=c*10; dd=d*10; if(temp>aa&&temp>bb&&humi<cc&&humi>dd) { D1=0; D2=1; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table3[i]); } } if(temp<aa&&temp<bb&&humi<cc&&humi>dd) { D1=1; D2=0; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table4[i]); } } if(temp<aa&&temp>bb&&humi>cc&&humi>dd) { D1=1; D2=1; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table5[i]); } } if(temp<aa&&temp>bb&&humi<cc&&humi<dd) { D1=1; D2=1; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table6[i]); } } if(temp>aa&&temp>bb&&humi>cc&&humi>dd) { D1=0; D2=1; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table7[i]); } } if(temp>aa&&temp>bb&&humi<cc&&humi<dd) { D1=0; D2=1; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table8[i]); } } if(temp<aa&&temp<bb&&humi>cc&&humi>dd) { D1=1; D2=0; D3=0; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table9[i]); } } if(temp<aa&&temp<bb&&humi<cc&&humi<dd) { D1=0; D2=0; D3=1; D4=0; write_com(0xc0); for(i=0;i<16;i++) { write_date(table10[i]); } } if(temp<aa&&temp>bb&&humi<cc&&humi>dd) { D1=1; D2=1; D3=1; D4=1; write_com(0xc0); for(i=0;i<16;i++) { write_date(table11[i]); } } } if(flag==0) { error=0; //初始化error=0,即沒(méi)有錯(cuò)誤 error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //溫度測(cè)量 error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //濕度測(cè)量 if(error!=0) s_connectionreset();//如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位 else { humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù) temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù) calc_sth10(&humi_val.f,&temp_val.f); //修正相對(duì)濕度及溫度 temp=temp_val.f*10; humi=humi_val.f*10; wendu[0]=temp/1000+'0'; //溫度百位 wendu[1]=temp%1000/100+'0'; //溫度十位 wendu[2]=temp%100/10+'0'; //溫度個(gè)位 wendu[3]=0x2E; //小數(shù)點(diǎn) wendu[4]=temp%10+'0'; //溫度小數(shù)點(diǎn)后第一位 shidu[0]=humi/1000+'0'; //濕度百位 shidu[1]=humi%1000/100+'0'; //濕度十位 shidu[2]=humi%100/10+'0'; //濕度個(gè)位 shidu[3]=0x2E; //小數(shù)點(diǎn) shidu[4]=humi%10+'0'; //濕度小數(shù)點(diǎn)后第一位 display(); } delay(800); } } } |
應(yīng)該是時(shí)序沒(méi)設(shè)置好吧 |
上程序! |
硬件沒(méi)什么問(wèn)題,看看你的程序 |
Powered by 單片機(jī)教程網(wǎng)