STC8增强型单片机开发——第一个程序

前言

        今天开始进入单片机开发的学习,我们用到的开发软件是keil,烧录软件是stc_isp。这两个软件大家可以自行去对应的官网下载安装,关于环境配置问题,这里不做过多介绍,大家可以查阅其他文章进行配置。

        stc现在有32位的单片机,但是建议入门选8位的,对于新手来讲,stc8便宜,资源丰富,各种外设都支持,学习难度不大,作为入门是最佳选择。

        学习内容: 会读芯片手册,能看懂原理图,能自己绘制开发板,点灯,pwm, adc,中断系统,电位器,数码管,温湿度传感器,独立按键,矩阵键盘,rtc时钟,外部中断,IIC协议, SPI协议, USB的hid协议,uart通讯,蓝牙芯片通讯等。 学习以上内容一定要配合逻辑分析仪去学习。

第一个程序

stc8核心板

功能支持

        采用stc8h8k64u芯片,可以实现串口烧录、HID烧录、基准电压、按键操作、LED显示、可编程LED灯、外部存储拓展和全部引脚拓展功能。

数据手册:可去stc官网https://www.stcmcudata.com/查找下载数据手册。

原理图

点亮第一盏灯

原理图

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

需求实现

点亮或熄灭led灯

项目创建

当然我们这里环境配置已经搭建完成并且keil与stc_isp已经完成关联。

1.新建项目

2.配置开发板信息

创建完成后

  • Target 1为项目根节点
  • Source Group1为源码目录
  • 可根据个人喜好来修改他们的名称
编码实现

1.结构准备

2.代码实现

点亮led灯

#include "STC8H.H"

int main() {
    P5M0 = 0x00;
    P5M1 = 0x00;
	
    P53 = 1;
    while(1) {}
}

熄灭led灯

#include "STC8H.H"

int main() {
    P5M0 = 0x00;
    P5M1 = 0x00;
	
    P53 = 0;
    while(1) {}
}
编译烧录运行

1.如果没有配置编译输出,需要进行输出配置

2.保存与编译代码

3.烧录

GPIO的理解

理解点灯案例的代码

#include "STC8H.H"

int main() {
    P5M0 = 0x00;
    P5M1 = 0x00;
	
    P53 = 1;
    while(1) {}
}
  • #include "STC8H.H" 引入头文件
  • P5M0 = 0x00;P5M1 = 0x00;配置引脚模式
  • P53=1;配置IO引脚的电平

头文件STC8H.H

        针对 STC8H 系列芯片的头文件,如果Keil软件没有配置STC8环境,此处是无法导入的。STC8H.H文件的存储目录,在Keil安装目录下的 C51\INC\STC文件夹下。内部有其他STC芯片的头文件,如果你用的是其他芯片,则include对应的头文件。

引脚工作模式

        打开芯片数据手册,跳转到I/O口

其中我们可以通过手册获得一些信息:

    • 1个端口对应8个引脚
    • 每个端口都由一个寄存器控制
    • 系列不同,端口数量不同
    • 每个引脚可配置4种不同的工作模式

代码中:

P5M0 = 0x00;
P5M1 = 0x00;

指的是P5端口所有的引脚为准双向口输出,如果想设置为其他模式,可以根据实际需求进行配置。

当前我们电灯是要控制P5端口的3号引脚,也就是P53这个引脚。理论上只需要设置这个引脚的工作模式即可。

P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出
  • P5表示的是5号端口
  • 0x08表示的是3号引脚,对应二进制 0000 1000

小结:如果上述操作以及步骤看完还比较懵,很可能是数据手册还是没看明白,简单解释一下:由数据手册可以看到有P0~P78个端口,每个端口又有8个引脚,当然也有6个引脚的。

每个端口下有两个寄存器,如P5端口有P5M1和P5M0两个寄存器,默认状态下P5M1 = 1,P5M0 =0 

即 I/O口的工作模式:

软延时操作

软延时指的是通过代码来进行延时睡眠操作。我们可以借助工具来提供软延时的代码。

打开STC-ISP工具,进行如下操作:

#include "STC8H.H"

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 57;
	j = 27;
	k = 112;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main() {
	P5M1 &= ~0x08,	P5M0 &= ~0x08; //准双向口
	//P5M1 &= ~0x08,	P5M0 |=  0x08; //推挽输出
	//P5M1 |=  0x08,	P5M0 &= ~0x08; //高阻输入
	//P5M1 |=  0x08,	P5M0 |=  0x08; //开漏输出
	
	while(1) {
		P53 = 1;//开
		Delay1000ms();
		P53 = 0;//关
		Delay1000ms();
	}
}

库函数

使用库函数点灯

1.导入库函数

下载STC8H的库函数

来到库函数的目录下,拷贝以下文件:

  • Config.h
  • Type_def.h
  • GPIO.h
  • GPIO.c

2.新建项目,将拷贝的四个文件放到项目文件中

新建main.c文件

将库函数添加到项目中

3.在main.c进行led的开关控制

#include "Config.h"
#include "GPIO.h"

