学过51单片机的回过头来都会觉得51还是比较简单的,在此我将贴出在我的学习过程中,把对各种外设所进行的操作,封装成函数库的形式,以供新手学习。
注:使用的单片机是stc12c5a60s2,该系列单片机属于加强51,在运行速度上是普通51的8-12倍,有关时序的操作需要加以注意。
注2:使用示例:
void main()
{
unsigned char i;
init_SR04(); //初始化超声波
lcd_init(); //初始化液晶12864
while(1)
{
distance=sonic(); //调用函数获取距离
sprintf(juli, "%dmm", (int)distance); //数据处理为lcd要显示的内容
lcd_pos(0, 0);
i = 0;
lcd_wcmd(0x01); //清屏
while('\0' != juli[i])
lcd_wdat(juli[i++]);
delayms(500); //0.5秒测一次,也可用定时器
}
}
申明:本系列全部例程通过单片机开发板,实验亲测有效!
/* hc-sr04 */
sbit RX=P3^6; //echo 接收端
sbit TX=P3^5; //trig 发送端
void init_SR04(void)
{
RX=1; //置1,作为输入端查询,(51单片机特性,可查阅相关资料
//若输入电平为1则1&1=1,若输入0则0&1=0,
//如果RX=0:则无论引脚输入是1还是0,与原先置为0的RX脚&
//则得到的总是0,也就无法检测后面输入RX的电平)
TX=0;
}
void send() //发送端TRI发送20us高电平
{
TX = 0;
Delay20us();
TX=1;
Delay20us();
TX=0;
}
void Clr_timer() //定时器清零
{
TH0=0;
TL0=0;
TF0=0;
}
unsigned int sonic() //超声波测距
{
unsigned int ceju1,time;
Clr_timer();
Delay20us();
send();
while(!RX); //等待接收端变为高电平
TR0=1; //启动计数
while(RX); //等待接收端变为低电平
TR0=0; //停止计数
if(TF0)
ceju1=9999;
else
{
time=TH0*256+TL0; //得到距离所用时间
ceju1=time*0.172+0.5; //放大10倍,取一位小数,此处已转化为cm单位,
//无需再转换,只是放大了10倍,四舍五入取位小数而已
//计算公式distance=time*344/2/1000000=time*0.0172 单位为cm,若为英尺好像是有个58什么来着来着,忘记了,自己百度吧
}
if(ceju1>5000) //大于5米,超出测距范围,置为无效数据
ceju1=9999;
return ceju1;
}
void Delay20us() //@12.000MHz
{
unsigned char i;
i = 57;
while (--i);
}
这篇博客介绍了作者在学习51单片机过程中,针对HC_SR04超声波模块封装的函数库,旨在帮助新手理解并使用这个模块。博主特别指出,其使用的单片机型号为stc12c5a60s2,性能较强,需要注意时序操作。提供的例程已在实际开发板上测试通过。
5591

被折叠的 条评论
为什么被折叠?



