【STC8H】控制IO口

(一)GPIO概念

GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。GPIO 最简单的应用应该是点亮 LED 灯,只需通过软件控制 GPIO 输出高低电平即可。当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。

以下几类引脚:

(1)电源引脚:引脚中的 VCC、 GND 都属于电源引脚。

(2)晶振引脚:引脚中的 XTAL1、XTAL2 都属于晶振引脚。

(3)复位引脚:引脚中的 RST 属于复位引脚,不做其他功能使用。

(4)下载引脚:单片机的串口功能引脚(TXD、RXD)可以作为下载引脚使用。

(5)GPIO 引脚:引脚图中带有 Pxx 等字样的均属于 GPIO 引脚。

(二)寄存器介绍

1.I/O端口数据寄存器(Px)

在这里插入图片描述

2.端口模式配置寄存器(PxM0,PxM1)

在这里插入图片描述

3.配置端口模式

在这里插入图片描述

STC8H 系列单片机所有的 I/O 口均有 4 种工作模式:

(1)准双向口模式:允许一个IO口在不同的时间点既可以作为输入口又可以作为输出口,实现输入和输出的灵活切换。

(2)推挽模式:高电平与低电平均可提供一定强电流

(3)开漏输出模式:限低电平模式下可通过强电流(较通用IO模式),而高电平需外部提供。

(4)高阻输入模式:输入和输出均为高阻,直接阻断。

指令语法

(1)"sfr"指令:

用来直接描述硬件地址。小白先解成一组IO口的起始地址中数据

sfr P0 = 0x80; //对’

(2)"sbit"指令:

对应可位导址空间的一个位,小白先理解成"一个IO口/针脚"的地址中的数据。

sbit P00 = P0^0;//也就是对P0口全部给0

4.示例

(1)端口初始化

注意:实际上了解一下就好,一般封装在官方头文件stc8h.h中

(2)设置延时函数

(3)主函数

(4)编译运行+烧录代码

实验现象

P20端口上的led灯每隔0.5s(500ms)闪烁一次!是不是特别神奇!恭喜你获得“点灯大师”的称号!!!

### 使用STC8H单片机控制舵机 #### 控制原理 舵机通常接收PWM信号作为输入,该信号决定了舵机转轴的位置。对于大多数标准舵机而言,脉冲宽度在1ms到2ms之间的方波能够覆盖其整个转动范围,即从0°至180°的角度变化。具体来说,1.5ms的高电平持续时间对应着中间位置90°;而当这个值减小时(比如降至1ms),则会使舵机向一侧移动直至到达极限角度之一;反之亦然。 #### 硬件连接说明 为了实现对舵机的有效操控,在硬件层面需将STC8H系列单片机的一个定时器/计数器单元配置成PWM模式,并将其输出端与舵机电流接相接。此外,还需确保给定足够的供电电压以支持舵机运作,这可能涉及到外部稳压源的应用[^1]。 #### 软件编程指导 下面给出一段基于Keil C编译环境编写并适用于STC8H平台下的简单示例代码: ```c #include <reg52.h> sbit SERVO_PIN = P1^0; // 定义用于发送PWM信号的IO引脚 void Timer_Init(void); void PWM_Generate(unsigned int duty_cycle); int main() { TMOD &= 0xF0; TH1 = (65536 - 20000) / 256; TL1 = (65536 - 20000) % 256; TR1 = 1; while(1){ unsigned char angle; for(angle=0;angle<=180;angle++){ float pulse_width = ((float)(angle)/180)*1000 + 500; PWM_Generate((unsigned int)pulse_width); delay_ms(20); } for(;angle>=0;angle--){ float pulse_width = ((float)(angle)/180)*1000 + 500; PWM_Generate((unsigned int)pulse_width); delay_ms(20); } } } // 初始化定时器T1为方式2自动重装载工作模式 void Timer_Init(){ TMOD |= 0x01; ET1 = 1; EA = 1; } // 根据占空比生成相应周期长度的PWM波形 void PWM_Generate(unsigned int duty_cycle){ static bit flag = 0; if(flag==0){ TH1=(65536-duty_cycle*50)/256; TL1=(65536-duty_cycle*50)%256; flag=~flag; }else{ TH1=(65536-(20000-duty_cycle*50))/256; TL1=(65536-(20000-duty_cycle*50))%256; flag=~flag; } TF1=1; } // 延迟函数定义 void delay_ms(int ms){ int i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); } ``` 这段程序实现了让舵机按照一定规律来回摆动的效果。其中`PWM_Generate()`负责根据指定的角度计算相应的PWM脉宽,并调用定时中断服务子程序完成实际的PWM波形输出操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值