×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-09-01 发布时间:
|
#include
#define uint unsigned int
#define uchar unsigned char
#define ZKB 6              //占空比初始值设定
#define max_time 100       //设置超出时间
 
sbit gd1=P1^0;             //光电开关被挡住是高电平,没有被挡住是低电平
sbit gd2=P1^1;             //光电开关被挡住是高电平,没有被挡住是低电平
sbit en=P1^2;              //步进电机使能端,高电平工作,低电平不工作
sbit zx=P1^3;     //高电平步进电机正转,低电平步进电机反转
sbit clock=P1^4;           //步进电机频率端口
sbit lcdrs=P2^3;           //LCD1602端口定义
sbit lcdrw=P2^4;           //LCD1602端口定义
sbit lcden=P2^5;           //LCD1602端口定义
 
uchar k=0;
uchar j=0;
uchar flag=0;                                //标志位
uint  avr_time;     //定义平均时间
uchar num;     //定义液晶显示循环变量
uint zheng=0,fan=0;                          //正反转次数置零
uint shijian[51];                            //定义时间数组
uchar code table2[]="forward:        ";      //LCD1602显示数组
uchar code table3[]="backward:       ";      //LCD1602显示数组
uchar code table4[]="      error!    ";      //LCD1602显示数组
 
void timer_init()
     TMOD=0x11;                 //定时器模式设置
     TH0=0xFF;                  //写入定时器0初始值
     TL0=0x9C;                  
     TH1=(65536-50000)/256;     //写入定时器1初始值
     TL1=(65536-50000)%6;
     ET0=1;                     //允许定时器0中断
     TR0=1;                     //启动定时器0
     ET1=1;                     //允许定时器1中断
     TR1=1;                     //启动定时器1
     EA=1;                      //允许总中断
}
 
uint data_pro(void)
{
     uchar i;
     uint avr=0;
     for(i=1;i<51;i++)
     {
      avr+=shijian[i];
     }     
     avr=avr/50;
     return avr;
}
 
void delay_50us(uint t)
{
uint y;
for(;t>0;t--)
for(y=19;y>0;y--);
}
 
 
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
lcden=0;
P0=com;
delay_50us(10);
lcden=1;
delay_50us(20);
lcden=0;
}
 
void write_data(uchar date)
{
lcden=0;
lcdrs=1;
lcdrw=0;
P0=date;
delay_50us(10);
lcden=1;
delay_50us(20);
lcden=0;
}
 
void init()
{
write_com(0x38);
delay_50us(100);
        write_com(0x01);
delay_50us(100);
write_com(0x06);
delay_50us(100);
        write_com(0x0f);
delay_50us(100);
}
 
void write_zheng(uchar add,uchar date)
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date00/100;
shi=date0/10;
ge=date;
write_com(0x80+add);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
 
void write_fan(uchar add,uchar date)
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date00/100;
shi=date0/10;
ge=date;
write_com(0x80+0x40+add);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
 
 
void main()
{
     timer_init();                     //定时器初始化
     delay_50us(300);                  //液晶初始化前延时一段时间
     init();                           //液晶初始化 
     write_com(0x80);                  //写地址
     for(num=0;num<16;num++)       //显示
     {
 write_data(table2[num]);
 delay_50us(100); 
     }
     write_com(0x80+0x40);
     for(num=0;num<16;num++)
     {
  write_data(table3[num]);
  delay_50us(100);
     }
     write_zheng(12,zheng);            //初始显示零
     write_fan(12,fan);               //初始显示零
     en=1;                             //上电后,电机马上启动
     zx=1;                             //正转
     zheng++;                          //正转次数加1
     write_zheng(12,zheng);            //显示修改后,正转次数
     while(1)
     
        if(gd2==1)                     //碰到光电开关2
        {
   zx=0;                      //反转
            fan++;                     //反转次数加1
            write_fan(12,fan);       //显示修改后,反转次数
}
        if(gd1==1)                     //碰到光电开关1
        {
   TR1=0;                     //关定时器1
            en=0;                      //停止电机转动
            shijian[j++]=k;            //记录一次时间
            if(j==51)                  //记录完50次,求平均值
   {
avr_time=data_pro();
            }
            if(flag==0)                //标志位 
   {
       k=0;                   //中断数据清0
       TH1=(65536-50000)/256; //重装定时器初值
    TL1=(65536-50000)%6;
    TR1=1;                 //再次启动定时器1
      zx=1;                  //正转
    en=1;                  //电机启动
  zheng++;               //正转次数加1
write_zheng(12,zheng); //显示修改后,正转次数
            }
}
    if(j>51)                             //记录完50次后,每次都要比较是否超出规定的时间
{
                if((k-avr_time)>max_time)  //如果大于额定时间
                {
                    en=0;                //电机停止转动
             write_com(0x80+0x40);//液晶显示错误
             for(num=0;num<16;num++)
             {
               write_data(table4[num]);
            delay_50us(100);
             
                }
   }    
}
 
 
void timer0() interrupt 1
{
     static uchar i=0;
     TH0=0xFF;
     TL0=0x9C;
     ++i;
     if (i>10) i=0;
     if (i<=ZKB)        
        clock=0;
     else
        clock=1;    
}
 
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
k++;
}

关键字:51单片机  家具门屉  耐用性  自动检测装置 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址