当前位置: 首页 > news >正文

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)
11000
21100
30100
40110
50010
60011
70001
81001

#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 超声波传感器的工作原理是通过发射超声波并测量其从发射到遇到障碍物反射回来的时间,再根据声速计算出与障碍物之间的距离。具体步骤如下:

  1. 单片机向 Trig 引脚发送一个至少 10μs 的高电平脉冲,触发传感器发射超声波。
  2. 传感器发射超声波后,Echo 引脚会变为高电平,并开始计时。
  3. 当超声波遇到障碍物反射回来被传感器接收到时,Echo 引脚变为低电平,计时结束。
  4. 根据 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);
    }
}

相关文章:

  • Linux基础操作
  • 每周一个网络安全相关工具——MetaSpLoit
  • 使用阿里云操作系统控制台排查内存溢出
  • 聊一聊 Android 的消息机制
  • 【蓝桥杯集训·每日一题2025】 AcWing 5540. 最大限度地提高生产力 python
  • kafka单机部署实战
  • laravel es 相关代码 ElasticSearch
  • UE4 World, Level, LevelStreaming从入门到深入
  • 【C++】vector(下):vector类的模拟实现(含迭代器失效问题)
  • OpenCV连续数字识别—可运行验证
  • Codeforces Round 973 (Div. 2) F. The Sum of the k-th Powers 数论、暴力
  • 前端杂的学习笔记
  • Java之IO流
  • winform基于antdui中table控件的使用
  • System Enginner系统工程师成长思考
  • 爬虫相关的零碎知识
  • Android Activity的启动器ActivityStarter入口
  • 力扣刷题167. 两数之和 II - 输入有序数组
  • 游戏引擎学习第147天
  • sanitizer和valgrind
  • 做ppt的网站叫什么/seo网站诊断价格
  • 手机网站设计公司立找亿企邦/网页设计案例
  • 重庆网站建设公司有哪些内容/百度快照如何优化
  • 青海网站制作的公司/东莞做网站排名优化推广
  • 管局备案网站/免费软文发布平台
  • 网站开发公司交易流程/b站推广渠道