- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段碼表
- unsigned char code table1[]={0x7f,0xbf,0xdf,0xef,0xf7};
- bit DS18B20_Reset();
- void DS18B20_WriteData(uchar dat);
- uchar DS18B20_RadeData();
- void Seg7_Display(uint val);
- void delayms(uint xms);
- void system_Ini();
- void InitMotor();
- void SetMotor();
- uchar tempL;
- sbit CS88=P2^2;
- uint tempH;
- uint temp;
- sbit LED=P1^1;
- sbit DS=P2^4; //引腳定義
- sbit DU=P2^0;
- sbit WE=P2^1;
- sbit beep = P2^3;
- sbit A = P3^4; //定義管腳
- sbit b = P3^5;
- sbit C = P3^6;
- sbit D = P3^7;
- //步進電機驅動
- unsigned char MotorStep=0; //步進馬達步序
- unsigned int MotorDelay,Speed=1,TIM,CT;
- #define speed 12 // 調整速度 數值不要設的太低 低了會引起震動。
- void main()
- {
- system_Ini();
- InitMotor();
- while(1)
- {
- CS88=0;
- DS18B20_Reset();
- DS18B20_WriteData(0xcc); //跳過ROM檢測
- DS18B20_WriteData(0x44); //啟動溫度轉換
- DS18B20_Reset();
- DS18B20_WriteData(0xcc); //跳過ROM檢測
- DS18B20_WriteData(0xbe); //讀暫存器
- tempL=DS18B20_RadeData(); //讀溫度地位
- tempH=DS18B20_RadeData();
- tempH=(tempH<<8)|tempL; //16位
- if((tempH&0xf8)==0xf800) //如果溫度是負值,取反加一
- tempH=~tempH+1;
- temp=tempH*0.0625*1000; //25 25360
- //顯示讀取到的溫度
- Seg7_Display(temp); //25.360
- //判斷溫度是否超過29度
- if (temp>34000)
- {
- LED=0;
- beep=0;
- SetMotor();
- }
- else
- {
- LED=1;
- beep=1;
- A = 0;
- b = 0;
- C = 0;
- D = 0;
- }
-
- //靜態顯示小數點
- DU=1;
- P0=0x80;
- DU=0;
- P0=0xff;
- WE=1;
- P0=0xef;
- WE=0;
- }
- }
- bit DS18B20_Reset()
- {
- bit flag;
- uchar i;
- DS=0;
- for(i=240;i>0;i--); //每執行一次,是兩個機器周期 240X2=480
- DS=1;
- for(i=40;i>0;i--); //延時80us
- flag=DS;
- for(i=200;i>0;i--); //延時400us
- return flag;
- }
- void DS18B20_WriteData(uchar dat)
- {
- uchar i,j;
- for(j=0;j<8;j++)
- {
- DS=0;
- for(i=2;i>0;i--);
- DS=dat&0x01; //取出最低位
- for(i=30;i>0;i--); //延時約60us
- DS=1; //釋放總線
- dat = dat>>1;
- }
- }
- uchar DS18B20_RadeData()
- {
- uchar i,j,rdata;
- for(j=0;j<8;j++)
- {
- rdata>>=1;
- DS=0;
- for(i=2;i>0;i--);
- DS=1;
- for(i=3;i>0;i--);
- if(DS==1)
- rdata=rdata|0x80;
- for(i=30;i>0;i--);
- DS=1;
- }
- return rdata;
- }
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Seg7_Display(uint val)
- {
- uint i=4;
- uint dis_data[5]={0};
- dis_data[0]=val%10;
- dis_data[1]=val/10%10;
- dis_data[2]=val/100%10;
- dis_data[3]=val/1000%10;
- dis_data[4]=val/10000%10;
- for (i=0;i<5;i++)
- {
- P0=0xff;
- DU=1;
- P0=table[dis_data[i]];
- DU=0;
- P0=0xff;
- WE=1;
- P0=table1[i];
- WE=0;
- delayms(1);
- }
-
- }
- void InitMotor()
- {
- A = 1;
- b = 1;
- C = 1;
- D = 1;
- }
- void SetMotor()
- {
- MotorDelay=Speed; //調整速度
- switch(MotorStep)
- {
- case 0:
- if(TIM) // A
- {
- A = 0; //0xf1
- b = 1;
- C = 1;
- D = 1;
- MotorStep = 1;
- TIM=0;
- }
- break;
- case 1: // AB
- if(TIM)
- {
- A = 0; //0xf3
- b = 0;
- C = 1;
- D = 1;
- MotorStep = 2;
- TIM=0;
- }
- break;
- case 2: //B
- if(TIM)
- {
-
- A = 1;
- b = 0; //0xf2
- C = 1;
- D = 1;
-
- MotorStep = 3;
- TIM=0;
- }
- break;
- case 3: //BC
- if(TIM)
- {
- A = 1;
- b = 0; //0xf6
- C = 0;
- D = 1;
- MotorStep = 4;
- TIM=0;
- }
- break;
- case 4: //C
- if(TIM)
- {
- A = 1;
- b = 1; //0xf4
- C = 0;
- D = 1;
- MotorStep = 5;
- TIM=0;
- }
- break;
- case 5: //CD
- if(TIM)
- {
- A = 1;
- b = 1; //0xfc
- C = 0;
- D = 0;
- MotorStep = 6;
- TIM=0;
- }
- break;
- case 6: //D
- if(TIM)
- {
- A = 1;
- b = 1; //0xf8
- C = 1;
- D = 0;
- MotorStep = 7;
- TIM=0;
- }
- break;
- case 7: //DA
- if(TIM)
- {
- A = 0;
- b = 1; //0xf9
- C = 1;
- D = 0;
- MotorStep = 0;
- TIM=0;
- }
- break;
-
- }
- }
- void system_Ini()
- {
- TMOD|= 0x11;
- TH0=0xDC; //11.0592M
- TL0=0x00;
- IE = 0x8A;
- TR0 = 1;
- }
- void Tzd(void) interrupt 1
- {
- TH0 = 0xfe; //11.0592
- TL0 = 0x33;
- if( CT++==speed)
- {TIM=1;
- CT=0;
- }
- }
復制代碼
|