51单片机学习记录(Day1-Day2)

来自郭天祥老师的《十天学会单片机》学习教程,型号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口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。

C51开发:

C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等。

C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。

C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。

C-51与ASM-51相比,有如下优点:

1.对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解; 2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理; 3.程序有规范的结构,可分成不同的函数,这种方式可使程序结构化; 4.提供的库包含许多标准子程序,具有较强的数据处理能力; 5.由于具有方便的模块化编程技术,使已编好程序可容易地移植;

数据类型及扩展定义:

51单片机学习记录(Day1-Day2)_第1张图片

 扩充的定义

sfr:特殊功能寄存器声明

sfr16:sfr的16位数据声明

sbit:特殊功能位声明(用得较多)

bit:位变量声明

例如:

sfr SCON=0X98;

sfr16 T2=0xCC;

sbit OV=PSW^2;(PSW寄存器的第2位定义为OV)

学习概述:

最小系统搭建

  1. 电源

  2. 晶振电路

  3. 复位电路

51单片机学习记录(Day1-Day2)_第2张图片

 I/O口的操作

  1. 输出控制电平高低

  2. 输入检测电平高低

定时器

        熟练掌握方式2

中断

        外部中断,定时器中断,串口中断

串口通信

        单片机之间,单片机与计算机之间

Day1

点亮一个LED.

外围电路:LED二极管的正极经过上拉电阻,接5v的电源,负极接到单片机的P1.0到P1.7口。要点亮led,只要使单片机对应I/O口置0即可。

注意:

1. 上拉电阻用来增加电流,IO口输出电流不够,需要上拉电阻电路来帮助点亮发光管。

2. 单片机IO口一开始是默认输出高电平,通过编程代码来控制其输出低电平。

代码:

#include    //reg52.h,函数,应用于程序设计,是用于单片机(C51)开发的一种c语言的头文件。
sbit D1 = P1^0;    //将D1定义为单片机的P1.0输出口
void main(){
    D1 = 0;        //D1置0,输出低电平
}

Day2

周期的概念:

  1. 振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,TX实验板上为11.0592MHZ。

  2. 状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。

  3. 机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。

  4. 指令周期: 它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是有一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。

单片机周期由硬件决定,编程时要把工程文件对应的晶振频率设置的和单片机相同。

延时工作原理,单片机执行一条指令的时间大致是一个固定的范围,用while循环或for循环,来执行若干条判断操作,来实现一个延时的操作。单片机晶振为11.0592MHz,执行51000条while判断的时间大致是500ms.

实验1:使LED灯闪烁。

#include
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--);	
}
}

Keil调试方法:

设置断点

51单片机学习记录(Day1-Day2)_第3张图片

设置完先进行编译操作

51单片机学习记录(Day1-Day2)_第4张图片

再进入调试 

51单片机学习记录(Day1-Day2)_第5张图片

 这里的编译按钮,会变成全速执行和单步执行

51单片机学习记录(Day1-Day2)_第6张图片

左侧可以查看各个寄存器的状态,还有执行时间等信息

51单片机学习记录(Day1-Day2)_第7张图片

注意:修改内容后,要重新编译再进行调试!

实验2:蜂鸣器的使用

51单片机学习记录(Day1-Day2)_第8张图片

 以上为驱动电路。基极B接到单片机的P2.3口,如果是低电平0,则EC之间导通,蜂鸣器发声;如果是高电平1,则EC不导通,蜂鸣器不发声。代码如下,LED流水灯间隔点亮,点亮的同时蜂鸣器发声

#include
#include
#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--);
}
}

循环左移函数实现流水灯的原理:

51单片机学习记录(Day1-Day2)_第9张图片

你可能感兴趣的:(c语言,51单片机)