C51 单片机 7

前面我们用的延时都是非精确延时,我们可以用一种比较精确的方法,单片机自带的定时器中断模块,89C52RC 带2个定时器中断,ET0 和ET1,中断的工作模式有4种,

定时器0为例,定时器0和定时器1是一样的都在TMOD中,

TMOD 中有8位 0000 0000 前4位是定时器1的控制选择 后4位是定时器0的控制选择,

4位中的后2位是模式选择

(1) 模式0 后两位是00 13位计数模式 不需要了解,平时都是用定时器1.

(2) 模式1 后两位是01 16位计数模式最大65535 分位高8位TH0,低八位TL0

(3) 模式2 后两位是10 自动装填模式 主要用在 串行通讯时计算 波特率

(4) 模式3 后两位是11 变成2个最大255的计数器

我们先用模式1 怎么计算定时值呢?

我们用12M举例 单片机有个12分频,也就是晶振动作12次,就是单片机执行一条程序所用的时间 12M=12 000 000 除以12= 1 000 000 这是单片机1秒所能执行的程序条数

那1秒执行1000000次,一条程序需要1秒除以1000000=0.000001秒=1us

我们模式1计数最大65535,再加就是满溢为0, 65533 65534 65535 0 1 2 3

65535按照1us一条最大定时65毫秒=65000微秒如果我们定时1秒怎么定时呢?

我们可以先定时10毫秒就是65536-10000=55536转成16进制等于D8EF

将D8送入 TH0 (T在应用中时间的首字母,H是高的首字母,0是定时器0的意思)

将EF送入 TL0 (T在应用中时间的首字母,L是低级的首字母,0是定时器0的意思)

EA 是所有中断的总开关的意思

ET0是定时器0的开关(不开这个开关,定时器0可以工作,我们就需要时时观察TR0为1还是为0)

TR0 是定时器0开始运行的开关(TR0=1开始工作,=0停止工作,当满溢时自动变0)

我们试试让一个小灯1秒一亮,一秒一熄灭。

#include<reg52.h>

sbit LED=P2^0;

void main( )

{

EA=1; // 开总开关

TMOD=0x01; //让定时器0工作在模式1 16位计数方式

TH0=0xD8; //高8位

TL0=0xEF; / /低8位

ET0=1; //开定时器0的开关

TR0=1; //开始运行定时器0

LED=0; 小灯亮

while (1); //这里我们让循环在这里一直等待,

让定时器0去控制小灯的亮 灭

}

void dingshiqi0() interrupt 1 这里后面的interrupt 1 时定时器0的固定写法

下面解释一下

{

static unsigned char i=0; //static时静态变量的意思 只在这个子程序中运行

TH0=0xD8; // 重新给高字节赋值

TL0=0xEF; //重新给低字节赋值

i++; // i 中数每次加1

if(i>=100) //如果i加到100就是100个10毫秒就是1秒

{

i=0; //让i从0开始

LED=~LED // 每经过1秒 LED转换一次状态,亮 灭

}

}

我们用的变量分为全局变量和静态变量,局部变量,

全局变量是说在所有的子程序都可以用这个变量。公用的物品

局部变量是只有这个函数或者称子程序才可以用,你自己家的洗衣机

不过局部变量执行完这个程序跳到别的程序的时候,再进这个程序局部变量变成初始值,

静态变量=静态局部变量,就是和局部变量一样只有这个程序能用,但是可以保留上一次运行完的值。

咱们的中断是有顺序的,

外部中断0 是第0个中断 优先级最高

定时器0 是第1个中断

外部中断1 是第2个中断

定时器1 是第3个中断

串行通讯中断 是第4个中断

我们用的是定时器0,所以就写成 interrupt 1

单片机C语言编程实现对舵机控制

在智能小车编程过程中,舵机是实现小车避障、循迹的基础。单片机通过控制舵机实现小车的转向。本文主要介绍如何使用51单片机实现对舵机进行偏转角度控制。所使用舵机型号为MG996R,使用芯片为STC89C52。

51单片机开发板

MG996R数字舵机

MG996R是通过PWM脉冲宽度与占空比实现对旋转角度进行控制的。脉冲周期为20ms,输出高电平时间与转动角度之间关系描述如下:

占空比与舵机旋转角度关系图

在明确占空比与舵机输出轴转角之间关系之后,我们就可以以20ms为周期进行信号输出,通过控制每个周期输出高电平与低电平时间,实现舵机按照45度间隔进行旋转,实际小车前轮转向一般会在±45度范围内,因此只需要控制转向角在±45度范围即可实现小车转向。

周期20ms主要借助51单片机定时器1设置在0.5ms产生中断,在中断处理函数中设置高低电平。同时通过变量记录中断执行次数,当次数达到40时即为一个周期20ms。

本例测试使用51单片机开发板,按键K2与K3控制舵机角度增加与减少,其中K2对应P3.4引脚,K3对应P3.5引脚。

本例编程使用keil software工具编写C语言程序,输出hex格式结果,写入单片机。其中keil software工具如下:

keil software软件界面

1、头文件

本例所需头文件主要为reg52.h用于提供52单片机操作相关方法、属性等。头文件格式如下:

2、变量定义

主要定义变量包括按键变量、角度变量、周期计时变量等,变量定义如下:

3、定时器初始化函数

定时器初始化主要完成定时器初始计数值的设置,保证0.5ms产生中断。同时也需要完成定时器的开启。实现代码如下:

4、中断函数

中断函数主要用于处理0.5ms中断时相关操作,主要指高低电平输出。实现代码如下:

5、按键处理函数

按键处理主要处理开发板中K2\\K3按键,实现点击按键舵机角度增减控制。代码如下:

6、主函数

主函数主要设置初始变量值及启动计时器、捕捉按键操作等。实现代码如下:

编写好舵机控制程序之后,执行程序生成hex文件,使用单片机烧录软件将其写入单片机中。烧录软件如下:

烧录软件

完成烧录之后就可以使用单片机K2与K3按键控制舵机转动,后期在小车整体开发中单片机可通过ESP8266 WIFI模块获取服务器端指令,自动控制舵机转动。测试效果如下所示:

视频加载中…

本头条号长期关注编程资讯分享;编程课程、素材、代码分享及编程培训。如果您对以上方面有兴趣或代码错误、建议与意见,可在评论区回复。更多智能小车编程相关后期文章将持续发布,欢迎大家关注、评论与阅读!相关文章链接如下:

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。