基于51单片机家具门屉耐用性自动检测装置程序设计

 

  
  
  
  
  1. #include <reg52.h> 
  2. #define uint unsigned int  
  3. #define uchar unsigned char  
  4. #define ZKB 6              //占空比初始值设定  
  5. #define max_time 100       //设置超出时间  
  6.  
  7.  
  8. sbit gd1=P1^0;             //光电开关被挡住是高电平,没有被挡住是低电平  
  9. sbit gd2=P1^1;             //光电开关被挡住是高电平,没有被挡住是低电平  
  10. sbit en=P1^2;              //步进电机使能端,高电平工作,低电平不工作  
  11. sbit zx=P1^3;              //高电平步进电机正转,低电平步进电机反转  
  12. sbit clock=P1^4;           //步进电机频率端口  
  13. sbit lcdrs=P2^3;           //LCD1602端口定义  
  14. sbit lcdrw=P2^4;           //LCD1602端口定义  
  15. sbit lcden=P2^5;           //LCD1602端口定义  
  16.  
  17.  
  18. uchar k=0;  
  19. uchar j=0;  
  20. uchar flag=0;                                //标志位  
  21. uint  avr_time;                              //定义平均时间  
  22. uchar num;                                   //定义液晶显示循环变量  
  23. uint zheng=0,fan=0;                          //正反转次数置零  
  24. uint shijian[51];                            //定义时间数组  
  25. uchar code table2[]="forward:        ";      //LCD1602显示数组  
  26. uchar code table3[]="backward:       ";      //LCD1602显示数组  
  27. uchar code table4[]="      error!    ";      //LCD1602显示数组  
  28.  
  29.  
  30. void timer_init()  
  31. {   
  32.      TMOD=0x11;                  //定时器模式设置  
  33.      TH0=0xFF;                   //写入定时器0初始值  
  34.      TL0=0x9C;                    
  35.      TH1=(65536-50000)/256;      //写入定时器1初始值  
  36.      TL1=(65536-50000)%6;  
  37.      ET0=1;                      //允许定时器0中断  
  38.      TR0=1;                      //启动定时器0  
  39.      ET1=1;                      //允许定时器1中断  
  40.      TR1=1;                      //启动定时器1  
  41.      EA=1;                       //允许总中断  
  42. }  
  43.  
  44.  
  45. uint data_pro(void)  
  46. {  
  47.      uchar i;  
  48.      uint avr=0;  
  49.      for(i=1;i<51;i++)  
  50.      {  
  51.       avr+=shijian[i];  
  52.      }       
  53.      avravr=avr/50;  
  54.      return avr;  
  55. }  
  56.  
  57.  
  58. void delay_50us(uint t)  
  59. {  
  60. uint y;  
  61. for(;t>0;t--)  
  62. for(y=19;y>0;y--);  
  63. }  
  64.  
  65.  
  66.  
  67.  
  68. void write_com(uchar com)  
  69. {  
  70. lcdrs=0;  
  71. lcdrw=0;  
  72. lcden=0;  
  73. P0=com;  
  74. delay_50us(10);  
  75. lcden=1;  
  76. delay_50us(20);  
  77. lcden=0;  
  78. }  
  79.  
  80.  
  81. void write_data(uchar date)  
  82. {  
  83. lcden=0;  
  84. lcdrs=1;  
  85. lcdrw=0;  
  86. P0=date;  
  87. delay_50us(10);  
  88. lcden=1;  
  89. delay_50us(20);  
  90. lcden=0;  
  91. }  
  92.  
  93.  
  94. void init()  
  95. {  
  96. write_com(0x38);  
  97. delay_50us(100);  
  98.         write_com(0x01);  
  99. delay_50us(100);  
  100. write_com(0x06);  
  101. delay_50us(100);  
  102.         write_com(0x0f);  
  103. delay_50us(100);  
  104. }  
  105.  
  106.  
  107. void write_zheng(uchar add,uchar date)  
  108. {  
  109. uchar qian,bai,shi,ge;  
  110. qian=date/1000;  
  111. bai=date00/100;  
  112. shi=date0/10;  
  113. ge=date;  
  114. write_com(0x80+add);  
  115. write_data(0x30+qian);  
  116. write_data(0x30+bai);  
  117. write_data(0x30+shi);  
  118. write_data(0x30+ge);  
  119. }  
  120.  
  121.  
  122. void write_fan(uchar add,uchar date)  
  123. {  
  124. uchar qian,bai,shi,ge;  
  125. qian=date/1000;  
  126. bai=date00/100;  
  127. shi=date0/10;  
  128. ge=date;  
  129. write_com(0x80+0x40+add);  
  130. write_data(0x30+qian);  
  131. write_data(0x30+bai);  
  132. write_data(0x30+shi);  
  133. write_data(0x30+ge);  
  134. }  
  135.  
  136.  
  137.  
  138.  
  139. void main()  
  140. {  
  141.      timer_init();                    //定时器初始化  
  142.      delay_50us(300);                  //液晶初始化前延时一段时间  
  143.      init();                           //液晶初始化   
  144.      write_com(0x80);                  //写地址  
  145.      for(num=0;num<16;num++)           //显示  
  146.      {  
  147.  write_data(table2[num]);  
  148.   delay_50us(100);   
  149.      }  
  150.      write_com(0x80+0x40);  
  151.      for(num=0;num<16;num++)  
  152.      {  
  153.    write_data(table3[num]);  
  154.    delay_50us(100);  
  155.      }  
  156.      write_zheng(12,zheng);            //初始显示零  
  157.      write_fan(12,fan);                //初始显示零  
  158.      en=1;                             //上电后,电机马上启动  
  159.      zx=1;                             //正转  
  160.      zheng++;                          //正转次数加1  
  161.      write_zheng(12,zheng);            //显示修改后,正转次数  
  162.      while(1)  
  163.      {   
  164.         if(gd2==1)                     //碰到光电开关2  
  165.         {  
  166.     zx=0;                      //反转  
  167.             fan++;                     //反转次数加1  
  168.             write_fan(12,fan);         //显示修改后,反转次数  
  169. }  
  170.         if(gd1==1)                     //碰到光电开关1  
  171.         {  
  172.     TR1=0;                     //关定时器1  
  173.             en=0;                      //停止电机转动  
  174.             shijian[j++]=k;            //记录一次时间  
  175.             if(j==51)                  //记录完50次,求平均值  
  176.     {  
  177. avr_time=data_pro();  
  178.             }  
  179.             if(flag==0)                //标志位   
  180.     {  
  181.         k=0;                   //中断数据清0  
  182.         TH1=(65536-50000)/256; //重装定时器初值  
  183.      TL1=(65536-50000)%6;  
  184.      TR1=1;                 //再次启动定时器1  
  185.        zx=1;                  //正转  
  186.      en=1;                  //电机启动  
  187.    zheng++;               //正转次数加1  
  188. write_zheng(12,zheng); //显示修改后,正转次数  
  189.             }  
  190. }  
  191.      if(j>51)                        //记录完50次后,每次都要比较是否超出规定的时间  
  192. {  
  193.              if((k-avr_time)>max_time)//如果大于额定时间  
  194.              {  
  195.                     en=0;                //电机停止转动  
  196.               write_com(0x80+0x40);//液晶显示错误  
  197.               for(num=0;num<16;num++)  
  198.               {  
  199.                 write_data(table4[num]);  
  200.              delay_50us(100);  
  201.               }   
  202.                 }  
  203. }   
  204.     }      
  205. }  
  206.  
  207.  
  208.  
  209.  
  210. void timer0() interrupt 1  
  211. {  
  212.      static uchar i=0;  
  213.      TH0=0xFF;  
  214.      TL0=0x9C;  
  215.      ++i;  
  216.      if (i>10) i=0;  
  217.      if (i<=ZKB)          
  218.         clock=0;  
  219.      else  
  220.         clock=1;      
  221. }  
  222.  
  223.  
  224. void timer1() interrupt 3  
  225. {  
  226. TH1=(65536-50000)/256;  
  227. TL1=(65536-50000)%6;  
  228. k++;    

你可能感兴趣的:(毕业设计,耐用性检测,家具门屉)