void Delay500ms()		//@11.0592MHz
{
	unsigned char data i, j, k;

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

void GPIO_config(){
	GPIO_InitTypeDef gpioInit;
	gpioInit.Mode = GPIO_OUT_PP;// 推挽
	gpioInit.Pin  = GPIO_Pin_3; // P53
	GPIO_Inilize(GPIO_P5, &gpioInit);
}

void main(){
	// 配置IO模式
	
	// P53 配置准双向 (使用宏函数)
//	P5_MODE_IO_PU(GPIO_Pin_3);
	
	// P53 配置推挽输出模式(使用初始化函数)
	GPIO_config();
	

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

使用delay模块延时

  1. 拷贝库函数中Delay.cDelay.h到工程
  2. 引用头文件Delay.h
  3. 进行延时操作
#include "Delay.h"
delay_ms(250); // 延时250毫秒, 这里只支持1~255ms

注意:这里在烧录过程中要改一下IRC频率为24MHz

逻辑分析仪

学习内容

什么是逻辑分析仪

逻辑分析仪(Logic Analyzer)是一种工具,用于分析数字信号,例如控制信号,时钟信号等等。它可以用于调试和验证数字电路、嵌入式系统等等。

本教程采用的是mini版USB 逻辑分析仪。总共有10个端口,其中8个为分析通道,一个时钟信号,一个是GND。8路通道可以同时测8路信号。

软件安装

下载Logic Setup2.4.9版本安装包,傻瓜式下一步安装即可,文章环境配置方面不详细介绍,如果需要请查看其他文章。

功能介绍

大致关注几个区,后续过程中我们会陆续学会所有功能。

  • 主界面中的顶部,如果显示Disconnected,说明逻辑分析仪没有和PC电脑连接;如果显示Connected,表示已经连接
  • 菜单部分
  • 8个调试通道
  • 右侧功能部分,绿色按钮为调试按钮

使用逻辑分析仪测试点灯

分析测试

由与原理图可知:测试P5.3端口是否是1秒钟高电平1秒钟低电平

接线

将逻辑分析仪的通道1线和开发板中的P5.3引脚连接。

将逻辑分析仪的GND线和开发板的GND连接。

测试

将LED的代码烧录到开发板中,并且运行。

打开逻辑分析仪的软件(Logic),查看是否和逻辑分析仪连接,点击按钮进行测试

  • 配置采样率,最高24MS/s
  • 点击绿色按钮进行采用

观察通道1,通过鼠标滚轮缩放,查看波形

鼠标放到悬浮窗上,可以查看高低电平持续时间。

总结

        接下来的时间我们从stc8单片机入手,学习单片机。从stc8基础入门到stc8进阶入门,再到stc8开发板设计,到学习RTX51操作系统,最后自己动手做一个蓝牙巡线小车。希望小伙伴们可以跟我一起学习嵌入式,下期再见!

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的时钟程序,使用STC8H8K64U单片机,使用定时器0实现1秒钟的计时,每秒钟在数码管上显示当前时间: ```c #include <stc12.h> unsigned char code table[] = { // 数码管编码表 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6 }; unsigned char second = 0; // 当前秒数 unsigned char minute = 0; // 当前分钟数 unsigned char hour = 0; // 当前小时数 void main() { TMOD = 0x01; // 定时器0工作在模式1:16位定时器模式 TH0 = 0x4C; // 定时器初值,65536-50000=15536,T0计数器每50000个机器周期中断一次,即1秒钟 TL0 = 0x00; ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断 P1 = 0xFF; // P1口作为数码管控制口,初始值为高电平,不显示数字 while (1) { P0 = table[hour / 10]; // 显示小时的十位数码 P1 = 0xFE; // 打开第一位数码管 delay(2); // 延时一段时间,保证数码刷新 P1 = 0xFF; // 关闭数码管 P0 = table[hour % 10]; // 显示小时的个位数码 P1 = 0xFD; // 打开第二位数码管 delay(2); P1 = 0xFF; P0 = table[minute / 10]; // 显示分钟的十位数码 P1 = 0xFB; // 打开第三位数码管 delay(2); P1 = 0xFF; P0 = table[minute % 10]; // 显示分钟的个位数码 P1 = 0xF7; // 打开第四位数码管 delay(2); P1 = 0xFF; } } void timer0() interrupt 1 // 定时器0中断服务函数 { TH0 = 0x4C; TL0 = 0x00; second++; if (second >= 60) // 如果秒数达到60,则加1分钟 { second = 0; minute++; if (minute >= 60) // 如果分钟数达到60,则加1小时 { minute = 0; hour++; if (hour >= 24) // 如果小时数达到24,则清零 { hour = 0; } } } } void delay(unsigned int t) // 延时函数,t为延时时间 { unsigned int i, j; for (i = 0; i < t; i++) { for (j = 0; j < 1000; j++); } } ``` 上面的程序中,使用定时器0进行计时,每秒钟产生一次中断。在中断服务函数中,将秒、分、时分别加1,当到达60、60、24时清零。在主函数中,使用数码管显示当前的时间。其中用到了一个延时函数,用来保证数码管刷新的时间。 注意:以上代码仅供参考,具体实现需要根据自己的硬件电路和需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Magic'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值