把我的一些經驗和程序分享出來,希望能有所幫助。我是初學單片機和C語言,可能程序寫的很幼稚,希望能理解。謝謝!詳細內容都在壓縮包里。
仿真中用ADC0808和滑動變阻器代替雨滴傳感器
實物中用ET2046芯片 雨滴傳感器AO引腳接在IN3
元器件清單 仿真圖
1 AT89C51
2 ADC0808
3 LM016L
4 MOTOR-SSTEPPER
5 POT-HG
6 RESPACK-8
7 ULN2003A
元器件清單 實物圖
1 單片機開發板
2 LCD1602
3 雨滴傳感器
4 步進電機28BYJ-48
單片機源程序如下:
- #include<reg51.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //********正轉**********
- unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
- //********反轉**********
- unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
- //********數組**********
- uchar shuzu[]={0x00,0x00,0x00};
- sbit RS=P1^7;
- sbit RW=P1^6;
- sbit E=P1^5;
- sbit ST=P3^0;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^7;
- uchar getdata;
- uchar temp;
- uchar flag;
- //*********延時**********
- void delay(unsigned int t)
- {
- unsigned int k;
- while(t--)
- {
- for(k=0; k<125; k++)
- ;
- }
- }
- void delaynms(uint aa)
- {
- uchar bb;
- while(aa--)
- {
- for(bb=0;bb<115;bb++) //1ms基準延時程序
- {
- ;
- }
- }
- }
- //*********LCD顯示*********
- void fbusy()//查忙
- {
- P2=0xff;RS=0;RW=1;
- E=0;E=1;
- while(P2&0x80){E=0;E=1;}
- }
- void wr51r(uchar j)//寫命令
- {
- fbusy();
- E=0;RS=0;RW=0;
- E=1;
- P2=j;
- E=0;
- }
- void wr51ddr(uchar j)//寫數據
- {
- fbusy();
- E=0;RS=1;RW=0;
- E=1;
- P2=j;
- E=0;
- }
- void init()//清屏
- {
- wr51r(0x01);
- wr51r(0x38);
- wr51r(0x0c);
- wr51r(0x06);
- }
- //*********電機正轉********
- void MOTORFFW()
- {
- uchar i,j;
- if(flag==1)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<8;i++) //旋轉角度
- {
- P1=FFW[i];
- delaynms(1); //調節轉速
- }
- }
- }
- if(flag==2)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<8;i++) //旋轉角度
- {
- P1=FFW[i];
- delaynms(5); //調節轉速
- }
- }
- }
- if(flag==3)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<8;i++) //旋轉角度
- {
- P1=FFW[i];
- delaynms(10); //調節轉速
- }
- }
- }
- }
- //*********電機反轉********
- void MOTORREV()
- {
- uchar i,j;
- if(flag==1)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<4;i++) //旋轉角度
- {
- P1=REV[i];
- delaynms(1); //調節轉速
- }
- }
- }
- if(flag==2)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<4;i++) //旋轉角度
- {
- P1=REV[i];
- delaynms(5); //調節轉速
- }
- }
- }
- if(flag==3)
- {
- for(j=0;j<2;j++) //電機旋轉一周,不是外面所看到的一周,是里面的傳動輪轉了一周
- {
- for(i=0;i<4;i++) //旋轉角度
- {
- P1=REV[i];
- delaynms(10); //調節轉速
- }
- }
- }
- }
- //*********電機停止********
- void MOTORSTOP()
- {
- P1=0x00;
- }
- //*********主函數*********
- void main()
- {
- uint i;
- delay(100);
- init();
- wr51r(0x80);
- wr51ddr('W');
- wr51ddr('a');
- wr51ddr('t');
- wr51ddr('e');
- wr51ddr('r');
- wr51ddr(':');
- ET0=1;
- ET1=1;
- EA=1;
- TMOD=0X12;
- TH0=246;
- TL0=246;
- TH1=(65536-20000)/256;
- TL1=(65536-20000)%256;
- TR0=1;
- TR1=1;
- while(1)
- {
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0){;}
- OE=1;
- getdata=P0;
- OE=0;
- temp=getdata;
- shuzu[0]=temp/100;
- shuzu[1]=temp%100/10;
- shuzu[2]=temp%10;
- if(temp>0&&temp<=85){flag=1;}
- if(temp>85&&temp<=170){flag=2;}
- if(temp>170&&temp<=255){flag=3;}
- if(temp==0){flag=4;}
- for(i=0;i<1;i++)
- {
- MOTORFFW();
- }
- for(i=0;i<1;i++)
- {
- MOTORREV();
- }
- if(flag==4)
- {
- MOTORSTOP();
- }
- }
- }
- void timer0_int(void) interrupt 1
- {
- CLK=~CLK;
- }
- void timer1_int(void) interrupt 3
- {
- TH1=(65536-20000)/256;
- TL1=(65536-20000)%256;
- switch(shuzu[2])
- {
- case 0:wr51r(0x88);wr51ddr('0');break;
- case 1:wr51r(0x88);wr51ddr('1');break;
- case 2:wr51r(0x88);wr51ddr('2');break;
- case 3:wr51r(0x88);wr51ddr('3');break;
- case 4:wr51r(0x88);wr51ddr('4');break;
- case 5:wr51r(0x88);wr51ddr('5');break;
- case 6:wr51r(0x88);wr51ddr('6');break;
- case 7:wr51r(0x88);wr51ddr('7');break;
- case 8:wr51r(0x88);wr51ddr('8');break;
- case 9:wr51r(0x88);wr51ddr('9');break;
- }
- switch(shuzu[1])
- {
- case 0:wr51r(0x87);wr51ddr('0');break;
- case 1:wr51r(0x87);wr51ddr('1');break;
- case 2:wr51r(0x87);wr51ddr('2');break;
- case 3:wr51r(0x87);wr51ddr('3');break;
- case 4:wr51r(0x87);wr51ddr('4');break;
- case 5:wr51r(0x87);wr51ddr('5');break;
- case 6:wr51r(0x87);wr51ddr('6');break;
- case 7:wr51r(0x87);wr51ddr('7');break;
- case 8:wr51r(0x87);wr51ddr('8');break;
- case 9:wr51r(0x87);wr51ddr('9');break;
- }
- switch(shuzu[0])
- {
- case 0:wr51r(0x86);wr51ddr('0');break;
- case 1:wr51r(0x86);wr51ddr('1');break;
- case 2:wr51r(0x86);wr51ddr('2');break;
- }
- }
復制代碼
所有資料51hei提供下載:
智能雨滴傳感器設計.rar
(89.33 KB, 下載次數: 122)
2020-1-2 16:22 上傳
點擊文件名下載附件
詳細內容都在這兒
|