求助。。不知道哪里有问题了。用了外部中断里潜逃了定时器中断,超声波避障小车。
时间:10-02
整理:3721RD
点击:
#include<STC12C5616AD.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit echo=P3^2;
sbit trig=P2^3;
unsigned char s,time;
void PWM_zk0(float zk) //高电 平占得比例占空比为(Gao/255)
{
CCAP0H = CCAP0L =255*(100.0 - zk)/100.0;
CCAPM0 = 0x42;
CR=1;
}
void PWM_zk1(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP1H = CCAP1L = 255*(100.0 - zk)/100.0;
CCAPM1 = 0x42;
CR=1;
}
void PWM_zk2(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP2H = CCAP2L = 255*(100.0 - zk)/100.0;
CCAPM2 = 0x42;
CR=1;
}
void PWM_zk3(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP3H = CCAP3L = 255*(100.0 - zk)/100.0;
CCAPM3 = 0x42;
CR=1;
}
void go() //前进
{
PWM_zk0(0);
PWM_zk1(90.0);
PWM_zk2(0);
PWM_zk3(90.0);
}
void stop()
{
PWM_zk0(0);
PWM_zk1(0);
PWM_zk2(0);
PWM_zk3(0);
}
void init() //初始化
{
CCON=0;
CL = 0;
CH = 0;
CMOD = 0x02;
CR = 1;
}
void delay1ms()//@11.0592MHz 延时1ms //延时
{
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
}
while (--i);
}
void StartModule(void) //启动模块
{
trig=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
}
void count() //计算
{
time=256*TH0+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100;
}
void main()
{
init();
TMOD=0x01;//模式控制器的选择,选择只有定时器16位
TH0=0; //赋初值
TL0=0;
ET0=1; //允许定时器0中断
EX0=1;
IT0=1; //跳变沿
EA=1; //总中断开启
while(1)
{
// go();
StartModule(); //超声波的发射检测
while(echo==0) //当接收到返回的信号
TR0=1; //打开定时中断 ,开始计时
while(echo==1) //没有接收到
{
TR0=0;
go(); //不开启定时器中断
}
count();
if(s<30)
stop();
if(s>=30)
go();
}
}
void into() interrupt 0 //外部中断
{
}
void timer() interrupt 1 //定时器0的中断
{
}
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit echo=P3^2;
sbit trig=P2^3;
unsigned char s,time;
void PWM_zk0(float zk) //高电 平占得比例占空比为(Gao/255)
{
CCAP0H = CCAP0L =255*(100.0 - zk)/100.0;
CCAPM0 = 0x42;
CR=1;
}
void PWM_zk1(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP1H = CCAP1L = 255*(100.0 - zk)/100.0;
CCAPM1 = 0x42;
CR=1;
}
void PWM_zk2(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP2H = CCAP2L = 255*(100.0 - zk)/100.0;
CCAPM2 = 0x42;
CR=1;
}
void PWM_zk3(float zk) //高电平占得比例占空比为(Gao/255)
{
CCAP3H = CCAP3L = 255*(100.0 - zk)/100.0;
CCAPM3 = 0x42;
CR=1;
}
void go() //前进
{
PWM_zk0(0);
PWM_zk1(90.0);
PWM_zk2(0);
PWM_zk3(90.0);
}
void stop()
{
PWM_zk0(0);
PWM_zk1(0);
PWM_zk2(0);
PWM_zk3(0);
}
void init() //初始化
{
CCON=0;
CL = 0;
CH = 0;
CMOD = 0x02;
CR = 1;
}
void delay1ms()//@11.0592MHz 延时1ms //延时
{
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
}
while (--i);
}
void StartModule(void) //启动模块
{
trig=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
}
void count() //计算
{
time=256*TH0+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100;
}
void main()
{
init();
TMOD=0x01;//模式控制器的选择,选择只有定时器16位
TH0=0; //赋初值
TL0=0;
ET0=1; //允许定时器0中断
EX0=1;
IT0=1; //跳变沿
EA=1; //总中断开启
while(1)
{
// go();
StartModule(); //超声波的发射检测
while(echo==0) //当接收到返回的信号
TR0=1; //打开定时中断 ,开始计时
while(echo==1) //没有接收到
{
TR0=0;
go(); //不开启定时器中断
}
count();
if(s<30)
stop();
if(s>=30)
go();
}
}
void into() interrupt 0 //外部中断
{
}
void timer() interrupt 1 //定时器0的中断
{
}