51单片机嵌入式开发:2、STC89C52操作GPIO口LED灯

STC89C52操作GPIO口LED灯

  • 1 芯片介绍
    • 1.1 芯片类型
    • 1.2 芯片系列说明
  • 2 GPIO引脚寄存器说明
  • 3 GPIO操作
    • 3.1 GPIO输入
    • 3.2 GPIO输出
    • 3.3 GPIO流水灯
    • 3.4 Protues仿真
  • 4 总结


1 芯片介绍

1.1 芯片类型

芯片采用宏晶科技品牌下的STC89C52RC单片机
选择STC89C52RC系列STC89C58RD+系列单片机的理由:
★加密性强
★超强抗干扰:
1、高抗静电(ESD保护)
2、轻松过 2KV/4KV 快速脉冲干扰(EFT 测试)
3、宽电压,不怕电源抖动
4、宽温度范围,-40℃℃~85℃℃
★三大降低单片机时钟对外部电磁辐射的措施:–出口欧美的有力保证
1、禁止ALE 输出;
2如选6时钟/机器周期,外部时钟频率可降一半;3、单片机时钟振荡器增益可设为 1/2gain。
★超低功耗:
1 、掉电模式:典型功耗<0.1 μA2、正常工作模式:典型功耗4MA - 7MA3、掉电模式可由外部中断唤醒,适用于电池供电系统,如水表、气表、便携设备等。
★在系统可编程,无需编程器,无需仿真器
★可送STC-ISP下载编程器,1万片/人/天
★可供应内部集成MAX810专用复位电路的单片机只有D 版本才有内部集成专用复位电路,原复位电路可以保留,也可以不用,不用时RESET脚接1K电阻到地

1.2 芯片系列说明

在这里插入图片描述

STC89C52RC芯片最高工作时钟频率为80M,flash内存有8K大小,RAM空间512字节,足以满足日常学习课单一功能的实现应用。

在这里插入图片描述

STC89C52RC/RD+ 系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,最新的D版本内部集成 MAX810 专用复位电路。
特点:
1.增强型6时钟/机器周期,12时钟/机器周期 8051 CPU
2.工作电压:5.5V-3.4V(5V单片机) / 3.8V - 2.0V(3V 单片机)3.工作频率范围:0-40 MHz,相当于普通8051的 0~80MHz.实际工作频率可达 48MHz.4.用户应用程序空间4K/8K/13K/16K/20K/32K/64K 字节
5.片上集成 1280 字节 /512字节 RAM
6.通用1/0口(32/36个),复位后为: P1/P2/P3/P4是准双向口上拉(普通8051传统 1/0 口)P0 口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为1/0口用时,需加上拉电阻。7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器可通过串口(P3.0/P3.1)直接下载用户程序,8K程序3秒即可完成一片
8.EEPROM 功能
9.看门狗
10.内部集成MAX810 专用复位电路(D 版本才有),外部晶体20M 以下时,可省外部复位电路11.共3个16 位定时器/计数器,其中定时器0还可以当成2个8位定时器使用12.外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒13.通用异步串行口(UART),还可用定时器软件实现多个 UART
14.工作温度范围:0-75℃℃/-40-+85℃℃
15.封装: LOFP-44,PDIP-40,PLCC-44,POFP-44,如选择STC89 系列,请优先选择LOFP-44 封装

在这里插入图片描述

2 GPIO引脚寄存器说明

手册说明:通用1/0口(32/36个),复位后为: P1/P2/P3/P4是准双向口上拉(普通8051传统1/0口)P0 口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为1/0口用时,需加上拉电阻。
查看芯片的寄存器寻址框图,GPIO寄存器位置在80h、90h、A0h、B0h、E8h.
寄存器分别为P0/P1/P2/P3/P4,没有其他特殊的类似于高级芯片的方向控制上下拉控制寄存器等,操作简单易用。
在这里插入图片描述
在这里插入图片描述

3 GPIO操作

