程序格式不對,我重發一遍,大家見諒,見怪不怪- #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; //正轉
- sbit key2 = P3^1; //反轉----按鍵分時復用
- sbit key3 = P3^2; //停止
- sbit key4 = P3^3; //時間調整按鈕
- 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與單片機連接口
- 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;//溫度正負標志
- 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)//延時函數--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)//寫指令//
- {
- delay(1);
- lcdrs=0;
- lcden=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void wr_data(uchar date)//寫數據//
- {
- delay(1);
- lcdrs=1;
- lcden=0;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void init()//初始化設置//
- {
- 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);
- }
- }
- /////////////寫時分秒
- 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);
- }
- /////////////寫年月日
- 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寫一位
- 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)//延時1微秒
- {
- while(i--);
- }
- void ds1820rst()/*ds1820復位*/
- {
- DQ = 1; //DQ復位
- delay_18B20(4); //延時
- DQ = 0; //DQ拉低
- delay_18B20(100); //精確延時大于480us
- DQ = 1; //拉高
- delay_18B20(30);
- }
- uchar ds1820rd()/*讀數據*/
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; //給脈沖信號
- dat>>=1;
- DQ = 1; //給脈沖信號
- if(DQ)
- dat|=0x80;
- delay_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*寫數據*/
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- uint read_temp()/*讀取溫度值并轉換*/
- {
- uint a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- ds1820wr(0x44);//*啟動溫度轉換*/
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- 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;//溫度值擴大10倍,精確到liang位小數
- return temp;
- }
- void display_real_temp(uint temp)//實時溫度顯示函數
- {
- uchar datas[] = {0, 0, 0, 0}; //定義數組
-
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- datas[2] = temp % 100 / 10;
-
- wr_com(0x80+0x0b); //寫地址 80表示初始地址
- wr_data('0'+datas[0]); //十位
-
- wr_com(0x80+0x0c); //寫地址 80表示初始地址
- wr_data('0'+datas[1]); //個位
- wr_com(0x80+0x0d); //寫地址 80表示初始地址
- wr_data(0x20+14); //個位
-
- wr_com(0x80+0x0e); //寫地址 80表示初始地址
- wr_data('0'+datas[2]); //顯示小數點
- wr_com(0x80+0x0f); //寫地址 80表示初始地址
- wr_data(0x60+3); //顯示C
-
- }
- /********************************************************
- 步進電機正轉
- *********************************************************/
- void motor_zheng()
- {
- uchar i;
- for (i=0; i<8; i++) //一個周期轉45度
- {
- P1 = zheng[i]; //取數據
- delay(1); //調節轉速
- }
- }
- /********************************************************/
- /*步進電機反轉
- /********************************************************/
- void motor_fan()
- {
- uchar i;
- for (i=0; i<8; i++) //一個周期轉45度1
- {
- P1 = fan[i]; //取數據
- delay(1); //調節轉速
- }
- }
- //////////////手動按鍵控制
- void shoudong()
- {
- uchar r,N=1; //N 步進電機運轉圈數 因為我們的步進電機是減速步進電機 減速比是1/64 所以這里N=64時 步進電機外部的主軸轉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(); //電機正轉
- }
- if(key3==0)
- break; //退出此循環程序
- 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(); //電機反轉
- }
- if(key3==0)
- break; //退出此循環程序
- if(key1==0)
- break;
- }
- }
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(!key3);
- wr_com(0x80+0x40+15);
- wr_data('G');
- P1=0xf0;
- }
- }
- }
- /////////////電機自動正轉
- void zidong_zheng()
- {
- //uchar i,j
- while(1)
- {
- motor_zheng();
- }
- }
- /////////////電機自動反轉
- void zidong_fan()
- {
- //uchar r,N=1;
- while(1)
- {
- motor_fan();
- }
- }
- void keyscan()
- {
- uchar keynum;
- if(key4==0)//----加和減都是在第一個按鍵按下情況下進行的
- {
- delay(10);//按鍵消抖----有按鍵操作就需要消抖--還需要進行松手檢測
- if(key4==0)//第一個按鍵
- {
- flag=1;
- keynum++;
- if(keynum==1)//第一次按鍵--操作秒---即光標的位置<操作對象>
- {
- while(!key4);
- wr_com(0x80+6);//指令執行位置
- wr_com(0x0f);//光標閃爍
- }
- if(keynum==2)//第二次按鍵--操作分
- {
- while(!key4);
- wr_com(0x80+3);
- wr_com(0x0f);
- }
- if(keynum==3)//第三次按鍵--操作時
- {
- 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次按鍵一--回復操作前狀態
- {
- while(!key4);
- keynum=0;
- wr_com(0x0c);
- flag=0;//DS12C887正常運行---并將修改過的值寫進芯片-----這句不加不能進入設置
- write_ds(0,miao);
- write_ds(2,fen);
- write_ds(4,shi);
- write_ds(7,ri);
- write_ds(8,yue);
- write_ds(9,nian);
- }
- }
- }
- //////////////時間調整---加
- 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);
- }
- }
- }
- //////////////時間調整---減
- 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))//----------問題在這,程序一直在這循環
- {
- 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 //定時器---程序復雜--為了不影響時鐘的反應速度--在定時器內完成這些操作
- {
-
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- aa++;
-
- }
-
復制代碼 |