找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5605|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的智能雨刮器Proteus仿真程序设计

[复制链接]
跳转到指定楼层
楼主
把我的一些经验和程序分享出来,希望能有所帮助。我是初学单片机和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

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //********正转**********
  7. unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
  8. //********反转**********
  9. unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
  10. //********数组**********
  11. uchar shuzu[]={0x00,0x00,0x00};
  12. sbit RS=P1^7;
  13. sbit RW=P1^6;
  14. sbit E=P1^5;
  15. sbit ST=P3^0;
  16. sbit OE=P3^1;
  17. sbit EOC=P3^2;
  18. sbit CLK=P3^7;
  19. uchar getdata;
  20. uchar temp;
  21. uchar flag;
  22. //*********延时**********
  23. void delay(unsigned int t)
  24. {                          
  25.    unsigned int k;
  26.    while(t--)
  27.    {
  28.      for(k=0; k<125; k++)
  29.      ;
  30.    }
  31. }
  32. void delaynms(uint aa)
  33. {
  34.   uchar bb;
  35.   while(aa--)
  36.   {
  37.    for(bb=0;bb<115;bb++)     //1ms基准延时程序
  38.    {
  39.     ;
  40.    }
  41.   }
  42. }
  43. //*********LCD显示*********
  44. void fbusy()//查忙
  45. {
  46.   P2=0xff;RS=0;RW=1;
  47.   E=0;E=1;
  48.   while(P2&0x80){E=0;E=1;}
  49. }
  50. void wr51r(uchar j)//写命令
  51. {
  52.   fbusy();
  53.   E=0;RS=0;RW=0;
  54.   E=1;
  55.   P2=j;
  56.   E=0;
  57. }
  58. void wr51ddr(uchar j)//写数据
  59. {
  60.   fbusy();
  61.   E=0;RS=1;RW=0;
  62.   E=1;
  63.   P2=j;
  64.   E=0;
  65. }
  66. void init()//清屏
  67. {
  68.   wr51r(0x01);
  69.   wr51r(0x38);
  70.   wr51r(0x0c);
  71.   wr51r(0x06);
  72. }
  73. //*********电机正转********
  74. void MOTORFFW()
  75. {
  76.    uchar i,j;
  77.    if(flag==1)
  78.    {
  79.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  80.   {
  81.    for(i=0;i<8;i++)   //旋转角度
  82.    {
  83.      P1=FFW[i];
  84.      delaynms(1);   //调节转速   
  85.    }
  86.   }
  87.    }
  88.       if(flag==2)
  89.    {
  90.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  91.   {
  92.    for(i=0;i<8;i++)   //旋转角度
  93.    {
  94.      P1=FFW[i];
  95.      delaynms(5);   //调节转速   
  96.    }
  97.   }
  98.    }
  99.            if(flag==3)
  100.    {
  101.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  102.   {
  103.    for(i=0;i<8;i++)   //旋转角度
  104.    {
  105.      P1=FFW[i];
  106.      delaynms(10);   //调节转速          
  107.    }
  108.   }
  109.    }
  110. }
  111. //*********电机反转********
  112. void MOTORREV()
  113. {
  114.    uchar i,j;
  115.    if(flag==1)
  116.    {
  117.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  118.   {
  119.    for(i=0;i<4;i++)  //旋转角度
  120.    {
  121.      P1=REV[i];
  122.      delaynms(1);   //调节转速   
  123.    }
  124.   }
  125.    }
  126.       if(flag==2)
  127.    {
  128.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  129.   {
  130.    for(i=0;i<4;i++)   //旋转角度
  131.    {
  132.      P1=REV[i];
  133.      delaynms(5);   //调节转速   
  134.    }
  135.   }
  136.    }
  137.            if(flag==3)
  138.    {
  139.    for(j=0;j<2;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
  140.   {
  141.    for(i=0;i<4;i++)  //旋转角度
  142.    {
  143.      P1=REV[i];
  144.      delaynms(10);   //调节转速          
  145.    }
  146.   }
  147.    }
  148. }
  149. //*********电机停止********
  150. void MOTORSTOP()
  151. {
  152. P1=0x00;
  153. }
  154. //*********主函数*********
  155. void main()
  156. {
  157.   uint i;
  158.   delay(100);
  159.   init();
  160.   wr51r(0x80);
  161.   wr51ddr('W');
  162.   wr51ddr('a');
  163.   wr51ddr('t');
  164.   wr51ddr('e');
  165.   wr51ddr('r');
  166.   wr51ddr(':');
  167.   ET0=1;
  168.   ET1=1;
  169.   EA=1;
  170.   TMOD=0X12;
  171.   TH0=246;
  172.   TL0=246;
  173.   TH1=(65536-20000)/256;
  174.   TL1=(65536-20000)%256;
  175.   TR0=1;
  176.   TR1=1;
  177.   while(1)
  178.   {
  179.   ST=0;
  180.   ST=1;
  181.   ST=0;
  182.   while(EOC==0){;}
  183.   OE=1;
  184.   getdata=P0;
  185.   OE=0;
  186.   temp=getdata;
  187.   shuzu[0]=temp/100;
  188.   shuzu[1]=temp%100/10;
  189.   shuzu[2]=temp%10;
  190.   if(temp>0&&temp<=85){flag=1;}
  191.   if(temp>85&&temp<=170){flag=2;}
  192.   if(temp>170&&temp<=255){flag=3;}
  193.   if(temp==0){flag=4;}
  194.   for(i=0;i<1;i++)
  195.    {
  196.          MOTORFFW();
  197.    }
  198.   for(i=0;i<1;i++)
  199.    {
  200.      MOTORREV();
  201.    }
  202.    if(flag==4)
  203.    {
  204.          MOTORSTOP();
  205.    }
  206.   }
  207. }

  208. void timer0_int(void) interrupt  1
  209. {
  210.   CLK=~CLK;       
  211. }
  212. void timer1_int(void) interrupt  3
  213. {
  214.   TH1=(65536-20000)/256;
  215.   TL1=(65536-20000)%256;
  216.         switch(shuzu[2])
  217.         {
  218.                 case 0:wr51r(0x88);wr51ddr('0');break;
  219.                 case 1:wr51r(0x88);wr51ddr('1');break;
  220.                 case 2:wr51r(0x88);wr51ddr('2');break;
  221.                 case 3:wr51r(0x88);wr51ddr('3');break;
  222.                 case 4:wr51r(0x88);wr51ddr('4');break;
  223.                 case 5:wr51r(0x88);wr51ddr('5');break;
  224.                 case 6:wr51r(0x88);wr51ddr('6');break;
  225.                 case 7:wr51r(0x88);wr51ddr('7');break;
  226.                 case 8:wr51r(0x88);wr51ddr('8');break;
  227.                 case 9:wr51r(0x88);wr51ddr('9');break;
  228.         }
  229.         switch(shuzu[1])
  230.         {
  231.             case 0:wr51r(0x87);wr51ddr('0');break;
  232.                 case 1:wr51r(0x87);wr51ddr('1');break;
  233.                 case 2:wr51r(0x87);wr51ddr('2');break;
  234.                 case 3:wr51r(0x87);wr51ddr('3');break;
  235.                 case 4:wr51r(0x87);wr51ddr('4');break;
  236.                 case 5:wr51r(0x87);wr51ddr('5');break;
  237.                 case 6:wr51r(0x87);wr51ddr('6');break;
  238.                 case 7:wr51r(0x87);wr51ddr('7');break;
  239.                 case 8:wr51r(0x87);wr51ddr('8');break;
  240.                 case 9:wr51r(0x87);wr51ddr('9');break;
  241.         }
  242.         switch(shuzu[0])
  243.         {
  244.             case 0:wr51r(0x86);wr51ddr('0');break;
  245.             case 1:wr51r(0x86);wr51ddr('1');break;                 
  246.                 case 2:wr51r(0x86);wr51ddr('2');break;
  247.         }
  248. }
复制代码

所有资料51hei提供下载:
智能雨滴传感器设计.rar (89.33 KB, 下载次数: 122)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:673096 发表于 2020-6-9 20:53 | 只看该作者
大佬你的proteus是哪个版本的,我尝试下载解压缩后进行仿真无法运行
回复

使用道具 举报

板凳
ID:407687 发表于 2020-12-3 18:49 | 只看该作者
643068934 发表于 2020-6-9 20:53
大佬你的proteus是哪个版本的,我尝试下载解压缩后进行仿真无法运行

proteus7.8版本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表