📄 csb.c
字号:
#include<reg52.h> //头文件说明
#include<intrins.h>
#include<absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
/***********************************/
uint count; //当前计数值
uint distance;
bit intt=1;
uchar idata buf[1];
unsigned char cont=0;
unsigned char co=0;
/**************针脚定义************/
sbit rect_wave=P1^3; //晶振控制信号
sbit d=P1^0;
sbit clk=P1^1;
sbit dir=P1^2;
/**************函数声明************/
void l_delay(unsigned int t); //长延时
void ret(void); //初始化系统
void retcont(void); //定时器复位子程序
void send(uchar idata *d); //串口发送子程序
void init(void); //串口初始化子程序
void Delay400Ms(void);
void turn (void); //电机转动子程序
/**************子程序**********************/
void int_0 () interrupt 0 //中断0服务程序
{
EX0=0; //关闭中断
TR0=0; //关闭定时器
TF0=0; //标志位清零
rect_wave=0; //停止发送超声波
intt=0;
}
/********************************************/
void int_t0 () interrupt 1
{
count++;
distance=count;
}
//*********************//
void init(void)
{ TMOD=0x22;
TH1=0xf3;
TL1=0xf3;
PCON=0x80;
TR1=1;
SCON=0x50; /*串口初始化设置,波特率4800BPS*/
}
/**********************************/
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//*******************************//
void send(uchar idata *d) /*发送子程序*/
{ uchar i;
for(i=0;i<1;i++){ /*发送一个数据*/
SBUF=d[i];
while(TI==0);
TI=0;
}
}
//**************************//
void turn (void) //电机转动控制
{
unsigned char x;
cont++;
clk=~clk;
Delay400Ms();
clk=~clk;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
if (cont == 200) //判断是否进行反转复位
{dir=~dir;
cont=0;
for(x=0;x < 200;x++)
{clk=~clk;
l_delay(10);
clk=~clk;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
}
dir=~dir;
cont=0;
}
}
//**********************************//
void l_delay(unsigned int t) //延时
{
unsigned int p;
unsigned int j;
for(j=0;j<t;j++)
{
for(p=0;p<1000;p++);
}
}
/*************************************/
void ret(void) //初始化计数器
{
TH0=0xc6; //设置计数初值高字节
TL0=0xc6; //设置计数初值低字节
count=0;
IE=0x00; //禁止中断
TF0=0; //溢出标志位清零
TR0=1; //打开定时器1
rect_wave=1;
EA=1; //打开中断
ET0=1;
IP=0x01; //外部中断0为高中断优先级
IT0=0; //外部中断低电平触发シ?
EX0=1;
}
/*************************************/
void retcont(void)
{
TF0=0; //溢出标志位清零
EX0=1;
count=0;
TR0=1; //打开定时器1
rect_wave=1;
}
/**************主程序************/
void main(void)
{
rect_wave=0; //关闭超声波发送
init(); //串口初始化
ret(); //定时器初始化
while(1)
{
if(!intt)
{
intt=1;
if (distance > 250) //进行字节限制
distance=0;
buf[0]=(uchar)distance;
send(buf); //发送数据
turn(); //电机转动
Delay400Ms(); //延时
retcont(); //定时器复位
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -