📄 overv_test3.c
字号:
#include <reg52.h> //包含文件
/********************************************************************/
/* 寄存器定义,位定义 */
/********************************************************************/
sfr WDT_COUNTER=0xE1; //看门狗寄存器
sfr CCON=0xD8; //PCA模块控制寄存器
sfr CMOD=0xD9; //PCA模块模式寄存器
sfr CL=0xE9; //
sfr CH=0xF9; //PCA模块计数寄存器
sfr CCAP0L=0xEA; //
sfr CCAP0H=0xFA; //PCA模块0初值
sfr CCAP1L=0xEB; //
sfr CCAP1H=0xFB; //PCA模块1初值
sfr CCAPM0=0xDA; //PCA模块0相应设置
sfr CCAPM1=0xDB; //PCA模块1相应设置
//sfr IP=0xB8;
sfr IPH=0xB7;
sbit CR=CCON^6; //PCA模块控制位
sbit csb=P1^5; //超声波控制
sbit test=P1^7;
sbit CCF1=CCON^1; //PCA模块1溢出标志位
sbit CCF0=CCON^0;
sbit EPCA_LVD=IE^6;
/********************************************************************/
/* 相关变量初始化 */
/********************************************************************/
#define uchar unsigned char
#define uint unsigned int
int count=0; //计数
int count2=0;
char t0_f=0;
uchar count_1s=0;
int csb_p=0;
float jl=0,jl2=0,jl3=0;
//float jl2=0;
char *buffer; //类型转换数组
uchar datan,i,d[20]; //接收数绝数目,接收数据字符数组
/********************************************************************/
/* 函数定义 */
/********************************************************************/
void pwm_init(void) //pwm初始化程序声明
{
CMOD=0x81;
CCON=0x00;
CL=0;
CH=0;
CCAP0L=0x00;
CCAP0H=0xB4; //定时50ms
CCAPM0=0x49;
EPCA_LVD=1;
//CR=1;
}
void intt0(void) interrupt 0 using 0 //外中断0中断处理程序
{
//IE0=0;
EX0=0;
TR0=0;
t0_f=0;
jl3=(TH0*256+TL0);
if(jl3>=500)
{
jl=(TH0*256+TL0)*17.0*0.001*12.0/11.0592;
jl2=(TH0*256+TL0);
}
}
void pwm0(void) interrupt 6 using 2 //50ms定时中断_PWM0
{
CR=0;
//P1^7 = ~P1^7;
//test=~test;
CCF0=0;
count_1s++;
if(count_1s>=41)
{
count_1s=0;
TI=1;
}
CL=0;
CH=0;
CCAP0L=0x00;
CCAP0H=0xB4;
CR=1;
}
void timer0(void) interrupt 1 using 1 //定时器0中断处理程序
{ //距离测量溢出
EX0=0;
t0_f=0;
TF0=0;
TR0=0;
jl2=0;
jl=0;
//test=!test;
}
void serial(void) interrupt 4 using 2 //串口中断(发送、接收)
{
if(RI) //接收数据中断
{
datan=SBUF; //传输数据个数,单位为位
RI=0; //清接收中断标志
for(i=0;i<datan;i++)
{
while(!RI) ;
RI=0;
d[i]=SBUF;
} //接收数据存储
TI=1; //置TI=1,进发送中断
}
else if(TI) //发送中断
{
TI=0;
//jl=1001.012; buffer=(char*)&jl; //浮点数转换为字符型数据
buffer=(char*)&jl2;
d[5]=buffer[0];
d[6]=buffer[1];
d[7]=buffer[2];
d[8]=buffer[3];
buffer=(char*)&jl; //浮点数转换为字符型数据
d[9]=buffer[0];
d[10]=buffer[1];
d[11]=buffer[2];
d[12]=buffer[3];
for(i=0;i<datan;i++)
{
SBUF=d[i];
while(!TI);
TI=0; //将接收数据发送回上位机
}
}
else
{;}
}
void ct_init(void) //中断初始化(串口、定时器)
{
PCON=0x00; //波特率不加倍
SCON=0x50; //选择串口工作方式1
TMOD=0x21; //定时器1工作方式2(8位自动重装)
//定时器0工作方式1(16位定时器)
IT0=1; //外中断0(脉冲计数)工作在脉冲方式
TH1=0xFD;
TL1=0xFD; //定时器1初值
TH0=0x00;
TL0=0x00; //计数器0计数初值(10ms)
TR1=1; //开启定时器1(串口)
//TR0=1; //开启定时器0
//ET0=1; //定时器0中断允许
EX0=0; //外部中断0中断允许
ES=1; //串口中断允许
EA=1; //总中断允许
}
/********************************************************************/
/* 主程序 */
/********************************************************************/
void main(void)
{
IPH=0x03;
IP=0x02; //串口最高,其次超声波发送,再是接收,最后1s定时
csb=0; //初始化超声波无输出
ct_init();
pwm_init();
CR=1;
EX0=0;
ET0=1;
t0_f=1;
EX0=0;
ET0=1;
TR0=0;
TH0=0x00;
TL0=0x00;
while(1)
{
EX0=0;
TR0=0;
csb=0;
TH0=0x00;
TL0=0x00;
count=100;
while(--count);
csb=1;
TR0=1;
count=25;
while(--count);
csb=0;
count=100; //100效果不错
//450时延时600us以上
while(--count);
t0_f=1;
EX0=1;
while(t0_f);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -