|
程序格式不對(duì),我重發(fā)一遍,大家見(jiàn)諒,見(jiàn)怪不怪- #include <reg52.h> //51芯片管腳定義頭文件
- #define uchar unsigned char
- #define uint unsigned int
- uchar code zheng[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
- uchar code fan[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
- sbit key1 = P3^0; //正轉(zhuǎn)
- sbit key2 = P3^1; //反轉(zhuǎn)----按鍵分時(shí)復(fù)用
- sbit key3 = P3^2; //停止
- sbit key4 = P3^3; //時(shí)間調(diào)整按鈕
- sbit beep=P2^3; sbit dsds=P2^4;
- sbit dsrw=P2^2; sbit dsas=P2^1;
- sbit dscs=P2^0; sbit irq=P3^3;
- sbit rd=P3^7; sbit guang_dq=P3^6;//光敏電阻輸出
- sbit DQ=P2^5;//ds18b20與單片機(jī)連接口
- sbit lcden=P3^4;sbit lcdrs=P3^5;
- sbit dula=P2^6;sbit wela=P2^7;
- char shi,fen,miao,nian,yue,ri;
- uchar num,flag,flag1,flag_ting,count;
- uint temp,aa;//溫度值
- uchar tflag;//溫度正負(fù)標(biāo)志
- uchar code table[]=" : : T: ";
- uchar code table1[]="20 - - L: G";
- void write_ds(uchar,uchar);
- uchar read_ds(uchar);
- uchar set_alarm(uchar,uchar,uchar);
- uchar read_time(uchar);
- void delay(uint z)//延時(shí)函數(shù)--1ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void didi()
- {
- beep=0;
- delay(200);
- beep=1;
- }
- void wr_com(uchar com)//寫(xiě)指令//
- {
- delay(1);
- lcdrs=0;
- lcden=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void wr_data(uchar date)//寫(xiě)數(shù)據(jù)//
- {
- delay(1);
- lcdrs=1;
- lcden=0;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void init()//初始化設(shè)置//
- {
- beep=1;
- EA=1;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- TR0=1;
- rd=0;
- dula=0;
- wela=0;
- wr_com(0x38);
- wr_com(0x0c);
- wr_com(0x04);
- wr_com(0x01);
- wr_com(0x80);
- for(num=0;num<15;num++)
- {
- wr_data(table[num]);
- delay(20);
- }
- wr_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- wr_data(table1[num]);
- delay(20);
- }
- }
- /////////////寫(xiě)時(shí)分秒
- void write_sfm(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- wr_com(0x80+add);
- wr_data(0x30+shi);
- wr_data(0x30+ge);
- }
- /////////////寫(xiě)年月日
- void write_nyr(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- wr_com(0x80+0x40+add);
- wr_data(0x30+shi);
- wr_data(0x30+ge);
- }
- ///////////12c887寫(xiě)一位
- void write_ds(uchar add,uchar date)
- {
- dsas=1;
- dsds=1;
- dsrw=1;
- dscs=0;
- P0=add;
- dsas=0;
- dsrw=0;
- P0=date;
- dsrw=1;
- dscs=1;
- dsas=1;
- }
- ///////////12c887讀一位
- uchar read_ds(uchar add)
- {
- uchar data_ds;
- dsas=1;
- dsds=1;
- dsrw=1;
- dscs=0;
- P0=add;
- dsas=0;
- dsds=0;
- P0=0xff;
- data_ds=P0;
- dsds=1;
- dscs=1;
- dsas=1;
- return data_ds;
- }
- /***************************ds18b20程序****************************/
- void delay_18B20(uint i)//延時(shí)1微秒
- {
- while(i--);
- }
- void ds1820rst()/*ds1820復(fù)位*/
- {
- DQ = 1; //DQ復(fù)位
- delay_18B20(4); //延時(shí)
- DQ = 0; //DQ拉低
- delay_18B20(100); //精確延時(shí)大于480us
- DQ = 1; //拉高
- delay_18B20(30);
- }
- uchar ds1820rd()/*讀數(shù)據(jù)*/
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; //給脈沖信號(hào)
- dat>>=1;
- DQ = 1; //給脈沖信號(hào)
- if(DQ)
- dat|=0x80;
- delay_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*寫(xiě)數(shù)據(jù)*/
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- uint read_temp()/*讀取溫度值并轉(zhuǎn)換*/
- {
- uint a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/
- ds1820wr(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/
- ds1820rst();
- ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/
- ds1820wr(0xbe);//*讀取溫度*/
- a=ds1820rd();
- b=ds1820rd();
- temp=b;
- temp<<=8;
- temp=temp|a;
- if(temp<0x08ff)
- tflag=0;
- else
- {
- temp=~temp+1;
- tflag=1;
- }
- temp=temp*(0.0625)*100+0.5;//溫度值擴(kuò)大10倍,精確到liang位小數(shù)
- return temp;
- }
- void display_real_temp(uint temp)//實(shí)時(shí)溫度顯示函數(shù)
- {
- uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
-
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- datas[2] = temp % 100 / 10;
-
- wr_com(0x80+0x0b); //寫(xiě)地址 80表示初始地址
- wr_data('0'+datas[0]); //十位
-
- wr_com(0x80+0x0c); //寫(xiě)地址 80表示初始地址
- wr_data('0'+datas[1]); //個(gè)位
- wr_com(0x80+0x0d); //寫(xiě)地址 80表示初始地址
- wr_data(0x20+14); //個(gè)位
-
- wr_com(0x80+0x0e); //寫(xiě)地址 80表示初始地址
- wr_data('0'+datas[2]); //顯示小數(shù)點(diǎn)
- wr_com(0x80+0x0f); //寫(xiě)地址 80表示初始地址
- wr_data(0x60+3); //顯示C
-
- }
- /********************************************************
- 步進(jìn)電機(jī)正轉(zhuǎn)
- *********************************************************/
- void motor_zheng()
- {
- uchar i;
- for (i=0; i<8; i++) //一個(gè)周期轉(zhuǎn)45度
- {
- P1 = zheng[i]; //取數(shù)據(jù)
- delay(1); //調(diào)節(jié)轉(zhuǎn)速
- }
- }
- /********************************************************/
- /*步進(jìn)電機(jī)反轉(zhuǎn)
- /********************************************************/
- void motor_fan()
- {
- uchar i;
- for (i=0; i<8; i++) //一個(gè)周期轉(zhuǎn)45度1
- {
- P1 = fan[i]; //取數(shù)據(jù)
- delay(1); //調(diào)節(jié)轉(zhuǎn)速
- }
- }
- //////////////手動(dòng)按鍵控制
- void shoudong()
- {
- uchar r,N=1; //N 步進(jìn)電機(jī)運(yùn)轉(zhuǎn)圈數(shù) 因?yàn)槲覀兊牟竭M(jìn)電機(jī)是減速步進(jìn)電機(jī) 減速比是1/64 所以這里N=64時(shí) 步進(jìn)電機(jī)外部的主軸轉(zhuǎn)1圈
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- if(!key1);
- wr_com(0x80+0x40+15);
- wr_data('Z');
- while(1)
- {
- for(r=0;r<N;r++)
- {
- motor_zheng(); //電機(jī)正轉(zhuǎn)
- }
- if(key3==0)
- break; //退出此循環(huán)程序
- if(key2==0)
- break;
- }
- }
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(!key2);
- wr_com(0x80+0x40+15);
- wr_data('F');
- while(1)
- {
- for(r=0;r<N;r++)
- {
- motor_fan(); //電機(jī)反轉(zhuǎn)
- }
- if(key3==0)
- break; //退出此循環(huán)程序
- if(key1==0)
- break;
- }
- }
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(!key3);
- wr_com(0x80+0x40+15);
- wr_data('G');
- P1=0xf0;
- }
- }
- }
- /////////////電機(jī)自動(dòng)正轉(zhuǎn)
- void zidong_zheng()
- {
- //uchar i,j
- while(1)
- {
- motor_zheng();
- }
- }
- /////////////電機(jī)自動(dòng)反轉(zhuǎn)
- void zidong_fan()
- {
- //uchar r,N=1;
- while(1)
- {
- motor_fan();
- }
- }
- void keyscan()
- {
- uchar keynum;
- if(key4==0)//----加和減都是在第一個(gè)按鍵按下情況下進(jìn)行的
- {
- delay(10);//按鍵消抖----有按鍵操作就需要消抖--還需要進(jìn)行松手檢測(cè)
- if(key4==0)//第一個(gè)按鍵
- {
- flag=1;
- keynum++;
- if(keynum==1)//第一次按鍵--操作秒---即光標(biāo)的位置<操作對(duì)象>
- {
- while(!key4);
- wr_com(0x80+6);//指令執(zhí)行位置
- wr_com(0x0f);//光標(biāo)閃爍
- }
- if(keynum==2)//第二次按鍵--操作分
- {
- while(!key4);
- wr_com(0x80+3);
- wr_com(0x0f);
- }
- if(keynum==3)//第三次按鍵--操作時(shí)
- {
- while(!key4);
- wr_com(0x80);
- wr_com(0x0f);
- }
- if(keynum==4)//第4次按鍵--操作日
- {
- while(!key4);
- wr_com(0x80+0x40+8);
- wr_com(0x0f);
- }
- if(keynum==5)//第5次按鍵--操作月
- {
- while(!key4);
- wr_com(0x80+0x40+5);
- wr_com(0x0f);
- }
- if(keynum==6)//第6次按鍵--操作年
- {
- while(!key4);
- wr_com(0x80+0x40+2);
- wr_com(0x0f);
- }
- if(keynum==7)//第7次按鍵一--回復(fù)操作前狀態(tài)
- {
- while(!key4);
- keynum=0;
- wr_com(0x0c);
- flag=0;//DS12C887正常運(yùn)行---并將修改過(guò)的值寫(xiě)進(jìn)芯片-----這句不加不能進(jìn)入設(shè)置
- write_ds(0,miao);
- write_ds(2,fen);
- write_ds(4,shi);
- write_ds(7,ri);
- write_ds(8,yue);
- write_ds(9,nian);
- }
- }
- }
- //////////////時(shí)間調(diào)整---加
- if(keynum!=0)
- {
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(keynum==1)
- {
- while(!key2);
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(6,miao);
- wr_com(0x80+6);
- }
- if(keynum==2)
- {
- while(!key2);
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(3,fen);
- wr_com(0x80+3);
- }
- if(keynum==3)
- {
- while(!key2);
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(0,shi);
- wr_com(0x80);
- }
- if(keynum==4)
- {
- while(!key2);
- ri++;
- if(ri==32)
- ri=1;
- write_nyr(8,ri);
- wr_com(0x80+0x40+8);
- }
- if(keynum==5)
- {
- while(!key2);
- yue++;
- if(yue==13)
- yue=1;
- write_nyr(5,yue);
- wr_com(0x80+0x40+5);
- }
- if(keynum==6)
- {
- while(!key2);
- nian++;
- if(nian==100)
- nian=0;
- write_nyr(2,nian);
- wr_com(0x80+0x40+2);
- }
- }
- }
- //////////////時(shí)間調(diào)整---減
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(keynum==1)
- {
- while(!key3);
- miao--;
- if(miao==-1)
- miao=59;
- write_sfm(6,miao);
- wr_com(0x80+6);
- }
- if(keynum==2)
- {
- while(!key3);
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(3,fen);
- wr_com(0x80+3);
- }
- if(keynum==3)
- {
- while(!key3);
- shi--;
- if(shi==-1)
- shi=23;
- write_sfm(0,shi);
- wr_com(0x80);
- }
- if(keynum==4)
- {
- while(!key3);
- ri--;
- if(ri==0)
- ri=31;
- write_nyr(8,ri);
- wr_com(0x80+0x40+8);
- }
- if(keynum==5)
- {
- while(!key3);
- yue--;
- if(yue==0)
- yue=12;
- write_nyr(5,yue);
- wr_com(0x80+0x40+5);
- }
- if(keynum==6)
- {
- while(!key3);
- nian--;
- if(nian==-1)
- nian=99;
- write_nyr(2,nian);
- wr_com(0x80+0x40+2);
- }
- }
- }
- }
- }
- /********************************************************
- * 主程序
- *********************************************************/
- void main()
- {
- //uchar i;
- init();
- while(1)
- {
- keyscan();
- if((guang_dq==1)&&(aa<200))//----------問(wèn)題在這,程序一直在這循環(huán)
- {
- zidong_zheng();
- }
- didi();
- delay(200);
- P1=0xf0;
- flag=0;
- if(flag==0)
- {
- read_temp();
- display_real_temp(temp);
- shoudong();
- miao=read_ds(0);
- fen=read_ds(2);
- shi=read_ds(4);
- ri=read_ds(7);
- yue=read_ds(8);
- nian=read_ds(9);
-
- write_sfm(6,miao);
- write_sfm(3,fen);
- write_sfm(0,shi);
- write_nyr(8,ri);
- write_nyr(5,yue);
- write_nyr(2,nian);
- }
- }
- }
- void timer0() interrupt 1 //定時(shí)器---程序復(fù)雜--為了不影響時(shí)鐘的反應(yīng)速度--在定時(shí)器內(nèi)完成這些操作
- {
-
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- aa++;
-
- }
-
復(fù)制代碼 |
|