微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机教程二、单片机内部结构及基本概念 张飞实战电子

单片机教程二、单片机内部结构及基本概念 张飞实战电子

时间:10-02 整理:3721RD 点击:
一、单片机内部结构分析 我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。

二、几个基本概念

1、数的本质和物理现象。

我们知道,计算机可以进行数学运算,这可令我们非常的难以理解,计算机吗,我们虽不了解它的组成,但它总只是一些电子元器件,怎么可以进行数学运算呢?我们做数学题如37+45是这样做的,先在纸上写37,然后在下面写45,然后大脑运算,最后写出结果,运算的原材料:37、45和结果:82都是写在纸上的,计算机中又是放在什么地方呢?为了解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有两种状态,我们可以用’0’和’1’来代替这两种状态,规定亮为’1’,不亮为’0’。现在放上两盏灯,一共有几种状态呢?我们列表来看一下:


请大家自已写上3盏灯的情况000 001 010 011 100 101 110 111

我们来看,这个000,001,101 不就是我们学过的的二进制数吗?本来,灯的亮和灭只是一种物理现象,可当我们把它们按一按的顺序排更好后,灯的亮和灭就代表了数字了。让我们再抽象一步,灯为什么会亮呢?看电路1,是因为输出电路输出高电平,给灯通了电。因此,灯亮和灭就可以用电路的输出是高电平还是低电平来替代了。这样,数字就和电平的高、低联系上了。(请想一下,我们还看到过什么样的类似的例子呢?(海军之)灯语、旗语,电报,甚至红、绿灯)


2、位的含义:

通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低,可以代表两种状态:0和1。实际上这就是一个二进制位,因此我们就把一根线称之为一“位”,用BIT表示。

3、字节的含义:


一根线可以表于0和1,两根线可以表达00,01,10,11四种状态,也就是可以表于0到3,而三根可以表达0-7,计算机中通常用8根线放在一起,同时计数,就可以表过到0-255一共256种状态。这8根线或者8位就称之为一个字节(BYTE)。


存储器的工作原理:


1、存储器构造

存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的1234这样的数字,这样,我们的一个谜团就解开了,计算机也没什么神秘的吗。




如上图左所示:一个存储器就象一个个的小抽屉,一个小抽屉里有八个小格子,每个小格子就是用来存放“电荷”的,电荷通过与它相连的电线传进来或释放掉,至于电荷在小格子里是怎样存的,就不用我们操心了,你可以把电线想象成水管,小格子里的电荷就象是水,那就好理解了。存储器中的每个小抽屉就是一个放数据的地方,我们称之为一个“单元”。


有了这么一个构造,我们就可以开始存放数据了,想要放进一个数据12,也就是00001100,我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了(看上图右)。可是问题出来了,看上图右,一个存储器有好多单元,线是并联的,在放入电荷的时候,会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的,因此,要在结构上稍作变化,看上图右,在每个单元上有个控制线,我想要把数据放进哪个单元,就给一个信号这个单元的控制线,这个控制线就把开关打开,这样电荷就可以自由流动了,而其它单元控制线上没有信号,所以开关不打开,不会受到影响,这样,只要控制不同单元的控制线,就可以向各单元写入不同的数据了,同样,如果要某个单元中取数据,也只要打开相应的控制开关就行了。(张飞实战电子:欢迎咨询QQ:437521793 )

2、存储器译码

那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元元的控制线都引到集成电路的外面不就行了吗?事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。我们有一种方法称这为译码,简单介绍一下:一根线可以代表2种状态,2根线可以代表4种状态,3根线可以代表几种,256种状态又需要几根线代表?8种,8根线,所以65536种状态我们只需要16根线就可以代表了。

