51单片机小车程序,按下按键功能实现不灵敏
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint time=0;
uint timer=0;
float S=0;
sbit RX=P1^0; //接收端
sbit TX=P1^1; //发送端
sbit jia=P3^6; //角度增加按键检测IO口
sbit jan=P3^7; //角度减少按键检测IO口
sbit jias=P3^3; //角度增加按键检测IO口
sbit jans=P3^4; //角度减少按键检测IO口
uchar jd; //角度标识
uchar jds=0;
uchar count;
sbit pwm=P1^6;
sbit pwm1=P1^2; //PWM信号输出
sbit pwm2=P1^3;
sbit pwm3=P1^4;
sbit pwm4=P1^5;
bit flag=0;
void counts()
{
time=TH1*256+TL1; //TH0是计数器0的高八位,TL0是计数器0的低八位,
//这个公式就是把高八位向左移八位加上低八位组成一个16的数值,也就是计数值,在赋值给tim
TH1=0;
TL1=0;
S=(time*1.87)/100; //时钟周期位T0=11.0592M,机器周期为T1=1/11.0592*12us=1.08us定时器计时time1,
//实际为t=time1*1.08,此为声波往返时间,距离要除以2,取声速346m/s,
//S=v*t=346*time*T1/2/1000000m'=1.868*time1/100cm得S约等于time1*1.87/100cm
if(S<5)
jds=0;
}
void delay0(uint i)
{
while(i--);
}
void keyscan0() //按键扫描
{
if(jias==0) //角度增加按键是否按下
{
delay0(10); //按下延时,消抖
if(jias==0) //确实按下
{
jds=jds+10;
if(jds>200)
jds=200;
while(jias==0); //等待按键放开
}
}
if(jans==0) //角度减小按键是否按下
{
delay0(10);
if(jans==0)
{
jds=jds-10;
if(jds<10)
jds=0; //已经是0度,则保持
while(jans==0);
}
}
}
void keyscan() //按键扫描
{
if(jia==0) //角度增加按键是否按下
{
delay0(10); //按下延时,消抖
if(jia==0) //确实按下
{
jd++; //角度标识加1
count=0; //按键按下 则20ms周期从新开始
if(jd==26)
jd=25; //已经是180度,则保持
while(jia==0); //等待按键放开
}
}
if(jan==0) //角度减小按键是否按下
{
delay0(10);
if(jan==0)
{
jd--; //角度标识减1
count=0;
if(jd==4)
jd=5; //已经是0度,则保持
while(jan==0);
}
}
}
void delay(uint i)
{
while(i--)
{
if(jia==0||jan==0)
keyscan();
if(jias==0||jans==0)
keyscan0();
}
}
void StartModule() //延时,超声波模块Trig控制端给大于10us的高电平触发模块测距
{ //模块就会自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
//操作简单方便;假如有信号返回,超声波模块就会通过 IO(Echo(接收端)) 输出一高电平,
//高电平持续的时间就是超声波从发射到返回的时间.那么测试距离=(高电平时间*声速(340M/S))/2;
TX=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void main()
{
TMOD=0x11;
TH1=0;
TL1=0;
TH0=(65536-92)/256;
TL0=(65536-92)%256; //11.0592MZ晶振,0.1ms
ET0=1;
ET1=1;
TR0=1;
EA=1;
while(1)
{
StartModule();
while(!RX);
TR1=1; //开定时器位 (Echo(接收端)高电平持续的时间就是超声波从发射到返回的时间.
//所以等待高电平的时间,就是定时器计时的时间。(while(RX));在等待然后关闭定时器,通过算法就能计数了。
while(RX);
TR1=0; //关定时器
counts(); //计数
delay(65535);
keyscan(); //按键扫描
keyscan0();
}
}
void Time0_Int() interrupt 1 //中断程序
{
TH0 = (65536-92)/256; //重新赋值
TL0 = (65536-92)%256;
if(count< jd) //判断0.1ms次数是否小于角度标识
pwm=1; //确实小于,PWM输出高电平
else
pwm=0; //大于则输出低电平
if(count<jds)
{
pwm1=1;
pwm2=0;
pwm3=1;
pwm4=0;
}
else
{
pwm1=0;
pwm2=0;
pwm3=0;
pwm4=0;
}
count++; //0.1ms次数加1
if(count==200)
count=0; //次数始终保持为200 即保持周期为20ms
}
|