1、stc89C52单片机简单使用
1、编程软件keil 5; 烧录软件 stc-isp
2、一个简单的流水灯程序:
#include<reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
/* 函数申明 -----------------------------------------------*/
void delay(uint z);
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main()
{
uchar num,dat1,dat2;
delay(500);
P0=0;
while(1)
{
dat1=0xfe;
for(num=0;num<7;num++)
{
P1=dat1; //初始化赋值
dat1=dat1<<1; //右移一位
delay(500); //延时
}
}
}
/*
********************************************************************************
** 函数名称 : delay(uint z)
** 函数功能 : 延时函数
********************************************************************************
*/
void delay(uint z)
{
uchar j;
for(z;z>0;z--)
for(j=200;j>0;j--);
}
3、步进电机控制
通过 51 单片机可以方便地对其进行控制。下面将从硬件连接、驱动原理、代码实现等方面详细介绍如何使用 51 单片机控制 28BYJ - 48 步进电机。
硬件连接
控制上:单片机-》ULN2003 驱动板》步进电机
- 电源连接:
- 将 28BYJ - 48 步进电机的电源正极(红线)连接到 ULN2003 驱动板的电源正极,电源负极(橙线)连接到驱动板的电源负极。
- 给驱动板提供合适的电源,一般使用 5V 电源,可将电源正极连接到 51 单片机的 VCC,负极连接到 GND。
- 信号连接:
- 28BYJ - 48 步进电机有 4 根信号线(黄、粉、蓝、紫),分别连接到 ULN2003 驱动板的 IN1 - IN4 引脚。
- 将驱动板的 IN1 - IN4 引脚分别连接到 51 单片机的 4 个 I/O 引脚,例如 P1.0 - P1.3。
驱动原理
28BYJ - 48 步进电机采用单极性 5 线 4 相驱动方式,通过按一定顺序给 4 相绕组通电,可以使电机转动。常见的驱动方式有单四拍、双四拍和八拍,其中八拍驱动方式的精度较高,下面是八拍驱动的通电顺序:
节拍 | IN1 (P1.0) | IN2 (P1.1) | IN3 (P1.2) | IN4 (P1.3) |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 |
3 | 0 | 1 | 0 | 0 |
4 | 0 | 1 | 1 | 0 |
5 | 0 | 0 | 1 | 0 |
6 | 0 | 0 | 1 | 1 |
7 | 0 | 0 | 0 | 1 |
8 | 1 | 0 | 0 | 1 |
#include <reg52.h>
// 定义步进电机控制引脚
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
// 八拍驱动序列
unsigned char code StepTable[8] = {
0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09
};
// 延时函数
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 123; j++);
}
// 步进电机正转函数
void motor_forward(unsigned int steps) {
unsigned int i, j;
for(i = 0; i < steps; i++) {
for(j = 0; j < 8; j++) {
P1 = StepTable[j];
delay(5); // 调整延时时间可以改变电机转速
}
}
}
// 步进电机反转函数
void motor_backward(unsigned int steps) {
unsigned int i, j;
for(i = 0; i < steps; i++) {
for(j = 7; j >= 0; j--) {
P1 = StepTable[j];
delay(5); // 调整延时时间可以改变电机转速
}
}
}
void main() {
while(1) {
// 正转 512 步
motor_forward(512);
delay(1000); // 延时 1 秒
// 反转 512 步
// motor_backward(512);
// delay(1000); // 延时 1 秒
}
}
4、超声波检测
使用 51 单片机连接超声波传感器(以常见的 HC - SR04 为例)可以实现距离测量等功能。下面将从硬件连接、工作原理、代码实现等方面详细介绍如何完成连接与功能实现。
硬件连接
HC - SR04 超声波传感器有 4 个引脚,分别为 VCC(电源正极)、GND(电源负极)、Trig(触发信号输入)和 Echo(回响信号输出)。与 51 单片机的连接方式如下:
- 电源连接:
- 将 HC - SR04 的 VCC 引脚连接到 51 单片机的 VCC(+5V),为传感器提供电源。
- 将 GND 引脚连接到 51 单片机的 GND,形成电源回路。
- 信号连接:
- 将 Trig 引脚连接到 51 单片机的一个普通 I/O 引脚,例如 P36,用于向传感器发送触发信号。
- 将 Echo 引脚连接到 51 单片机的另一个普通 I/O 引脚,例如 P37,用于接收传感器返回的回响信号。
工作原理
HC - SR04 超声波传感器的工作原理是通过发射超声波并测量其从发射到遇到障碍物反射回来的时间,再根据声速计算出与障碍物之间的距离。具体步骤如下:
- 单片机向 Trig 引脚发送一个至少 10μs 的高电平脉冲,触发传感器发射超声波。
- 传感器发射超声波后,Echo 引脚会变为高电平,并开始计时。
- 当超声波遇到障碍物反射回来被传感器接收到时,Echo 引脚变为低电平,计时结束。
- 根据 Echo 引脚高电平的持续时间 t,利用公式 d=v×t/2(其中 v 为声速,常温下约为 340m/s)计算出与障碍物之间的距离 d。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 定义 Trig 和 Echo 引脚
sbit Trig = P3^6;
sbit Echo = P3^7;
void delay(uint z)
{
uchar j;
for(z;z>0;z--)
for(j=2;j>0;j--);
}
// 测量距离函数
float measure_distance() {
unsigned int time;
float distance;
// 发送至少 10μs 的高电平脉冲
Trig = 0;
Trig = 1;
delay(10);
Trig = 0;
// 等待 Echo 引脚变为高电平
while(Echo == 0);
// 开启定时器 0 开始计时
TH0 = 0;
TL0 = 0;
TR0 = 1;
// 等待 Echo 引脚变为低电平
while(Echo == 1);
// 关闭定时器 0 停止计时
TR0 = 0;
// 获取定时器 0 的计数值
time = TH0 * 256 + TL0;
// 根据计数值计算距离
distance = (float)time * 0.017; // 声速 340m/s,转换为 cm/μs 为 0.034,再除以 2
return distance;
}
void main() {
float distance;
// 初始化定时器 0
TMOD = 0x01; // 定时器 0 工作在模式 1
while(1) {
// 测量距离
distance = measure_distance();
// 这里可以添加将距离值显示在数码管或通过串口发送出去的代码
// distance == 100时, 经测试89C52单片机上大概30厘米距离
if(distance >100)
P1 = 0x77;
else
{
P1 = 0x11;
}
// 延时一段时间后再次测量
delay(10000);
}
}