preface
大家好,我是初尧.C。希望看完这篇文章对你能有所帮助,不足之处请指正~
本文由初尧.C 原创 CSDN首发 如需转载还请通知
无端坠入凡生梦. 却惹三千烦恼丝
欢迎各位点赞+收藏+留言
系列专栏―STC8H8K64U
个人主页―初尧.C的博客
有16位硬件乘除法器 MDU16
(支持32位除以16位,16位除以16位,16位乘16位,数据移位以及数据规格化等运算)
这款单片机的工作电压在1.9V~5.5V,利用平常的TYPE-C就可以供电和传输数据
相比于传统的8051单片机,它拥有超高速8051内核(1T),大约快了12倍
最大64K字节的Flash程序存储器ROM,用于存储用户代码,擦写次数可达10万次
小知识:1GB(千兆)=1024MB(兆)、1MB(兆)=1024KB(千字节)
1KB(千字节)=1024B(字节)、1B(字节 byte)=8位(Bit)
22个中断源,4个中断优先级,
INT0(支持上升沿和下降沿中断);INT1(支持上升沿和下降沿中);
INT2(只支持下降沿中断);INT3(只支持下降沿中断);INT4(只支持下降沿中断);
定时器0;定时器1;定时器2;定时器3;定时器4;
串口1;串口2;串口3;串口4;
ADC模数转换;LVD低压检测;SPI;I²C;比较器;PWMA;PWMB;USB
EEPROM数据存储器,带点可擦 可编程只读存储器;以字节为单位进行读/写数据,
以512字节为页单位进行擦除;可在线反复编程擦写10万次以上
拥有256个字节的RAM,低128字节RAM和高128字节RAM
内部大容量扩展SRAM,128字节内部直接访问RAM(DATA),128字节内部
间接访问RAM(IDATA),8192字节内部扩展RAM(XDATA),1280字节USB数据RAM
强大的双DPTR可增可减
小知识:DPTR:16位特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节
寄存器用DPL表示,既可以作为一个16位的寄存器来处理,也可以作为两个独立的
8位寄存器来使用~
所有的I/O口均支持中断并可掉电唤醒,每组I/O中断有独立的中断入口地址,所有的I/O
中断可支持4种中断模式:高电平中断,低电平中断,上升沿中断,下降沿中断
2. 配置I/O工作模式
每个I/O口的配置都需要使用两个寄存器来进行配置
PxM0 PxM1 I/O口工作模式 0 0 准双向口(传统8051端口模式,弱上拉)
灌电流可达20mA,拉电流约为270~150uA
0 1 推挽输出(强上拉输出,可达20mA,要加限流电阻) 1 0 高阻输入(电流既不能流入也不能流出) 1 1 开漏输出,内部上拉电阻断开 2.1 准双向口模式
准双向口,不是真正意义上的双向口,准双向口(弱上拉)输出类型可用作输出和输入功能而不需要重新配置端口输出状态;这是因为当端口输出为1(高电平)时的驱动能力很弱,允许外部装置将其拉低(例如:接下拉电阻);当端口输出为0(低电平)时的驱动能力很强,可吸收相当大的电流
点亮LED建议使用该模式✔,LED负极接到单片机I/O口,正极处加一个限流电阻随后接+5V电源,这里限流电阻的作用是 以防电流过大而烧坏LED,同时限流电阻也能起分压作用
2.2 推挽输出模式
强推挽输出配置的下拉结构与开漏输出及准双向口的下拉结构相同,但当锁存器为1时提供持续的强上拉,推挽输出模式一般用于需要很大驱动电流的情况,比如驱动三极管带动小电机运行
强推挽引脚配置图:
2.3 高阻输入模式
电流既不能流入也不能流出,输入口带有一个施密特触发输入以及一个干扰抑制电路
当I/O口为高阻态时,也可以叫浮空输入状态,此时I/O口的状态是不确定的,既不是高电平也不是低电平,一般是用作ADC检测时配置的I/O口模式
2.4 开漏输出模式
与推挽输出相对的,就是开漏输出模式了,也就是漏级开路的输出形式,既可以读外部状态也可以对外输出(高电平或者低电平),如果需要读外部状态或对外输出高电平,但此时无法真正的输出高电平,也就是这个高电平的驱动能力非常弱,此时I/O口需要外加上拉电阻
3. 点亮第一个LED
拿到一款单片机,相信大家第一个学习的就是点灯了(大佬除外)
由于单片机I/O口的结构 决定了它灌电流的能力较强,比一般高电平时的拉电流要大,驱动能力强,所以都采用低电平点亮LED的方式
单片机程序由:头文件,变量声明,函数声明,子函数,主函数等这几部分组成
3.1 调用头文件
代码第一行,就是调用这款单片机的头文件;每款单片机都有相对应的头文件,头文件其实就是一种声明,将单片机中的一些常用的符号变量、特殊功能寄存器、关键字等进行定义声明;
例如:STC89C52单片机的头文件
#include
例如:STC15W408S单片机的头文件
#include
我们要介绍的这款单片机型号是:STC8H8K64U,头文件如下:
#include
//调用STC8H头文件 3.2 定义变量LED
这里我们要点亮一个LED,首先要定义它在哪个I/O口,可以随便定义哪个I/O口吗?可以的;当然可以了,用在什么地方,就要相对应的配置I/O口的工作模式
这款单片机引出的I/O口有:P0.0~P0.7,P1.0~P1.7(无P1.2),P2.0~P2.7,P3.2~P3.7,P4.5~P4.7,P5.2和P5.4,对我个人来说是相当够用了;
这里我们用单片机的P1.0口来点亮LED,但是在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它起另外一个名字,就暂且给它起名为LED吧,这里必须要给它们建立联系,我们就用到了C的关键字 sbit 来定义,sbit的用法有三种:
第一种方法:sbit 位变量名 = 地址值
第二种方法:sbit 位变量名 = SFR名称^变量位地址值
第三种方法:sbit 位变量名 = SFR地址值^变量位地址值
我们这里这样写:
sbit LED = P1^0; //定义LED为P1^0口
3.3 编写主函数
直接上程序:
void main() { P1M0 = 0x00;P1M1 = 0x00; //设置P1口为准双向口状态,弱上拉 while(1) { LED = 0; //LED为低电平,即点亮LED } }
这里void main() 的意思是这个main()函数无返回值,void也就是无效的、空的意思
我们写的主函数需要用大括号 {} 给括起来,里面就是我们要运行的内容
第一步就是配置所调用的I/O口的工作模式P1M0 = 0x00,P1M1 = 0x00(准双向口模式);
如何配置工作模式上面我们也做了详细的介绍
第二步,是让这个LED灯一直亮呢,还是闪烁呢,还是做呼吸灯的效果呢,就需要我们根据自己的想法来了;既然是点亮LED,那就让它常亮吧,不需要外部触发,让主函数循环我们所需要的效果就行了,这里用的是一个while循环,主程序会一直执行while(1)里的程序
第三步,用低电平点亮P1.0口,即P1.0 = 0就可以了,前面我们定义了LED为P1.0口,所以正确写法是:LED = 0;就是这么简单,一定一定要记得最后的分号噢(相信有些程序猿后期调试代码BUG是有关于这个分号的)
好啦,这期介绍就到这里,感谢大家的观看~