找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2275|回复: 0
收起左侧

基于51单片机的智能卷帘门Proteus仿真程序

[复制链接]
ID:353033 发表于 2020-4-7 12:21 | 显示全部楼层 |阅读模式
有proteus仿真及程序代码.内容包括电机驱动模块,mpx4115压力传感器模块,光敏传感器模块,按键模块,指示灯,自己写文档画的图,有需要的欢迎参考

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. //线性区间标度变换公式:    y=(115-15)/(243-13)*X+15kpa   
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include <absacc.h>
  5. #include <stdio.h>

  6. #define  UP   20
  7. #define  DOWN  30
  8. #define  STOP  40
  9. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  10. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  11. //压力传感器的ADC0832的引脚
  12. sbit ADCS =P2^2;  //ADC0832 chip seclect
  13. sbit ADDI =P2^4;  //ADC0832 k in
  14. sbit ADDO =P2^4;  //ADC0832 k out
  15. sbit ADCLK =P2^3;  //ADC0832 clock signal

  16. //光敏的ADC0832的引脚
  17. sbit ADC_DAT    = P1^5;                 // ADC0832的DI/DO引脚
  18. sbit ADC_CS     = P1^6;                 // ADC0832的CS引脚
  19. sbit ADC_CLK    = P1^7;                 // ADC0832的CLK引脚
  20. sbit BEEP       = P3^4;                        //喇叭
  21. sbit LED_BLUE   = P1^0;               
  22. sbit LED_YELLOW = P1^1;
  23. sbit KEY1       = P1^2;                        //开按键
  24. sbit KEY2       = P1^3;                        //关按键
  25. sbit KEY3       = P1^4;                        //停止键
  26. sbit Led_P      = P0^7;                // 指示灯
  27. uchar gLight      = 40;                        // 光线强度的阈值

  28. unsigned char getdata; //获取ADC转换回来的值
  29. void delay()//延时程序10ms
  30. {
  31.         unsigned i,j,k;
  32.         for(i=0;i<3;i++)
  33.                 for(j=0;j<20;j++)
  34.                         for(k=0;k<81;k++);
  35. }

  36. //读ADC0832函数,采集并返回
  37. unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
  38. {
  39.     unsigned char i=0;
  40.     unsigned char j;
  41.     unsigned int dat=0;
  42.     unsigned char ndat=0;

  43.     if(channel==0)channel=2;
  44.     if(channel==1)channel=3;
  45.     ADDI=1;
  46.     _nop_();
  47.     _nop_();
  48.     ADCS=0;//拉低CS端
  49.     _nop_();
  50.     _nop_();
  51.     ADCLK=1;//拉高CLK端
  52.     _nop_();
  53.     _nop_();
  54.     ADCLK=0;//拉低CLK端,形成下降沿1
  55.     _nop_();
  56.     _nop_();
  57.     ADCLK=1;//拉高CLK端
  58.     ADDI=channel&0x1;
  59.     _nop_();
  60.     _nop_();
  61.     ADCLK=0;//拉低CLK端,形成下降沿2
  62.     _nop_();
  63.     _nop_();
  64.     ADCLK=1;//拉高CLK端
  65.     ADDI=(channel>>1)&0x1;
  66.     _nop_();
  67.     _nop_();
  68.     ADCLK=0;//拉低CLK端,形成下降沿3
  69.     ADDI=1;//控制命令结束
  70.     _nop_();
  71.     _nop_();
  72.     dat=0;
  73.     for(i=0;i<8;i++)
  74.     {
  75.         dat|=ADDO;//收数据
  76.         ADCLK=1;
  77.         _nop_();
  78.         _nop_();
  79.         ADCLK=0;//形成一次时钟脉冲
  80.         _nop_();
  81.         _nop_();
  82.         dat<<=1;
  83.         if(i==7)dat|=ADDO;
  84.     }  
  85.     for(i=0;i<8;i++)
  86.     {
  87.         j=0;
  88.         j=j|ADDO;//收数据
  89.         ADCLK=1;
  90.         _nop_();
  91.         _nop_();
  92.         ADCLK=0;//形成一次时钟脉冲
  93.         _nop_();
  94.         _nop_();
  95.         j=j<<7;
  96.         ndat=ndat|j;
  97.         if(i<7)ndat>>=1;
  98.     }
  99.     ADCS=1;//拉低CS端
  100.     ADCLK=0;//拉低CLK端
  101.     ADDO=1;//拉高数据端,回到初始状态
  102.     dat<<=8;
  103.     dat|=ndat;
  104.     return(dat);            //return ad k
  105. }
  106. /*********************************************************/
  107. // ADC0832的时钟脉冲
  108. /*********************************************************/
  109. void WavePlus()
  110. {
  111.         _nop_();
  112.         ADC_CLK = 1;
  113.         _nop_();
  114.         ADC_CLK = 0;
  115. }
  116. /*********************************************************/
  117. // 获取指定通道的A/D转换结果(光敏)
  118. /*********************************************************/
  119. uchar Get_ADC0832()
  120. {
  121.         uchar i;
  122.         uchar dat1=0;
  123.         uchar dat2=0;
  124.        
  125.         ADC_CLK = 0;                                // 电平初始化
  126.         ADC_DAT = 1;
  127.         _nop_();
  128.         ADC_CS = 0;
  129.         WavePlus();                                // 起始信号
  130.         ADC_DAT = 1;
  131.         WavePlus();                                // 通道选择的第一位
  132.         ADC_DAT = 0;      
  133.         WavePlus();                                // 通道选择的第二位
  134.         ADC_DAT = 1;       
  135.         for(i=0;i<8;i++)                        // 第一次读取
  136.         {
  137.                 dat1<<=1;
  138.                 WavePlus();
  139.                 if(ADC_DAT)
  140.                         dat1=dat1|0x01;
  141.                 else
  142.                         dat1=dat1|0x00;
  143.         }       
  144.         for(i=0;i<8;i++)                        // 第二次读取
  145.         {
  146.                 dat2>>= 1;
  147.                 if(ADC_DAT)
  148.                         dat2=dat2|0x80;
  149.                 else
  150.                         dat2=dat2|0x00;
  151.                 WavePlus();
  152.         }       
  153.         _nop_();                                        // 结束此次传输
  154.         ADC_DAT = 1;
  155.         ADC_CLK = 1;
  156.         ADC_CS  = 1;   
  157.         if(dat1==dat2)                                // 返回采集结果
  158.                 return dat1;
  159.         else
  160.                 return 0;
  161. }

  162. /*********************************************************/
  163. //   主函数
  164. /*********************************************************/

  165. void main(void)
  166. {  uchar temp;
  167.   unsigned int ppress = 0;
  168.   LED_BLUE=0;
  169.   BEEP=0;
  170.   while(1)
  171.   {                  /*压力传感器控制警报*/
  172.                 uchar light;
  173.                 uint k;
  174.                 getdata=Adc0832(0);        //获取压力值
  175.                 if(getdata>50)                //如果大于限定值
  176.                         for(k=0;k<2;k++)
  177.                         {        LED_BLUE=~LED_BLUE;                //则打开警报和蓝灯
  178.                                  BEEP=~BEEP;
  179.                                 delay();
  180.                         }
  181.                 else  
  182.                         {        LED_BLUE=0;
  183.                                 BEEP=0;
  184.                         }       
  185.                    /*按键控制步进电机*/
  186.                 if(KEY1==0)                //按下KEY1
  187.                 {
  188.                         temp=UP;//控制正转
  189.                         P3=0X00;//清零
  190.                         delay();
  191.                 }
  192.                 if(KEY2==0)
  193.                 {
  194.                         temp=DOWN;//控制反转
  195.                         P3=0X00;
  196.                         delay();
  197.                 }
  198.                 if(KEY3==0)
  199.                 {        temp=STOP;//控制停止 }
  200.                 switch(temp)
  201.                 {
  202.                 case DOWN : P3=0X01;//控制反转 //0011  
  203.                                         delay();
  204.                                         delay();
  205.                                         P3=0X02;//0110
  206.                                         delay();
  207.                                         delay();
  208.                                         P3=0X04;//1100
  209.                                         delay();
  210.                                         delay();
  211.                                         P3=0X08;//1001
  212.                                         delay();
  213.                                         delay();
  214.                                         break;
  215.                 case UP :        P3=0X08;//控制正转
  216.                                         delay();
  217.                                         delay();
  218.                                         P3=0X04;
  219.                                         delay();
  220.                                         delay();
  221.                                         P3=0X02;
  222.                                         delay();
  223.                                         delay();
  224.                                         P3=0X01;
  225.                                         delay();
  226.                                         delay();
  227.                                         break;
  228.                 case  STOP ://控制停止
  229.                                         P3=0X00;
  230.                                         delay();
  231.                                         delay();                                       
  232.                                         break;
  233.                 }               
  234.                 /*光线控制黄灯开关*/
  235.                
  236.                 light=Get_ADC0832();                    // 读取光照强度
  237.                 light=light/2.5;                                // 缩小光照检测结果(在0-99)
  238.                 if(light<gLight)                                // 当前光线小于设置的阈值 即晚上
  239.                 {
  240.                         if(LED_YELLOW==1)                        // 如果黄灯是关闭的
  241.                         {
  242.                                 LED_YELLOW=0;                        // 则打开黄灯
  243.                         }
  244.                 }
  245.                 else                                                    // 当前光线大于或等于设置的阈值 即白天
  246.                 {
  247.                         if(LED_YELLOW==0)                        // 如果黄灯是打开的
  248.                         {
  249.                                 LED_YELLOW=1;                        // 则关闭黄灯
  250.                         }
  251.                 }       
  252.                 delay(); // 延时0.1秒       
  253.                             
  254.   }
  255. }
复制代码
51hei.png
这个错误如何解决啊?求大神帮忙,下面是报错的仿真图:
王杰文档原理图及程序.rar (125.68 KB, 下载次数: 30)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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