#include <REGX52.H>
//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5 =P2^7;
sbit D6 =P2^0;
sbit Trig =P1^5;
sbit Echo =P1^6;
sbit sg90_con=P1^2;
sbit SW1=P3^1;
sbit vibrate = P3^2;
sbit beep=P2^5;
int cnt=0; //配置为全局变量
int jd;
int mark_vibate=0;
int jd_back;
void Timer0Init()
{
// 1.配置定时器0工作模式 16位计时
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01;
// 2.给初值,定一个10ms出来
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
// 3.开始计时
TR0=1;
TF0=0;//可有可无,稳妥起见,可以先初始化一下
//4.打开定时器0中断
ET0=1;
//5.打开总中断
EA=1;
}
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init()
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10;
TL1=0;
TH1=0;
//设置定时器0工作模式,初始值设定为0开始数数,不着急启动定时器
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void startHC()
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
double get_distance()
{
double time;
//定时器清零以便下一次计算
TL1=0;
TH1=0;
//1.Trig,给一个10us脉冲信号
startHC();
// 2.由低电平跳转到高电平,表示开始发波
//
while(Echo==0);
//波发出去的那一下,开始启动定时器
TR1=1;
// 3.由高电平跳转到低电平,表示波回来了
while(Echo==1);
//波回来了定时器停止计时
TR1=0;
// 4.计算出中间经过了多少时间
//
time=(TH1*256+TL1)*1.085;//us 单位
// 5.距离=速度(340m/s)*时间
return (time*0.017);
}
void openStatusLight()
{
D5=0;
D6=1;
}
void closeStatusLight()
{
D5=1;
D6=0;
}
void initSG90_0()
{
jd=1;//初始化角度是0度0.5ms高电平
cnt=0;
sg90_con=1;//一开始为高电平
}
void openDusbin()
{
int n;
jd=3;//90度 1.5ms高电平
//舵机开盖
if(jd_back!=jd)
{
cnt=0;
// beep=0;
// beep=1;
Delay2000ms();
}
jd_back=jd;
}
voidcloseDusbin()
{
//舵机开盖
jd=1;//90度 1.5ms高电平
jd_back=jd;
cnt=0;
Delay300ms();
}
void EX0_Init()
{
//打开外部中断
EX0=1;
//低电平触发
IT0=0;
}
void main()
{
double dis;
Timer0Init();
Timer1Init();
EX0_Init();
//舵机的初始位置
initSG90_0();
while(1)
{
//超声波测距
dis=get_distance();
if(dis<10||SW1==0||mark_vibate==1)//距离小于10
{
//灯开
openStatusLight();
openDusbin();
mark_vibate=0;
}
else
{
//灯灭
closeStatusLight();
closeDusbin();
}
}
}
void Timer0Handler() interrupt 1
{
cnt++;//统计爆表次数
//重新给初值
TL0 = 0x33;
TH0 = 0xFE;
if(cnt<jd)
{
sg90_con=1;
}
else
{
sg90_con=0;
}
if(cnt == 40)//爆表了100次,经过了1s
{
cnt=0; //当100次表示1s,重新让cnt从0计算,计算一下次的1s
sg90_con=1;
}
}
void EX0_Handler() interrupt 0
{
mark_vibate=1;
}
做垃圾桶项目需要注意的几点问题:
1.对于两个定时器,定时器0和1初始化错误导致浪费大量时间;
2.主函数中,定时器的初始化,传感器的初始化,一些状态的初始化(IO口高低电平的状态);
3.该项目中能利用模块化编程的思想;
4.代码编写过程中,注意规范问题,避免小失误的出现;
5.编程的思想建立,通过项目学会知识点与传感器的驱动方式。
6.功力尚浅,效率太低,望自己能够加油,继续冲冲冲!!!