结合第一章节将工程重新整理
(1)切换使用keil5版本,根据第节说明的,将STC的的芯片包重新安装到KEIL5安装目录下即可,并按照同样的方式创建工程。

在这里插入图片描述

(2)工程架构整理,为了使工程看起来具有较高的可读性,我将led控制的gpio程序独立到c51_gpio.c,并建立c51_gpio.h,用于声明c51_gpio.c创建的函数和变量,创建includes.h用于引用所有的头文件和部分系统函数及变量。

在这里插入图片描述

C51_gpio.c

#include "includes.h"void sys_led(void)
{}/********************************************************
函数名称:sys_led_test
函数功能:IO口高低电平控制
入口参数:
出口参数:
修    改:
内    容:现在实现D0/D2/D4/D6指示灯亮起,D1/D3/D5/D7指示灯灭掉,并演示
********************************************************/
void sys_led_test(void)
{P1 = 0xFF;		//P1口全部为高电平,对应的LED灯全灭掉,ff换算成二进制是 1111 1111P1 = 0x00;		//P1口全部为低电平,对应的LED灯全亮起,ff换算成二进制是 0000 0000P1 = 0x55;		//D0/D2/D4/D6指示灯亮起//D1/D3/D5/D7指示灯灭掉,AA换算成二进制是 1010 1010 
}

C51_gpio.h

#ifndef __C51_GPIO_H__
#define __C51_GPIO_H__extern void sys_led(void);
extern void sys_led_test(void);#endifincludes.h#ifndef __INCLUDES_H__
#define __INCLUDES_H__//#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"//应用层头文件
#include "c51_gpio.h"#endif

(3)根据串口助手提示更新芯片头文件放置工程的include文件夹中

在这里插入图片描述

我创建的名称为STC89C5xRC_RDP.h,并在includes.h中引用,屏蔽//#include<reg52.h>

