使用keil点亮stc8核心板的灯

点灯

二、点灯

步骤:

  • 配置IO口模式
  • 输出高低电平

2.1 点亮第一盏灯

2.1.1 点灯
  • 原理图

    • 通过控制 P5.3引脚输出高电平时,LED灯就点亮,输出低电平时LED灯就熄灭
  • IO配置操作

  • 烧录程序

  • main 函数中没有死循环会导致程序执行完成后出现不可预料的行为

    1. 程序"跑飞":

    main 函数返回后,CPU会继续执行后续内存中的内容。由于这些位置通常没有有效代码,程序会跳转到随机地址执行,导致行为失控。

    2. 系统崩溃:

    执行无效指令极易触发硬件异常、数据损坏或陷入新的死循环,最终导致系统复位或崩溃。

    3. 中断失效:

    系统依赖中断处理实时事件。如果主程序已经"跑飞",系统就失去了稳定的运行环境,中断服务程序将无法正常执行或安全返回,导致功能失灵。

  • 代码错误解决

写代码的顺序

2.1.2 Keil环境使用补充
  • 打开代码所在路径

  • 如何打开项目

  • 打开头文件

  • 代码分屏

  • 需要保留的文件

2.2 stc8h用户手册介绍

  • IO配置说明

  • 如何外接上拉电阻

2.3 IO四种工作模式

  • IO配置示例代码

    c 复制代码
    P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
    P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
    P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
    P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出
    • P5表示的是5号端口

    • 0x08表示的是3号引脚

      • 引脚编号和值的对应关系

        编号
        0 0x01
        1 0x02
        2 0x04
        3 0x08
        4 0x10
        5 0x20
        6 0x40
        7 0x80

2.4 软延时实现灯闪烁

常见时间单位换算:

  • 1秒 = 1000 毫秒(ms)

  • 1秒 = 1, 000, 000 微秒(μs)

  • 1秒 = 1, 000, 000, 000 纳秒(ns)

c 复制代码
#include "STC8H.H"
//延长时间
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	i = 29;
	j = 14;
	k = 54;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
		//准双向
		P5M0 &=~(1<<3) ; P5M1 &=~(1<<3) ; 		
    //P5M0 &= ~0x08; P5M1 &= ~0x08; 
		
		//推挽输出
		//P5M0 |=(1<<3) ; P5M1 &=~(1<<3) ; 	
		//P5M0 |= 0x08; P5M1 &= ~0x08; 

		//高阻输出
		//P5M0 &=~(1<<3) ; P5M1 |=(1<<3) ; 	
		//P5M0 &= ~0x08; P5M1 |= 0x08; 
	
		//   开漏输出
		//P5M0 |=(1<<3) ;P5M1 |=(1<<3) ;
    //P5M0 |= 0x08; P5M1 |= 0x08; 

    //P53 = 1;
	
    while (1)
    {
			P53 = 0;
			Delay500ms();
			P53 = 1;
			Delay500ms();
    }
}

2.5 寄存器点灯


c 复制代码
//#include "STC8H.H"
//通过寄存器在头文件的的信息
//数据类型		变量名										硬件的地址
sfr         P5          =           0xc8;
sbit    	P53         =           P5^3;
sfr         P5M1        =           0xc9;
sfr         P5M0        =           0xca;
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	i = 29;
	j = 14;
	k = 54;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
		//准双向
		P5M0 &=~(1<<3) ; P5M1 &=~(1<<3) ; 		
    //P5M0 &= ~0x08; P5M1 &= ~0x08; 
		
		//推挽输出
		//P5M0 |=(1<<3) ; P5M1 &=~(1<<3) ; 	
		//P5M0 |= 0x08; P5M1 &= ~0x08; 

		//高阻输出
		//P5M0 &=~(1<<3) ; P5M1 |=(1<<3) ; 	
		//P5M0 &= ~0x08; P5M1 |= 0x08; 
	
		//   开漏输出
		//P5M0 |=(1<<3) ;P5M1 |=(1<<3) ;
    //P5M0 |= 0x08; P5M1 |= 0x08; 

    //P53 = 1;
	
    while (1)
    {
			P53 = 0;
			Delay500ms();
			P53 = 1;
			Delay500ms();
    }
}
  • 地址的H只是十六进制的标志,不是数字的有效组成部分

  • sfr和sbit和关键字:

    关键字 定义 作用 示例
    sfr 特殊功能寄存器 (Special Function Register) 定义单片机内部特定功能模块所对应的寄存器,如端口、定时器等。 sfr P5M1 = 0xC9; // P5 端口配置寄存器 1 sfr P5M0 = 0xCA; // P5 端口配置寄存器 0 sfr P5 = 0xC8; // P5 端口寄存器
    sbit 位 (Bit) 定义特定寄存器中的某一位,便于对寄存器的单个位进行操作。 sbit P53 = P5^3; // 定义 P5.3 引脚
    c 复制代码
    // P为大写,不是不是小写
    // 定义 端口 = 地址
    // 声明:P5端口配置寄存器1
    sfr P5M1 = 0xC9;// 特殊功能寄存器
    // 声明:P5端口配置寄存器0
    sfr P5M0 = 0xCA;// 特殊功能寄存器
    
    // 声明:P5端口寄存器 = 地址
    sfr P5	 = 0xC8; 
    // 定义: 引脚 = 地址
    sbit P53 = P5^3;

2.6 库函数的使用

  • 库函数代码下载位置

  • 库函数资料说明

2.6.1 库函数点灯
  • 烧录程序的主频
  • 拷贝文件
  • 宏定义初始化

  • 结构体传参初始化

2.6.2 L16警告解除
2.6.2 delay模块使用
c 复制代码
#include "GPIO.h"
#include	"Delay.h"

void GPIO_config(void) {

	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_3;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);//初始化
}

void main() {
    GPIO_config();

    //双向io
    //P5_MODE_IO_PU(GPIO_Pin_3);

    //推挽输出
    //P5_MODE_OUT_PP(GPIO_Pin_3);
    //P53是p5的第3个引脚
    //P53 = 1;
    while (1){
        P53 = 1;
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        P53 = 0;
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
    }

    return ;
}

2.7 代码常见错误

相关推荐
凉、介7 小时前
SylixOS 中的 Unix Socket
服务器·c语言·笔记·学习·嵌入式·sylixos
三万棵雪松7 小时前
【AI小智硬件程序(四)】
人工智能·嵌入式·esp32·ai小智
Arciab1 天前
51单片机_蜂鸣器
单片机·嵌入式硬件·51单片机
不脱发的程序猿1 天前
嵌入式开发中C++内存泄漏的场景与解决办法
单片机·嵌入式硬件·嵌入式
Jason_zhao_MR1 天前
V2G 实战:SECC GreenPHY 通信开发方案
嵌入式硬件·物联网·嵌入式·边缘计算
尼喃2 天前
24V过压过流保护电路芯片PW1605,60V耐压5A大电流,硬件设计选型优选
单片机·51单片机·芯片
电子工程师成长日记-C512 天前
基于51单片机的乒乓球计分器
单片机·嵌入式硬件·51单片机
深耕AI2 天前
【时钟周期 vs 指令】为什么51单片机需要12个时钟周期?
单片机·嵌入式硬件·51单片机
Arciab2 天前
51单片机_LCD1602液晶显示
网络·嵌入式硬件·51单片机
Channon_2 天前
专题六:二进制日志的暗黑魔法——结构化数据与跨平台解析
嵌入式