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.mzph.cn/bicheng/41804.shtml

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

相关文章

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

大语言模型与知识图谱结合发展方向

引言 在人工智能的发展历程中&#xff0c;大语言模型&#xff08;LLM&#xff09;的出现标志着一个重要的转折点。随着深度学习技术的突破和计算能力的提升&#xff0c;LLM以其前所未有的规模和复杂性&#xff0c;开启了迈向人工通用智能&#xff08;AGI&#xff09;的新浪潮。…

STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁

在没有接触到FreeRTOS时&#xff0c;也没有想过同时叫两个或两个以上的led灯闪烁的想法&#xff0c;接触后&#xff0c;发现如果想叫两个灯同时以不同的频率闪烁&#xff0c;不能说是不可能&#xff0c;就算是做到了也要非常的麻烦。但是学习了FreeRTOS后&#xff0c;发现要想同…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

(杂文)参加WAIC 2024 所思所感

受华为广办的邀请&#xff0c;在领导要求下&#xff0c; 我还是在这个炎热的暑假通过一个接近凌晨两点落地的飞机连夜从北京来到了上海&#xff0c;去“睁眼看世界”。 区别于纯学术会议和CCF类的会议&#xff0c;WAIC 更加的平易近人&#xff0c;有更多的工业界同行&#xff…

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09; 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09;将于2024年10月18-20日在新加坡隆重召开。会议将围绕…

三丰云评测:免费虚拟主机与免费云服务器的全面对比

三丰云是一家知名的互联网服务提供商&#xff0c;专注于虚拟主机和云服务器的服务。在互联网技术日新月异的今天&#xff0c;选择一个优质的云服务提供商至关重要。本次评测将重点对比三丰云的免费虚拟主机和免费云服务器&#xff0c;帮助用户更好地选择适合自己需求的服务。首…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

CVE-2023-30212(xss漏洞)

简介 OURPHP版本<7.2.0存在XSS漏洞&#xff0c;攻击路径为/client/manage/ourphp_out.php。 过程 打开靶场 访问攻击路径/client/manage/ourphp_out.php 得到flag{354c7c41-cc23-4de5-be73-79cbbf384aba}

Multisim仿真-交流数字电压表

下图为整体的原理框图&#xff0c;交流电源经过整流滤波电路转换后&#xff0c;送入模数转换电路&#xff0c;经译码给到显示电路&#xff0c;由其显示交流电源的有效值。 信号发生器XFG1输出正弦波信号(峰峰值)&#xff0c;XMM1测量有效值&#xff0c;U6数码管显示有效值。仿真…

Linux下python抓取动态网页内容

一、背景 现在大部分网站的数据都是异步加载的&#xff0c;直接抓取是没办法获取到你想要的数据。必须要借助浏览器(无头浏览器,下面会搭建这个环境)来加载其javascript渲染数据后&#xff0c;你所需要的数据这时才呈现。 二、环境搭建 1、Centos7 默认有 python2.7版本 查…

[BJDCTF 2nd]简单注入

sqlsqlsqlsqlsql又来喽 过滤了单双引号&#xff0c;等于符号&#xff0c;还有select等&#xff0c;但是这里没有二次注入 。扫描发现hint.txt 看出题人的意思是&#xff0c;得到密码即可获得flag。 select * from users where username$_POST["username"] and passw…

二叉树的顺序存储

目录 顺序存储&#xff1a; 简介&#xff1a; 节点的位置关系&#xff1a; 优缺点&#xff1a; 优点&#xff1a; 缺点&#xff1a; 二叉树顺序存储的模拟实现&#xff1a; 向上调整算法&#xff1a; 向下调整算法&#xff1a; 二叉树的初始化&#xff1a; 直接初始化…

spdlog一个非常好用的C++日志库(五): 源码分析之registry类

目录 1.registry类意义 2.registry类实现 2.1.registry数据成员 2.2.registry函数成员 2.2.1.构造与析构 2.2.2.单例模式 2.2.3.全局注册表 2.2.4.initialize_logger初始化logger对象 2.2.5.全局格式器 2.2.6.预置日志等级 2.2.7.flush日志等级 2.2.8.默认logger …

合并区间(python3)

合并区间 题目描述解题思路代码实现复杂度 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示…

认识流式处理框架Apache Flink

目录 一、Apache Flink 的基础概念 1.1 Apache Flink是什么&#xff1f; 1.2 Flink的定义 二、Apache Flink 的发展史 2.1 Flink前身Stratosphere 2.2 Flink发展时间线及重大变更 三、Flink核心特性 3.1 批流一体化 3.2 同时支持高吞吐、低延迟、高性能 3.3 支持事件时…

Git 运用小知识

1.Git添加未完善代码的解决方法 1.1 Git只是提交未推送 把未完善的代码提交到本地仓库 只需点击撤销提交&#xff0c;提交的未完善代码会被撤回 代码显示未提交状态 1.2 Git提交并推送 把未完善的代码提交并推送到远程仓库 点击【未完善提交并推送】的结点选择还原提交&#x…

指定版本ceph-common安装

如&#xff0c;安装15.2.13的ceph-common PACKAGE_NAMEceph-common CEPH_VERSION15.2.13 wget -q -O- https://download.ceph.com/keys/release.asc | sudo apt-key add - echo deb http://download.ceph.com/debian-${CEPH_VERSION}/ $(lsb_release -sc) main | sudo tee …

关于学习方法的优化

这是一种新的学习方法&#xff0c;一种新的学习形式&#xff0c;可以通过歌唱的方式&#xff0c;运用&#xff0c;把自己每天要进行的内容进行一个复习&#xff0c;进行一个重复&#xff0c;这样可以实现随时随地进行一个学习&#xff0c;这样可以帮助快速走出来&#xff01; 您…

面试记录总结

es6新特性 --------------------------------------------------------------------------------------- let 1.变量不能重复声明 2.块儿级作用域 3.不存在变量提升 4.不影响作用域链 const 1.一定要赋初始值 2.一般常量使用大写(潜规则) 3.常量的值不能修改 4.块儿级作用域 5…