#ifndef __STC89C5xRC_RDP_H__
#define __STC89C5xRC_RDP_H__///包含本头文件后,不用另外再包含"REG51.H"sfr         P0          =           0x80;sbit    P00         =           P0^0;sbit    P01         =           P0^1;sbit    P02         =           P0^2;sbit    P03         =           P0^3;sbit    P04         =           P0^4;sbit    P05         =           P0^5;sbit    P06         =           P0^6;sbit    P07         =           P0^7;sfr         SP          =           0x81;
sfr         DPL         =           0x82;
sfr         DPH         =           0x83;
sfr         PCON        =           0x87;sfr         TCON        =           0x88;sbit    TF1         =           TCON^7;sbit    TR1         =           TCON^6;sbit    TF0         =           TCON^5;sbit    TR0         =           TCON^4;sbit    IE1         =           TCON^3;sbit    IT1         =           TCON^2;sbit    IE0         =           TCON^1;sbit    IT0         =           TCON^0;sfr         TMOD        =           0x89;
sfr         TL0         =           0x8A;
sfr         TL1         =           0x8B;
sfr         TH0         =           0x8C;
sfr         TH1         =           0x8D;
sfr         AUXR        =           0x8E;sfr         P1          =           0x90;sbit    P10         =           P1^0;sbit    P11         =           P1^1;sbit    P12         =           P1^2;sbit    P13         =           P1^3;sbit    P14         =           P1^4;sbit    P15         =           P1^5;sbit    P16         =           P1^6;sbit    P17         =           P1^7;sbit    T2EX        =           P1^1;sbit    T2          =           P1^0;sfr         SCON        =           0x98;sbit    SM0         =           SCON^7;sbit    SM1         =           SCON^6;sbit    SM2         =           SCON^5;sbit    REN         =           SCON^4;sbit    TB8         =           SCON^3;sbit    RB8         =           SCON^2;sbit    TI          =           SCON^1;sbit    RI          =           SCON^0;sfr         SBUF        =           0x99;sfr         P2          =           0xA0;sbit    P20         =           P2^0;sbit    P21         =           P2^1;sbit    P22         =           P2^2;sbit    P23         =           P2^3;sbit    P24         =           P2^4;sbit    P25         =           P2^5;sbit    P26         =           P2^6;sbit    P27         =           P2^7;sfr         AUXR1       =           0xA2;sfr         IE          =           0xA8;sbit    EA          =           IE^7;sbit    EC          =           IE^6;sbit    ET2         =           IE^5;sbit    ES          =           IE^4;sbit    ET1         =           IE^3;sbit    EX1         =           IE^2;sbit    ET0         =           IE^1;sbit    EX0         =           IE^0;sfr         SADDR       =           0xA9;sfr         P3          =           0xB0;sbit    P30         =           P3^0;sbit    P31         =           P3^1;sbit    P32         =           P3^2;sbit    P33         =           P3^3;sbit    P34         =           P3^4;sbit    P35         =           P3^5;sbit    P36         =           P3^6;sbit    P37         =           P3^7;sbit    RD          =           P3^7;sbit    WR          =           P3^6;sbit    T1          =           P3^5;sbit    T0          =           P3^4;sbit    INT1        =           P3^3;sbit    INT0        =           P3^2;sbit    TXD         =           P3^1;sbit    RXD         =           P3^0;sfr         IPH         =           0xB7;
sfr         IP          =           0xB8;sbit    PT2         =           IP^5;sbit    PS          =           IP^4;sbit    PT1         =           IP^3;sbit    PX1         =           IP^2;sbit    PT0         =           IP^1;sbit    PX0         =           IP^0;sfr         SADEN       =           0xB9;sfr         XICON       =           0xC0;sbit    PX3         =           XICON^7;sbit    EX3         =           XICON^6;sbit    IE3         =           XICON^5;sbit    IT3         =           XICON^4;sbit    PX2         =           XICON^3;sbit    EX2         =           XICON^2;sbit    IE2         =           XICON^1;sbit    IT2         =           XICON^0;sfr         T2CON       =           0xC8;sbit    TF2         =           T2CON^7;sbit    EXF2        =           T2CON^6;sbit    RCLK        =           T2CON^5;sbit    TCLK        =           T2CON^4;sbit    EXEN2       =           T2CON^3;sbit    TR2         =           T2CON^2;sbit    C_T2        =           T2CON^1;sbit    CP_RL2      =           T2CON^0;sfr         T2MOD       =           0xC9;
sfr         RCAP2L      =           0xCA;
sfr         RCAP2H      =           0xCB;
sfr         TL2         =           0xCC;
sfr         TH2         =           0xCD;sfr         PSW         =           0xD0;sbit    CY          =           PSW^7;sbit    AC          =           PSW^6;sbit    F0          =           PSW^5;sbit    RS1         =           PSW^4;sbit    RS0         =           PSW^3;sbit    OV          =           PSW^2;sbit    F1          =           PSW^1;sbit    P           =           PSW^0;sfr         ACC         =           0xE0;sfr         WDT_CONTR   =           0xE1;
sfr         ISP_DATA    =           0xE2;
sfr         ISP_ADDRH   =           0xE3;
sfr         ISP_ADDRL   =           0xE4;
sfr         ISP_CMD     =           0xE5;
sfr         ISP_TRIG    =           0xE6;
sfr         ISP_CONTR   =           0xE7;sfr         P4          =           0xE8;sbit    P40         =           P4^0;sbit    P41         =           P4^1;sbit    P42         =           P4^2;sbit    P43         =           P4^3;sbit    P44         =           P4^4;sbit    P45         =           P4^5;sbit    P46         =           P4^6;sbit    P47         =           P4^7;sfr         B           =           0xF0;/#endif

至此工程整理完毕,接下来进行程序验证。

3.1 GPIO输入

GPIO输入检测即是对PX引脚的检测直接获取寄存器P的值即可。
先控制4个IO口输出为高低不同的电平,再用另外4个IO口获取前面4个端口的电平,并测试获取之后的电平状态是否是先前输出的电平状态。
程序代码如下:

