单片机-基础知识,存储原理,引脚简介———(第一个小程序)
之前C语言已经告一段落,现在我们学习单片机
首先,我们要了解怎样学习单片机!
1. 单片机简介和发展历程?
这里就不说这些废话了。。。。。。。
2. 学习单片机需要哪些基本条件?
模拟电路,数字电路基础,对C语言或汇编语言有一定的了解。当然,这些也可以在学习过程中掌握。以后我都会讲解的。
硬件条件的话:电脑一台,实验开发平台一套。
3、单片机的结构
一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。
4、MCS51单片机和8051、8031、89C51等单机片有什么不同
这里我们以后再做介绍,这里不需要了解。
//________________________________________________________________________________________________________________________________________
其次,我们要学C语言,而且要学好!C语言很简单,单一很重要!
同时,你还得了解汇编,实际上不是了解汇编指令,而是为了了解单片机的体系结构
最后,我们来了解单片机引脚:
下图:
0
121
单片机的40个引脚总的可分为4类:电源、时钟、控制和I/O引脚。
⒈ 电源: a)_ VCC – 芯片电源,接+5V; b)_ VSS – 接地端;
⒉ 时钟:XTAL1、XTAL2 ——晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根:
a)_ ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
b)_ PSEN:外ROM读选通信号。
c)_ RST/VPD:复位/备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VPD功能:在Vcc掉电情况下,接备用电源。
d)_ EA/Vpp:内外ROM选择/片内EPROM编程电源。 ① EA功能:内外ROM选择端。 ② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线 80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
电源:是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。
振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶体震荡器,电容,连上就能了,按上面的图接上即可。
复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
EA管脚:EA管脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工作了。
OK,上面引脚介绍可能你又产生了很多疑问!下面我们实战一下:
我们任务是让单片机的第一个引脚控制一个LED灯点亮和熄灭。怎么做?
如下图:
首先,第一个引脚我们规定叫做P1.0(这是规定)
各个所需原件接入P1.0,如果P1.0引脚是高电平,此时灯就不会亮,相反P1.0引脚是低电平,灯就亮了。
问题是怎样控制P1.0引脚呢?
我们的指令STEB P1.0控制高电平; CLR P1.0控制低电平;
但我们的计算机不能读取这些指令,它只能读取数字,而我们的C51芯片读取数字指令也有一些规定的;
我们得通过编程器把SETB P1.0变为(D2H,90H ),把CLR P1.0变为 (C2H,90H )写入单片机中。
就是把你在电脑上写出来来的代码用汇编器等编译器生成的一个目标烧写到单片机的eprom里面去的工具
到这里第一步就完成了。
存储原理
ok,我们编译的代码既然能控制灯亮或者灭,那么代码是怎么存入单片机中的呢?
这里我们引入一个专业术语:ROM-只读存储器;
这里的只读指的是在单片机中运行中只能读取里面的内容,但是我们编译的代码在编译器上是可以存入的(不然单片机怎么控制LED灯?)
那么在ROM中是怎么存的呢?
实际上同学们了解到我们是通过电平高低控制LED灯的(其它元件一般也是),我们规定1代表高电平,0代表低电平,那么我们就只需要存1、0就可以。
在ROM中,内存好比是在一个抽屉中有很多排条形槽,每个条形槽中又分为八个格子。这里为什么是八个格子我也不知道,这是规定。但我们要了解的是怎么把数字存入这些格子中(计算机只认识数字)
如果我们要存数字10;
首先,我们要将10转成二进制——00001010(在我之前文章中专门讲过)
那么我们就分别在这八个格子中存入相应的0、1;
通电,将电荷存入格子中,所有格子有电荷额就是存的1,空的就存的0;
但是我们电路都是以并联的形式,要么输入电荷。
此时就需要另外的信号线接在格子上,控制格子开关。进而控制电荷进入格子中。
我们怎样来控制各个单元的控制线呢?
把每个单元元的控制线都引到集成电路的外面不就行了吗?
事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。我们有一种办法称这为译码,简单介绍一下:一根线能代表2种状态,2根线能代表4种状态,3根线能代表几种,256种状态又需要几根线代表?8种,8根线,所以65536种状态我们只需要16根线就能代表了。
存储器有很多,RAM,PROM,EPROM,EEPROM,FLASH……..在后期我们介绍这些存储器,对于随机存储器RAM你要理解也不是很难的。
这里就介绍了ROM的存储原理
第一个小程序
虽然之前我们能控制灯的亮或者灭。
但是,这里灯只能亮一次;
现在我们任务升级,让灯闪烁;
那么步骤就变成了:SETB P1.0 延长时间 CLR P1.0 循环执行;
;主程序:
LOOP: SETB P1.0 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P1.0 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
AJMP LOOP ;(5)跳转到第一句LOOP处
;以下子程序
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END
对于上面的代码,我们先必须得了解一些指令:
AJMP转移命令;
LCALL调用子程序;
显而易见,第五条指令一直转移到第一条指令,所以主程序一直处于循环状态,
然后第二条指令在调用DELAY这个子程序,
至于子程序DELAY里面的内容我们以后再讲,你只需要知道这是用来延长时间的。
这样,可以循环有频率的控制P1.0的电压,从而控制LED灯的闪烁。
我们用C语言来写:
#include <at89x52.h>
void DELAY() //延时函数
{ unsigned char i,j;
for(i=0;i<250;i++)
{
for(j=0;j<200;j++);
}
}
void main() //程序从这里开始执行
{
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句
{
P1_0=1; //(1)熄灭灯
DELAY(); //(2)延时一段时间
P1_0=0; //(3)点亮灯
DELAY(); //(4)延时一段时间
}
}
大家不必在意其它,懂它的原理就可以了。当然,这只是C语言中的原理。
我们回到上面的子程序中
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END
我之前介绍了主程序的一些指令,我相信大家都能懂。
对于子程序,我们首先要了解:R6,R7代表什么?
459+889=?结果是什么呢?你会说:1348;
正确!计算机也是能直接算出1348;
那么:459+889+743=?结果是?————2091;你会先算459+889=1348;然后算1348+743=2091;
计算机也是,不过先前的结果1348算出了后放在哪里?ROM?
不行,ROM是只读的。
对,RAM(随机存储器)。RAM会分出一部分内存来寄存1348,在取出1348加入后面的运算。分出的内存叫寄存区。
现在我可以告诉你R6,R7就在这个寄存区中。
我们其次了解一下:DELAY(子程序名称,主程序要调用的);D1(标识符,相当于一个id名,标注一个行,后面的可以根据这个标识直接转移又执行这行代码);D2(和D1一样);RET(子程序结束);END(程序结束);
MOV指令代表:传递数据; 后面有传递者,接受者,数据;
MOV R7,#250:这里省略了传递者(不代表任意代码都可以省),“#”标识“250”是被传递的数,R7是接受者;
DJNZ指令代表:有转移执行的意思;
DJNZ R6,D2:这里表示将第一个参数R6中的值减1,如果等于0就执行下一句代码,否则执行D2行的代码;
关于这个延时程序我们后期会详细分析。