把我的一些经验和程序分享出来,希望能有所帮助。我是初学单片机和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)
|