微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于51单片机家具门屉耐用性自动检测装置程序设计

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

时间:11-23 来源:互联网 点击:
#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) //如果大于额定时间

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top