(张飞电子工程师速成视频教程第一部下载地址:http://pan.baidu.com/s/1o681lVk   )


3、存储器的选片及总线的概念

至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外,还要接其它的器件,如图4所示。这样问题就出来了,这八根线既然不是存储器和计算机之间专用的,如果总是将某个单元接在这八根线上,就不好了,比如这个存储器单元中的数值是0FFH另一个存储器的单元是00H,那么这根线到底是处于高电平,还是低电平?岂非要打架看谁历害了?所以我们要让它们分离。办法当然很简单,当外面的线接到集成电路的引脚进来后,不直接接到各单元去,中间再加一组开关就行了。平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通就行了。这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。读和写信号同时还接入到另一个存储器,但是由于片选端不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不同时选中两片芯片呢?只要是设计好的系统就不会,因为它是由计算控制的,而不是我们人来控制的,如果真的出现同时出现选中两片的情况,那就是电路出了故障了,这不在我们的讨论之列。

从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大家共用的,所以我们称之为数据总线,总线英文名为BUS,总即公交车道,谁者可以走。而十六根地址线也是连在一起的,称之为地址总线。

(张飞实战电子:欢迎咨询QQ:437521793 )


张飞电子工程师速成视频教程第一部下载地址:



4月11日,摩尔吧牵手上海IC咖啡吧硬件设计开发知名讲师张飞联合举办摩尔吧线下沙龙——硬件研发与设计,沙龙主题内容涉及硬件设计开发技术深度分享和电子工程师创业交流两部分,让处于迷茫期的电子工程师对自己的职业有更前瞻的规划,更清晰的蓝图,更睿智的眼光。欢迎报名咨询。
摩尔吧在线报名网址:





活动布置:







老师又开始连载这个了哈, 谢谢老师!

恩恩~~~学习过程中有什么问题,你可以咨询这个  张飞QQ:43752179

我已经加了老师的QQ了呢,谢谢老师。

张飞电子工程师速成视频教程第一部下载地址:http://pan.baidu.com/s/1o681lVk   

福利来啦~~张飞老师在电子发烧友上为大家做高手问答;主要是关于电感降压式BUCK电路设计这方面的,表示众多问题想要去咨询,给大家分享一下!http://bbs.elecfans.com/jishu_470588_2_1.html#comment_top
互动奖励规则:
        1、在论坛帖子中回帖,参与互动
        2、关注我们的新浪微博 :电子发烧友官网, 并转发特定的微博@三位好友,参与互动
        以上形式任意一种参与活动,均有机会获得张飞老师提供的五部视频教程

谢谢分享,学习一下

  一般情况下,LCD1602与单片机连接的线路共有11条,其中有8条数据线,3条控制线(其余的5条为电源和地)。如果把它们都连接上,将占用较多的单片机的接口。那么如何减少接口呢?
       LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。那么,LCD1602和单片机之间就仅仅需要6条线了,这算是一种比较简洁的接法了。
      下面的一个例子是使用P1口的高4位连接到LCD1602的高4位数据线。
源代码:   1602.c (4.39 KB, 下载次数: 55)
对应的原理图:   51start单片机开发板V3.0.pdf (805.5 KB, 下载次数: 151)
(备注:程序中只使用了八位数据线的高四位)
/*==========================================================
* 开发人员:laowang
* 当前版本:V1.0
* 创建时间:12/8/2013
* 修改时间:
* 功能说明:让1602显示“51Start:” “the best one!”
*==========================================================*/                                
* 数据口:P1.4-P1.7
* 控制口:lcdrs=P3^2   lcdrw=P3^3    lcden=P3^4
* 传输方式:并口,四线(高四位)
*==========================================================*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
                                                                 
sbit lcdrs=P3^2;                                                   //数据/命令选择端,低电平为指令,高电平为数据
sbit lcdrw=P3^3;                                                   //读写控制端,低电平为写
sbit lcden=P3^4;                                                   //使能端
uchar code table1[]="    51Start:    ";
uchar code table2[]="  the best one! ";
void delay(uint x)                                                 //延时 x 毫秒
{
          uint i,j;
          for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}
/*==========================================================   
*函数名称:Lcd_1602_write(uchar com,date)
*功    能:向1602写数据/指令
*入口参数:com(com=0 写命令  com=1 写数据)
*出口参数:
*说    明:四线用的是1602的高四位DB4-DB7,单片机的数据口为P1口的高四位P1.4-P1.7
*==========================================================*/
void Lcd_1602_write(uchar com,date)                    
{
          uchar i;
          lcdrw=0;                                                  //设置为写
          lcdrs=com;                                                  //将形参传给lcdrs
          for(i=0;i<2;i++)                                  //每次写四位,写完一个数据/命令(8位)需要两次
          {   
       lcden=1;
       P1=(P1&0x0f)|(date&0xf0);         //将date的高四位送入P1,同时保持P1的低四位不变
                                                                           //如果使用P1的低四位的话,则该处应该改为:P1=(P1&0xf0)|((date>>4)&0x0f);
       delay(3);                               //适当延时,数据稳定
       lcden=0;                                        //送入数据
       date<<=4;                                 //低四位左移到高四位
          }
}
/*==========================================================   
*函数名称:void Lcd_1602_init()
*功    能:对1602进行初始化
*入口参数:
*出口参数:
*说    明:用四线时,1602的初始化只需要高四位数据就可以完成,在初始化完成之后必须再传入四位数据,需注意。
*          执行完write_1602(0,0x28);之后液晶已经初始化,其实在执行了一半的时候就已经初始化完成,此时又传入了
                         四位数据(一个写语句会传入8位数据),这时候如果直接写数据的话,就会形成乱码
*==========================================================*/
void Lcd_1602_init()
{                                                                                          
          Lcd_1602_write(0,0x28);                                //0x28=0010 1000,将液晶设置为16*2显示,5*7点阵,4位数据口
        delay(5);                                                //
        lcden=1;                                         //
        lcden=0;         
        Lcd_1602_write(0,0x28);                   //显示方式设置
          Lcd_1602_write(0,0x0e);                   //设置开显示,不显示光标
          Lcd_1602_write(0,0x06);                   //默认(0x06)写入新数据后光标右移 屏幕不移动
          Lcd_1602_write(0,0x01);                   //显示清0,数据指针清0            
}
//主函数
void main()
{   
        uchar num;
          Lcd_1602_init();            
           Lcd_1602_write(0,0x80);                    //第一行
           for(num=0;num<16;num++)
    {      
       Lcd_1602_write(1,table1[num]);        //写数据
       delay(3);
    }
    Lcd_1602_write(0,0xc0);                         //第二行
    for(num=0;num<16;num++)
    {
       Lcd_1602_write(1,table2[num]);
       delay(3);
    }
    while(1);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top