EDN首页   博客首页

1

关于投票
关于单片机的一些基本概念
关于单片机的一些基本概念
一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(能有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。

  二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的──数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不能由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元能由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不一样的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:

1·地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。

2·方式字或控制字(如MOV TMOD,#3),3即是控制字。

3·常数(如MOV TH0,#10H)10H即定时常数。

4·实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。

理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。

  三、P0口、P2口和P3的第二功能使用办法 开始学习时一般对P0口、P2口和P3口的第二功能使用办法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有对应的信号从P3.6或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用I/O口使用。你完全能在指令中按排一条SETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会这么去做,因为这常常这会导致系统的崩溃(即死机)。

  四、程序的执行过程 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000’,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’这个单元,并且在‘0000’单元中存放的一定是一条指令。

  五、堆栈 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值能用指令加以改变,所以只要在程序开始阶段更改了SP的值,就能把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的浑乱。不一样作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是能象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。

  六、单片机的开发过程 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就能写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:

表1

ORG 0000H

LJMP START

ORG 040H

START:

MOV SP,#5FH ;设堆栈

LOOP:

NOP

LJMP LOOP ;循环

END ;结束

表2

:03000000020040BB

:0700400075815F000200431F

表3

02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43

表1为源程序,表2是汇编后得到的HEX文件,表3是由HEX文件转换成的目标文件,也就是最终写入EPROM的文件,它由编程器转换得到,也能由HEXBIN一类的程序转换得到。学过手工汇编者应当不难找出表3与表1的一一对应关系,值得注意的是从02 00 40后开始的一长串‘FF’,直到75 81,这是由于伪指令:ORG 040H造成的结果。

  七、仿真、仿真机 仿真是单片机开发过程中非常重要的一个环节,除了一些极简单的任务,一般产品开发过程中都要进行仿真,仿真的主要目的是进行软件调试,当然借助仿真机,也能进行一些硬件排错。一块单片机应用电路板包括单片机部份及为达到使用目的而设计的应用电路,仿真就是利用仿真机来代替应用电路板(称目标机)的单片机部份,对应用电路部份进行测试、调试。仿真有CPU仿真和ROM仿真两种,所谓CPU仿真是指用仿真机代替目标机的CPU,由仿真机向目标机的应用电路部份供给各种信号、数据,进行调试的办法。这种仿真能通过单步运行、连续运行等多种办法来运行程序,并能观察到单片机内部的变化,便于改正程序中的错误。所谓ROM仿真,就是用仿真机代替目标机的ROM,目标机的CPU工作时,从仿真机中读取程序,并执行。这种仿真其实就是将仿真机当成一片EPROM,只是省去了擦片、写片的麻烦,并没有多少调试手段可言。常常这是二种不一样类型的仿真机,也就是说,一台仿真机不能既做CPU仿真,又做ROM仿真。可能的情况下,当然以CPU仿真好。以上是本人对单片机的理解,如有不对之处,请诸位大侠多多指点。发表您的高论。

系统分类: 单片机
用户分类: 单片机
标签: 单片机
来源: 无分类
发表评论 阅读全文(154) | 回复(0)

1

关于投票
AT89S51并口下载线
AT89S51并口下载线

可配套使用ATMEL原版软件,适用芯片包括 AT89S51,AT89S52,AT89S53,AT89S8252,AT89S8253,AT89LP2052,AT89LP4052,AT89LS53,AT89LS8252,AT89S2051,AT89S4051可进行程序下载,适用89S51系列芯片。

系统分类: 单片机
用户分类: 单片机
标签: AT89S51
来源: 无分类
发表评论 阅读全文(170) | 回复(0)

0

关于投票
OLED显示模块与C8051F单片机的接口设计

摘要:OLED作为新一代显示技术,广泛用于各种仪器仪表的显示终端,实时显示字符、汉字、曲线等信息。文中介绍一种点阵式OLED模块VGS12864E的结构特征、指令系统;给出它与Cygnal C8051F020单片机的间接访问接口电路设计,以及显示模块的硬件驱动和显示16×8点阵西文字符的Keil C51程序代码,并对相关代码进行注释。由于此款显示模块的指令系统与液晶显示驱动控制器HD61202兼容,故程序代码也可作为指令系统与它兼容的液晶显示编程的参考。

关键词:点阵显示模块 OLED C8051F 接口设计

  有机发光显示OLED(Organic Light Emitting Display)是比液晶显示技术更为先进的新一代平板显示技术,是被业界公认为最具发展前景的下一代显示技术。它与液晶显示技术相比,具有超轻薄、高亮度、广视角、自发光、响应速度快、适应温度范围宽、抗震强、功耗低、可实现柔软显示等优越性能,可广泛应用于通信、计算机、消费电子、工业应用、商业、交通等领域。下面以VGS12864E显示模块为例,介绍C8051F020单片机与它的接口设计及软件编程方法。

1 VGS12864E显示模块

  VGS12864E是128×64行点阵的OLED单色、字符、图形显示模块。模块内藏64×64的显示数据RAM,其中的每位数据都对应于OLED屏上一个点的亮、暗状态;其接口电路和操作指令简单,具有8位并行数据接口,读写时序适配6800系列时序,可直接与8位微处理器相连;与Intel 8080时序的MCU连接时需要进行时序转换。

2 显示模块结构

2.1 模块框图

  VGS12864E显示模块显示屏为128列、64行,使用1片有64行输出的行驱动器和2片列驱动控制器,其中每片列驱动器有64路输出。行驱动器与MCU没有关系,只要提供电源就能产生驱动信号和同步信号,模块的外部信号仅与列驱动器有关。列驱动器内置64×64位显示存储器,RAM被分为8页,每页8行;显示屏上各像素点显示状态与显示存储器各位数据一一对应,显示存储器的数据直接作为图形显示的驱动信号,为“1”显示,为“0”不显示。图1为模块的逻辑电路接口框图。

2.2 模块引脚功能及指令系统

  模块引脚功能如表1所列。模块的指令系统与液晶显示驱动控制器HD61202兼容,共有7条指令。这里不作详细描述,仅列出表2指令列表。其中,前两条为显示状态设置类指令,其余的为读写操作类指令。

                  表1VGS12864E引脚功能

3 显示模块与Cygnal单片机硬件接口设计

  VGS12864E的接口连接方式有两种:一种是直接访问方式,另一种是间接访问方式。不论哪种方式,要访问模块都必须先读取状态寄存器内容,判断“忙”标志,不忙时才可以访问。直接访问方式是将模块接口作为存储器或I/O设备直接挂在MCU总线上,MCU以访问存储器或I/O设备方式对模块进行操作。间接访问方式是MCU通过软件模拟控制时序对模块进行操作。这里介绍的是Cygnal C8051F020单片机与VGS12864E的间接访问接口设计。

  C8051F020是美国Cygnal公司推出的一种混合信号SoC型8位单片机,是集成度很高的混合信号系统级的芯片。它具有100脚的TQFP封装,功耗低,供电电压为2.7~3.3 V,全部I/O、RST、JTAG引脚均耐5 V电压;有高速、流水线结构的8051兼容的CIP51内核(可达25 MIPS)。该MCU具有P0~P7共64个通用I/O端口,每个端口引脚都可以被配置为推挽输出或漏级开路输出。对于VGS12864E,由于其工作电压是5 V,而C8051F020的工作电压是3.3 V,所以要C8051F020的输出能更好地驱动5 V输入的OLED,需要对系统进行额外配置。除了将对应端口的输出方式设置为“漏极开路”外,还应在电路上将每个端口通过一个上拉电阻接到5 V电源,这样可以保证C8051F020的逻辑“1”输出能够被提升到5 V。接口电路如图2所示。

4 软件编程

  软件编程采用Keil C51语言,包括显示模块硬件的驱动程序(即写指令和写数据),显示模块初始化和清屏等通用子程序以及西文字符的显示实现程序。由于此模块指令系统与液晶显示驱动控制器HD61202兼容,故这些程序具有较高的通用性。对于字符汉字显示,该模块的字符库数据特点是以列数据形式编制,即1个字节数据表示1列8×1的数据,和通常的字符库相比,该字符是旋转了90°的字模数据。使用Zimo21.exe取字模软件,并设置提取方式为纵向取模,可以很方便地取得所需的中西文字模。由于该显示模块的每一列8×1的数据是低位在前,高位在后,为进一步实现中西文的正确显示,还需对通过上述方法取得的字模的每个字节的高低位进行一次对调,程序中使用了一个数组UpsetChar[]来实现。程序中使用的西文字符是16×8点阵,汉字是16×16点阵。

  Cygnal单片机通过间接访问方式控制OLED。其I/O端口需要进行配置,配置如下:

void C8051F020_output_config() {
  P2MDOUT = 0x00; //配置P2.5(lcd_wr),P2.6(lcd_rd),
          //P2.7(lcd_rs)为推挽输出方式
  P74OUT = 0xf3; //配置P5.0~P5.7(lcd_d0 lcd_d7)
          //为推挽输出方式
}

  对显示模块进行写指令操作和写数据操作分为写左半屏和写右半屏。写左右半屏的差别仅在于置位相应的片选信号,而写指令与写数据的差别在于写数据时置位RS寄存器选择信号。初始化操作完成显示位置的确定和打开显示。现以写左半屏命令和写左半屏数据为例,说明各操作函数。

图2C8051F020与VGS12864E间接访问方式接口电路

(1) 写左半屏命令
void wr_command1() {
  cs1=1; cs1=1; cs1=1;  //选择左半屏
  cs2=0; cs2=0; cs2=0;
  read_status();     //读BUSY位状态
  r_w=0; r_w=0; r_w=0;
  P5=com;         //将命令字节送I/O口
  e=1; e="1"; e="1";
  e=0; e="0"; e="0";     //在E下降沿,命令字节被写
              //入列驱动器
}

(2) 写左半屏数据
void wr_data1() {
  cs1=1; cs1=1; cs1=1;  //选择左半屏
  cs2=0; cs2=0; cs2=0;
  read_status();     //读BUSY位状态
  d_i=1; d_i=1; d_i=1;
  r_w=0; r_w=0; r_w=0;
  P5=dat;         //将数据字节送I/O口
  e=1; e="1"; e="1";
  e=0; e="0"; e="0";     //在E下降沿,数据字节被写
              //入列驱动器
}
  其中,读状态位的函数采用查询标志位的方式,即
void read_status() reentrant {
  uchar busy;
  uchar temp;
  d_i=0; d_i=0; d_i=0;  //进行指令操作
  r_w=1; r_w=1; r_w=1;  //进行读操作
  do {
    P5=0xff;
    e=1; e="1"; e="1";
    busy=P5;      //读入P5端口状态
    e=0; e="0"; e="0";
    temp=busy&0x80;
  }while(temp!=0);
}

(3) OLED初始化
void init_lcd() {
  com=0xc0;       //从第0行开始
  wr_command1();
  wr_command2();
  com=0x3f;       //打开显示
  wr_command1();
  wr_command2();
}

(4) OLED清屏
void clear_lcd() {
  uchar column1;
  uchar page;
  for(page=0;page<8;page++) {
    com=(0xb8+page); //设置页号
    wr_command1();
    wr_command2();
    com=0x40;     //设置起始列为0,写操作完
             //后列地址计数器自动加1
    wr_command1();
    wr_command2();
    for(column1=0;column1<64;column1++) {
             //清左半屏
      dat=0;
      wr_data1();
    }
    for(column1=64;column1<128;column1++) {
             //清右半屏
      dat=0;
      wr_data2();
    }
  }
}

(5) 显示16×8字符的程序
void lcd_write_char_code(uchar page8,uchar column8,uchar* block168) reentrant {
  uchar column1;
  set_position(page8,column8);//设置所写字符起始页位置
  for(column1=0;column1<8;column1++) {
    dat=block168[column1];
             //从字库中取出上半页8×8点阵字模数据
    dat=UpsetChar[dat];
             //将每个字节数据高低位进行对调
    if(column8<=7)
             //如果设置的所写位置在左半屏,调用写左半屏
             //数据的函数
      wr_data1();
    else
             //如果设置的所写位置在右半屏,调用写右半屏
             //数据的函数
      wr_data2();
  }
  page8++;
  set_position(page8,column8);//设置所写字符下半页位置
  for(column1=8;column1<16;column1++) {
    dat=block168[column1];
             //从字库中取出下半页8×8点阵字模数据
    dat=UpsetChar[dat];
             //将每个字节数据高低位进行对调
    if(column8<=7)
             //如果设置的所写位置在左半屏,调用写左半屏
             //数据的函数
      wr_data1();
    else
             //如果设置的所写位置在右半屏,调用写右半屏数据的函数
      wr_data2();
  }
}

5 结论

  OLED显示技术有着广泛的应用前景。采用此技术的VGS12864E显示模块具有与MCU接口方便、显示功能强和编程简单等优点,具有广泛的应用价值。上面介绍的接口设计与软件编程已成功应用于数据采集系统中的系统工作参数的显示,效果良好;再配合按键控制进行反显、参数设置、翻页等,建立了良好的人机交互界面。

系统分类: 模拟技术
用户分类: 单片机
标签: OLED显示模块
来源: 无分类
发表评论 阅读全文(86) | 回复(0)
总共 , 当前 /