使用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配置示例代码
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)
#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 寄存器点灯
//#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 端口配置寄存器 1sfr P5M0 = 0xCA;
// P5 端口配置寄存器 0sfr P5 = 0xC8;
// P5 端口寄存器sbit 位 (Bit) 定义特定寄存器中的某一位,便于对寄存器的单个位进行操作。 sbit P53 = P5^3;
// 定义 P5.3 引脚// 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模块使用
#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_PPGPIO_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 ;
}