void sys_led_test(void)
{unsigned char tmp = 0;//中间变量用于获取io口状态//控制4个引脚输出P10 = 1;P11 = 0;P12 = 0;P13 = 1;//用另外四个IO口获取状态并测试(指示灯显示)tmp = P10;P14 = tmp;tmp = P11;P15 = tmp;tmp = P12;P16 = tmp;tmp = P13;P17 = tmp;}

根据测试结果可知,获取IO口状态,直接读出对应寄存器位即可

3.2 GPIO输出

同理,控制GPIO口状态,直接写入寄存器即可,根据STC89C5xRC_RDP.h可知:
Pxy:x指的是端口名称,y指的是这个名称下的端口序号。

sfr         P1          =           0x90;sbit    P10         =           P1^0;sbit    P11         =           P1^1;sbit    P12         =           P1^2;sbit    P13         =           P1^3;sbit    P14         =           P1^4;sbit    P15         =           P1^5;sbit    P16         =           P1^6;sbit    P17         =           P1^7;

3.3 GPIO流水灯

流水灯控制肯定要用到延时函数,首先定义一个简单的delay函数,并在includes.h中声明

/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}

然后再c51_gpio.c中定义一个跑马灯程序,并在主程序的while(1)中使用,在c51_gpio.h中进行声明。

Led流水灯函数如下,其实在以下两句之间有一小段时间P1.0引脚出来的是低电平,在仿真时可以看出来。
P1<<=1; //左移一位 该语句等效于 P1=P1<<1
P1|=0x01; //最后一位补1,该语句等效于 P1=P1|0x01 符号"|“表示"或”

