前言
在开始这个系列自学51单片机之前,我已经接触过一些Arduino的知识。关于51单片机和STM32在自己初高中时候折腾了一段时间后,最后不了了之,只是一知半解。我想通过自己有系统完整学习之后,能够有一些收获,也算是同步一下大学C++的知识吧。
本系列日记仅仅是真实记录,踩坑和失败很正常,也希望各路专业的朋友来指导。
由于课业安排,暂时不会按日更新,但是会努力跟进。
本系列使用书籍是《手把手教你学51单片机C语言版(第二版)》宋雪松老师所撰,使用开发板是普中科技HC6800-EM3 V2.2,STC89C516
1.理论部分
1.1单片机知识
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。 ——摘自百度百科
8051单片机的结构符合冯诺依曼架构,分成控制、运算、存储和输入输出。
振荡器:可以把振荡器(时钟信号来源)看作标准的时间单位,就像人有了24小时的时间制一样,每一个振荡脉冲相当于单片机的“1秒”。
CPU:内含运算单元和控制单元,相当于人的大脑,提供数据的计算和单片机内部控制的功能,起到中枢作用。
ROM:只读存储器,存放我们编写的程序,有时会用Flash闪存来存放。
RAM:随机读写存储器,相当于电脑的内存,存放临时产生的数据,断电丢失,不会保存。
SFR:特殊功能寄存器,是控制单片机功能的寄存器,可以看作是一个等待设置的信号位,当输入特定的信号(寄存特定的数据位)时,控制不同功能来使用单片机的各项资源。
定时器:单片机内部的数据累加器,可起到计数或者定时的效果。
I/O:输入输出的引脚或者通信位,可以设置不同模式来控制输入输出的信号。
1.2单片机最小系统
最小系统是单片机运行起来的最简电路。分为:电源电路,晶振电路,复位电路。
这里引用了芯片的数据手册,进行了适当编辑,数据手册值得深究。
1.3软件开发的准备
由于有一定的C语言基础,这里并不赘述,汇编语言暂时还未涉及。
这里用的是keil5的环境。在b站有相关下载。
上传下载是用的stc-isp官方烧录软件,还是很方便的,就是没有自动上电复位,需要自己手动复位才能检测到单片机。
2.实操部分
2.1一些电路
首先根据原理图所示,我的8个LED灯连接在74HC573这个IC上,但是开发板上是74HC595,功能一致,就不深究了
这里有一个问题:使用IC可以简化电路,相当于是将一些硬件功能集成在一个小的IC里面,用户只需要搭建有关电路,操作一些特定的引脚,输入特定的信号就可以使用这一功能。但IC的功能比较单一,专向性比较强。那单片机和IC组合使用的时候,是把IC当作单片机的拓展,还是让单片机当作控制IC的大脑?若有大佬愿意回答,不胜感激。
本质上就是让51单片机向LED发出一个高电平信号,使得LED两端产生电压,进而产生电流点亮LED。
这里书上写得很好,一定要看清电路再编写程序。如果LED右边是电源,那就需要低电平。
2.2代码实现
相关的代码粘贴于此:
LED点亮实验:
#include <REGX51.H>//LED点亮实验
int main(){
P2 = 0x01; //8号灯亮,16进制转2进制b(00000001)
return 0;
}
流水灯实验:
#include <REGX51.H> //流水灯实验
int counter = 0; //设定计数变量
void Delay100ms() { //@12.000MHz,延时函数,stc—isp自动生成的
unsigned char i, j;
i = 195; j = 138;
do{ while (--j);
} while (--i);
}
int main(){ //主函数
while(1){
P2 = 0x01 << counter; //左移一位,如果电位相反就要取反
Delay100ms(); //延时100ms
counter ++;
if (counter >= 8) counter = 0; //计数清零,让流水灯回到原点
}
return 0;
}
3.总结
第一个项目算是温故复习,并没有什么错误,实验现象很符合,对知识有了更深的理解。