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

news2025/1/11 18:40:59

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 1111
	P1 = 0x00;		//P1口全部为低电平,对应的LED灯全亮起,ff换算成二进制是 0000 0000
	
	P1 = 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);

#endif

includes.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<<1
	P1|=0x01;    //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"
	if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等
	{ 
		delay(30000);
		P1=0xfe; //重新赋值
	}

}

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

3.4 Protues仿真

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

在这里插入图片描述

4 总结

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

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

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

相关文章

echarts的折线图实现部分虚线部分实线

场景&#xff1a; 折线图一般都是实线为准&#xff0c;但是由于最后一个数据是预测。所以想要实现最后一段为虚线。 效果图&#xff1a; 具体实现&#xff1a; series:[{name: "销售总金额",type: "line",smooth: true,barWidth: 10,stack: Total,itemSty…

【机器学习】人工智能与气候变化:利用深度学习与机器学习算法预测和缓解环境影响

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 1.1 背景介绍 1.2 人工智能与机器学习的崛起 1.3 本文内容概述 &#x1f528;气候变化的挑战 2.1 现今气候变化带来的影响和挑战 2.2 引发关注的气候变化趋势和数据 &#x1f916;人工智能…

甘肃香酥可口的烤花卷:味蕾的新宠

在美食的世界里&#xff0c;总有一些创新的美味能够让人眼前一亮&#xff0c;烤花卷便是其中之一。烤花卷&#xff0c;这甘肃一独特的美食&#xff0c;将传统花卷的柔软与烤制的香脆完美结合&#xff0c;为我们的味蕾带来了全新的体验。从外观上看&#xff0c;烤花卷呈现出诱人…

人脉社群平台微信小程序系统源码

&#x1f31f;【解锁人脉新纪元&#xff1a;探索人脉社群平台小程序】&#x1f31f; &#x1f680;【开篇&#xff1a;为什么我们需要人脉社群平台小程序&#xff1f;】&#x1f680; 在这个快节奏的时代&#xff0c;人脉不再是简单的名片交换&#xff0c;而是通往成功与机遇…

Elasticsearch:Runtime fields - 运行时字段(一)

运行时字段&#xff08;runtime fields&#xff09;是在查询时计算的字段。运行时字段使你能够&#xff1a; 向现有文档添加字段而无需重新索引数据开始处理数据而无需了解其结构在查询时覆盖索引字段返回的值定义用于特定用途的字段而无需修改底层架构 你可以像访问其他任何…

d3dcompiler_47.dll缺失怎么修复?d3dcompiler_47.dll修复使用说明

d3dcompiler_47.dll是一个重要的系统文件&#xff0c;属于MicrosoftWindows操作系统中Direct3D的一部分&#xff0c;它主要负责处理在Windows上运行的应用程序和游戏中的3D图形编程。这个DLL文件是“DirectX”的一项组成部分&#xff0c;DirectX是一套核心技术&#xff0c;用于…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验13 静态路由配置错误导致的路由环路问题

一、实验目的 1.验证静态路由配置错误导致的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证路由环路。 四、实验…

嵌套组合请求对象的校验与全局捕捉

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

S7-1500PLC通过工艺对象实现V90总线伺服定位控制(105报文)

S7-1500PLC通过工艺对象实现V90总线伺服定位控制,伺服驱动器工作在速度模式,S7-1500PLC工作在位置模式,具体控制原理框图,可以参考下面文章链接: 1、S7-1200PLC和V90总线伺服位置控制 S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_v90伺服 报文3 设…

聊聊etsy平台,一个年入百万的项目

聊聊etsy平台&#xff0c;一个年入百万的项目 什么是etsy,这是怎样一个平台&#xff0c;怎样盈利的&#xff1f;相信现在大家满脑子都是这些疑问。 这个平台也是无意间一个学员提到的&#xff0c;据说他朋友靠这个平台年赚好几百万。苦于门槛太高&#xff0c;他也做不了。今天…

微软预计年底实现实时语音界面;硅基智能开源 AI 数字人交互平台 Duix丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

基于matlab的控制系统串联校正—相位超前校正问题实例

1.问题 为了改进闭环系统性能&#xff0c;可以采用串联校正&#xff0c;这里用相位超前校正&#xff0c;即 α 常取 0.07~0.2 &#xff0c;选择适当的 α 与 τ &#xff0c; 要使 针对新的开环传递函数 G ’ K (S)Gc(S) G(S) H(S) &#xff0c;画出开环 Bode 图&#xff…

停车场车牌识别计费系统,用Python如何实现?

关注星标&#xff0c;每天学习Python新技能 前段时间练习过的一个小项目&#xff0c;今天再看看&#xff0c;记录一下~ 项目结构 说明&#xff1a; datefile文件夹&#xff1a;保存车辆信息表的xlsx文件 file文件夹&#xff1a;保存图片文件夹。ic_launcher.jpg是窗体的右上角…

Laravel swagger接口文档生成和管理

Laravel swagger接口文档生成和管理 接口开发随着时间推移接口会越来越多&#xff0c;随着多部门之间的协作越来越频繁, 维护成本越来越高, 文档的可维护性越来越差, 需要一个工具来管理这些接口的文档, 并能够充当mock server给调用方使用 这里推荐swagger生成和管理接口文档&…

Python入门 2024/7/2 While

目录 while循环的基础应用 循环输出十次&#xff1a;键盘敲烂&#xff0c;月入过万 计算1~100的和 用while循环练习猜数字 while循环的嵌套应用 打印九九乘法表 输出不换行的功能 while循环的基础应用 格式&#xff1a; while 条件&#xff1a; 条件满足时&#xff0c…

昇思25天学习打卡营第1天|yulang

今天主要了解了深度学习框架之昇思MindSpore的初学入门&#xff0c;没想到 ai学习入门如此简单&#xff0c;不愧是华为大手笔&#xff0c;提供的学习环境配置如此之高。这个平台有点类似百度飞桨&#xff0c;大大降低了AI开发门槛&#xff0c;使用户能够快速实现想要的模型&…

从零开始:如何设计一个现代化聊天系统

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/chat-system 在当今数字化时代,聊天系统已成为我们日常生活和工作中不可或缺的一部分。从个人交流到团队协作,从客户服务到社交网络,聊天应用…

科技与水利的深度融合实践:揭秘智慧水利技术如何助力水利行业解决传统难题,推动水资源管理向精细化、智能化方向发展

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

HR 如何用好人才测评系统?

HR 如何用好人才测评系统&#xff1f; 人才测评已经广泛应用在企业招聘、人才选拔&#xff0c;人才盘点&#xff0c;岗位晋升&#xff0c;绩效考评等领域&#xff0c;帮助HR提升人力资源管理效率&#xff0c;更好的发掘人才优势&#xff0c;在教育培训方面&#xff0c;人才测评…

我做了个C++算法学习网站,从语法到算法再到数据结构,全方位为算法竞赛小伙伴护航

哈喽&#xff0c;各位小伙伴大家好&#xff0c;我是大李。 最近半个月&#xff0c;我做了个《C算法宝典》并更新了40多篇教程&#xff0c;目前还在更新中&#xff0c;内容从语法到算法和数据结构&#xff0c;全方位为算法竞赛小伙伴护航。 温馨提示&#xff1a;如果你或你的朋…