/********************************************************
函数名称:sys_led_test
函数功能:led流水灯
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
void sys_led_test1(void)
{delay(30000);//延时程序P1<<=1;      //左移一位 该语句等效于 P1=P1<<1P1|=0x01;    //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等{ delay(30000);P1=0xfe; //重新赋值}

}

烧录板子验证,流水灯成功。

3.4 Protues仿真

Protues仿真可以摆脱硬件的瓶颈,但是需要对器件特性有一定的了解,此处制作简单演示,后续完结后使用protues演示几个项目

在这里插入图片描述

4 总结

做一件事很容易,如何把这件事做好,做到自己满意的程度,需要花费心思和精力,实现功能很容易,实现具有高可靠性的功能需要再接再厉。
欢迎大家交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的学生选课系统

第1章 系统概述 1.1概述 背景&#xff1a;随着计算机网络技术的发展&#xff0c;Web 数据库技术已成为应用最为广泛的网站架构基础技术。学生选课系统作为教育单位不可缺少的部分&#xff0c;其内容对于学校的决策者和管理者至关重要。传统的人工管理方式存在效率低、保密性差等…

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的&#xff0c;记录到来的每一个光子。但是&#xff0c;当两个或多个光子同时到达时&#xff0c;计数器会将其记录为单个脉冲&#xff0c;从而只计数一次。当连续光子到达时&#xff0c;离散光…

ceph存储

1 存储简介 存储的三种方式包括&#xff1a;块存储、文件存储、对象存储1。此外&#xff0c;还有内存存储、硬盘存储和闪存存储2。 内存存储&#xff1a;临时性数据存储方式&#xff0c;存储速度快&#xff0c;容量有限&#xff0c;通常用来存储正在使用的程序和数据。硬盘存…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;识别pdf中图片&#xff09;4. Deepdoc&#xff08;识别pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

操作系统:信号究竟是什么?如何产生?

OS信号 一、信号的概念二、信号的产生1&#xff09;终端按键产生信号1、 前台进程、后台进程2、验证终端按键是否产生信号 2&#xff09;调用系统函数向进程发信号3&#xff09;硬件异常产生信号1、浮点数溢出&#xff0c;CPU产生信号2 浮点数溢出&#xff0c;产生信号原理3. 空…

神经网络构成、优化、常用函数+激活函数

Iris分类 数据集介绍&#xff0c;共有数据150组&#xff0c;每组包括长宽等4个输入特征&#xff0c;同时给出输入特征对应的Iris类别&#xff0c;分别用0&#xff0c;1&#xff0c;2表示。 从sklearn包datasets读入数据集。 from sklearn import darasets from pandas impor…

【密码学】分组密码概述

一、分组密码的定义 分组密码和流密码都是对称密码体制。 流密码&#xff1a;是将明文视为连续的比特流&#xff0c;对每个比特或字节进行实时加密&#xff0c;而不将其分割成固定的块。流密码适用于加密实时数据流&#xff0c;如网络通信。分组密码&#xff1a;是将明文数据…

GuLi商城-商品服务-API-品牌管理-OSS获取服务端签名

新建第三方服务: 引入common 把common中oss的依赖都拿到第三方服务中来 配置文件: 加上nacos注解:<

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽&#xff0c;并尽快将未使用的带宽返回到可用带宽池。 在这里&#xff0c;我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps&#xff0c;这分别对应高速、全速、低速…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry&#xff09;:4.2.2 布局处理:4.2.3 键处理&#xff1a;4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

《植物大战僵尸杂交版》2.2版本:全新内容与下载指南

《植物大战僵尸杂交版》2.2版本已经火热更新&#xff0c;带来了一系列令人兴奋的新玩法和调整&#xff0c;为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝&#xff0c;那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…

宏碁F5-572G-59K3笔记本笔记本电脑拆机清灰教程(详解)

1. 前言 我的笔记本开机比较慢&#xff0c;没有固态&#xff0c;听说最近固态比较便宜&#xff0c;就想入手一个&#xff0c;于是拆笔记本看一下有没有可以安的装位置。&#xff08;友情提示&#xff0c;在拆机之前记得洗手并擦干&#xff0c;以防静电损坏电源器件&#xff09…

ChatTTS使用

ChatTTS是一款适用于日常对话的生成式语音模型。 克隆仓库 git clone https://github.com/2noise/ChatTTS cd ChatTTS 使用 conda 安装 conda create -n chattts conda activate chattts pip install -r requirements.txt 安装完成后运行 下载模型并运行 python exampl…

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

【计算机毕业设计】基于Springboot的IT技术交流和分享平台【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

14-56 剑和诗人30 - IaC、PaC 和 OaC 在云成功中的作用

介绍 随着各大企业在 2024 年加速采用云计算&#xff0c;基础设施即代码 (IaC)、策略即代码 (PaC) 和优化即代码 (OaC) 已成为成功实现云迁移、IT 现代化和业务转型的关键功能。 让我在云计划的背景下全面了解这些代码功能的当前状态。我们将研究现代云基础设施趋势、IaC、Pa…

MATLAB备赛资源库(1)建模指令

一、介绍 MATLAB&#xff08;Matrix Laboratory&#xff09;是一种强大的数值计算环境和编程语言&#xff0c;特别设计用于科学计算、数据分析和工程应用。 二、使用 数学建模使用MATLAB通常涉及以下几个方面&#xff1a; 1. **数据处理与预处理**&#xff1a; - 导入和处理…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换&#xff0c;以探索它们的不同之处&#xff0c;或者因为你知道自己需要其中的一个或另一个&#xff0c;可以使用如下命令&#xff1a; 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

VSCode无法连接网络安装插件-手动安装插件

手动安装插件&#xff1a; 你可以尝试从 Visual Studio Code Marketplace 下载 .vsix 文件&#xff0c;然后在VSCode中手动安装。 手动安装的步骤如下&#xff1a; 1.访问插件页面&#xff0c;下载 .vsix 文件。 Extensions for Visual Studio family of products | Visual S…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素&#xff08; position:relative&#xff0c;position:absolute&#xff0c;position:fixed &#xff09;有效&#xff0c;默认值为0&#xff0c;可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时&#xff0c;后面的元素在…