赞
踩
来自郭天祥老师的《十天学会单片机》学习教程,型号STC89C52。
学习流程,开发软件Keil U5,keil项目内编程后生成hex文件,烧写进TX学习板,观察现象。
大一时为了进学校的AT社团,学习过几天,可惜没坚持下来,最后社团考试也没考过,所以就搁置了51的学习,当时的目光还是太短了,学东西坚持不下来,这也算是大学里的一个遗憾吧。
然后现在把当初学的一点东西也忘光了。
51单片机的开发作为嵌入式最基础的入门技能之一,必须将其全部掌握,才能更好地进行下一步STM32的学习,还有后面的嵌入式Linux。
加油,慢慢干!
总线(BUS):是计算机各部件之间传送信息的公共通道。微机中有内部总线和外部总线两类。内部总线是CPU内部之间的连线。外部总线是指CPU与其它部件之间的连线。外部总线有三种:数据总线DB(Data Bus),地址总线AB(Address Bus)和控制总线CB(Control Bus)。
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/0口,既可用作输入,也可用作输出;
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。
C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等。
C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。
C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。
C-51与ASM-51相比,有如下优点:
1.对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解; 2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理; 3.程序有规范的结构,可分成不同的函数,这种方式可使程序结构化; 4.提供的库包含许多标准子程序,具有较强的数据处理能力; 5.由于具有方便的模块化编程技术,使已编好程序可容易地移植;
扩充的定义
sfr:特殊功能寄存器声明
sfr16:sfr的16位数据声明
sbit:特殊功能位声明(用得较多)
bit:位变量声明
例如:
sfr SCON=0X98;
sfr16 T2=0xCC;
sbit OV=PSW^2;(PSW寄存器的第2位定义为OV)
最小系统搭建
电源
晶振电路
复位电路
I/O口的操作
输出控制电平高低
输入检测电平高低
定时器
熟练掌握方式2
中断
外部中断,定时器中断,串口中断
串口通信
单片机之间,单片机与计算机之间
点亮一个LED.
外围电路:LED二极管的正极经过上拉电阻,接5v的电源,负极接到单片机的P1.0到P1.7口。要点亮led,只要使单片机对应I/O口置0即可。
注意:
1. 上拉电阻用来增加电流,IO口输出电流不够,需要上拉电阻电路来帮助点亮发光管。
2. 单片机IO口一开始是默认输出高电平,通过编程代码来控制其输出低电平。
代码:
- #include<reg52.h> //reg52.h,函数,应用于程序设计,是用于单片机(C51)开发的一种c语言的头文件。
- sbit D1 = P1^0; //将D1定义为单片机的P1.0输出口
- void main(){
- D1 = 0; //D1置0,输出低电平
- }
振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,TX实验板上为11.0592MHZ。
状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。
指令周期: 它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是有一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。
单片机周期由硬件决定,编程时要把工程文件对应的晶振频率设置的和单片机相同。
延时工作原理,单片机执行一条指令的时间大致是一个固定的范围,用while循环或for循环,来执行若干条判断操作,来实现一个延时的操作。单片机晶振为11.0592MHz,执行51000条while判断的时间大致是500ms.
- #include<reg52.h>
- sbit p1_1 = P1^0;
- unsigned int a; //全局变量a
- void main(){
- while(1){ //用while死循环,让单片机执行完最后一条指令后返回第一条
- a = 51000;
- p1_1 = 0; //使P1.0口置0,点亮LED
- while(a--); //单片机晶振为11.0592MHz,执行51000条while判断的时间大致是500ms
- a = 51000; //置1熄灭LED
- p1_1 = 1;
- while(a--);
- }
- }
设置断点
设置完先进行编译操作
再进入调试
这里的编译按钮,会变成全速执行和单步执行
左侧可以查看各个寄存器的状态,还有执行时间等信息
注意:修改内容后,要重新编译再进行调试!
以上为驱动电路。基极B接到单片机的P2.3口,如果是低电平0,则EC之间导通,蜂鸣器发声;如果是高电平1,则EC不导通,蜂鸣器不发声。代码如下,LED流水灯间隔点亮,点亮的同时蜂鸣器发声。
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar temp;
- sbit beep = P2^3;
- void delay(uint);
- void main(){
- temp = 0xfe;
- while(1){
- P1 = temp;
- temp = _crol_(temp,1); //循环左移
- beep = 0;
- delay(300);
- beep = 1;
- delay(300);
- }
- }
- void delay(uint z){ //延时函数,具体需要多少时间,要实际一点一点凑出来
- uint x,y;
- for(x = 100; x>0; x--){
- for(y = z; y>0; y--);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。