热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单片机基础知识,存储原理,引脚简介———(第一个小程序)

之前C语言已经告一段落,现在我们学习单片机首先,我们要了解怎样学习单片机!1.单片机简介和发展历程?这里就不说这些废话了。。。。。。。2.学习单片机需要哪些基本条件?

之前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
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行的代码;

 

关于这个延时程序我们后期会详细分析。

 

 

 

 

 

 

 

 


推荐阅读
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
author-avatar
mrkly_825
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有