单片机的c语言应用程序设计_第1页
单片机的c语言应用程序设计_第2页
单片机的c语言应用程序设计_第3页
单片机的c语言应用程序设计_第4页
单片机的c语言应用程序设计_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

专题1:单片机的C语言应用程序设计,1.1 C51特点1.2 C51数据类型1.3 C51数据的存储类型与MCS-51存储结构1.4 特殊功能寄存器(SFR)的C51定义1.5 位变量的C51定义1.6 MCS-51并行接口的C51定义1.7 MCS-51 C语言编程实例,1.1 C51特点,用汇编程序设计MCS51系列单片机应用程序时,必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。使用汇编语言会遇到很多问题,首先它的可读性和可维护性不强,特别是当程序没有很好标注的时候,其次就是代码的可重用性也比较低。使用C语言就可以很好地解决这些问题。用C语言编写单片机应用程序与编写标准的C语言程序的不同之处就在于根据单片机存储结构及内部资源定义相应的C语言中的数据类型和变量,其它的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同。,使用C语言与使用汇编语言相比具有如下优点:(1) 不需要了解处理器的指令集,也不必了解存储器结构。(2) 寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的寻址和数据类型等细节。(3) 指定操作的变量选择组合提高了程序的可读性。(4) 可使用与人的思维更接近的关键字和操作函数。(5) 与使用汇编语言编程相比,程序的开发和调试时间大大缩短。,(6) C语言中的库文件提供许多标准的例程,例如格式化输出、数据转换和浮点运算等。(7) 通过C语言可实现模块化编程技术,从而可将已编制好的程序加入到新程序中。(8) C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,已完成的软件项目可以和容易地转换到其他的处理器或环境中。用C语言编写MCS51单片机的应用程序,虽然不像用汇编语言那样具体地组织、分配存储器资源和处理端口数据,但在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。,C51特点:与C语言基本语法相同,在特定的硬件结构上有所扩展,如关键字sbit、data、idata、pdata、xdata、code等。C51具有标准C语言的所有标准数据类型,还加入了特殊的数据类型。 bit位变量值为0或1。 sbit从字节中声明的位变量0或1。 sfr特殊功能寄存器,sfr字节地址为0255。 sfr16同上,只是sfr字节地址为065535。bit、sbit、sfr和sfr16数据类型专门用于8051硬件和C51编译器,并不是标准C语言的一部分,不能通过指针进行访问。bit、sbit、sfrs和sfr16数据类型用于访问8051的特殊功能寄存器。,用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),转换生成单片机可执行的代码程序。支持MCS51系列单片机的C语言编译器有很多种。如American Automation、Auocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代码紧凑和使用方便等特点优于其它编译器。本章是针对这种编译器介绍 MCS51单片机C语言程序设计。,1.2 C51数据类型,1.2.1 Franklin C51编译器具体支持的数据类型有:位型(bit)、无符号字符(unsigned char)、有符号字符(singed char)、无符号整型(unsigned int )、有符号整型(signed int )、无符号长整型(unsigned long )、有符号长整型(signed long )、浮点型、指针类型等。,Franklin C51的数据类型,1.2.2 C51数据在MCS-51中的存储方式,位变量(bit):与MCS-51硬件特性操作有关的可以定义成位变量。位变量定位在MCS-51单片机片内RAM的位寻址空间20H-2FH中。 字符变量(char):字符变量的长度为1byte即8位。对于无符号变量(unsigned char)的值域范围是0255。对于有符号字符变量(signed char),其最高位是符号标志位(msb),1代表“负”,0代表“正”。有符号字符变量和无符号字符变量在表示0127的数值时,含义一样,都是00x7F。进行有符号字符变量乘除法运算时,C51编译器会自动地将相应的库函数调入程序中来进行运算。,整型变量(int): 整型变量的长度为16位。与8080和8086 CPU系列不同,MCS-51系列单片机将int型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字节中。有符号整型变量(signed int)也使用msb位作符号标志位,并使用二进制补码表示数值。可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。整型变量值0x1234以图1.1所示的方式存放在内存中。,整型数的存储结构,+0+1,地址,+0+1+2+3,地址,长整型变量的存储结构,浮点型变量(float): 浮点型变量为32位,占4个字节,许多复杂的数学表达式都采用浮点变量数据类型。 在编程时,如果只强调运算速度而不进行负数运算时,最好采用无符号(unsigned)格式。 无符号字符类型的使用:无论何时,应尽可能使用无符号字符变量,因为它能直接被MCS-51所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量虽然也只占用一个字节,但需要进行额外的操作来进行测试代码的符号位。这无疑会降低代码效率。,可使用简化形式定义数据类型。其方法是在源程序开头使用#define语句自定义简化的类型标识符。例如:#define uchar unsigned char #define uint unsigned int 这样,在编程中,就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量。,1.3 C51数据的存储类型与MCS-51存储结构,C51存储类型与MCS-51存储空间的对应关系,DATA区的寻址是最快的,所以应该把经常使用的变量放在DATA区;DATA区的空间是有限的,DATA区除了包含程序变量外,还包含了堆栈和寄存器组。DATA区声明中的存储类型标识符data,通常指低128B的内部数据区存储的变量,可直接寻址。声明举例如下: unsigned char data system_status=0; unsigned int data unit_id2;,BDATA区实际就是DATA区中的位寻址区,在这个区声明变量就可进行位寻址。位变量的声明对状态寄存器来说十分有用的,因为它可能仅仅需要使用某一个位,而不是整个字节。BDATA区声明中的存储类型标识符为bdata,指内部可位寻址的16B存储区(20H2FH)可位寻址变量的数据类型。在BDATA区声明位变量和使用位变量的例子: unsigned char bdata status_buye; unsigned int bdata status_word; sbit stat_flag=status_byte4;编译器不允许在BDATA区中声明float和double型的变量。对变量位进行寻址产生的汇编代码比声明DATA区的字节所产生的汇编代码要好,PDATA区和XDATA区属于外部存储区,外部数据区可读写的存储区,最多可有64KB,当然这些地址不是必须用作存储区的。访问外部数据存储区比访问内部数据存储区慢,因为外部数据存储区是通过数据指针加载地址来间接访问的。在这两个区,变量的声明和在其他区的语法是一样的,但PDATA区只有256B,而XDATA区可达到65535B。对PDATA和XDATA的操作是相似的。对PDATA区的寻址比对XDATA区的寻址要快,因为对PDATA区寻址只需要装入8位地址,而对XDATA区寻址需装入16位地址,所以要尽量把外部数据存储在PDATA区中。,PDATA和XDATA区声明中的存储类标识符分别为pdata和xdata,xdata存储类型标识符可以指定外部数据区64KB内的任何地址,而pdata存储类型标识符仅指定1页或256B的外部数据区。声明举例如下: unsigned char xdata system_status=0; unsigned int pdata unit_id2; 外部地址段中除了包含存储器地址外,还包含I/O器件的地址。对外部器件寻址可通过指针或C51提供的宏,使用宏对外部器件进行寻址更具可读性。 inp_byte=XBYTE0x8500; /从地址8500H读一字节 XBYTE0x7500=out_val; /写一字节到7500H 如果要对BDATA和BIT段之外的其他数据区寻址,则要包含头文件absacc.h,并采用以上方法寻址。,MCS-51系列的物理存储区,C51存储类型及其数据长度和值域,带存储类型的变量的定义的一般格式为 数据类型 存储类型 变量名带存储类型的变量定义举例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;,存储模式说明,1.4 特殊功能寄存器(SFR)的C51定义,MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。 为了能直接访问这些SFR,Franklin C51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C语言编程。,特殊功能寄存器C51定义的一般语法格式如下:sfr sfr-name = int constant;“sfr”( sfr16)是定义语句的关键字,=后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器sfr-name的字节地址,这个常数值的范围必须在SFR地址范围内,位于0x800xFF。例如:sfr SCON=0x98; /* 串口控制寄存器地址98H */sfr TMOD=0x89;/* 定时器/计数器方式控制寄存器地址89H */reg51.h头文件包括MCS-51单片机中SFR定义。,/*-REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-1997 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-*/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;,sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;,/* BIT Register */* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;/* IP */ sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;,/* IE */sbit EA = 0xAF;sbit ES = 0xAC;sbit ET1 = 0xAB;sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;/* TCON */sbit TF1 = 0x8F;sbit TR1 = 0x8E;sbit TF0 = 0x8D;sbit TR0 = 0x8C;sbit IE1 = 0x8B;sbit IT1 = 0x8A;sbit IE0 = 0x89;sbit IT0 = 0x88;,/* P3 */sbit RD = 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;,对于位寻址的SFR中的位,C51使用“sbit”来定义位寻址单元。第一种格式: sbit bit-name = sfr-nameint constant; sbit是定义语句的关键字,后跟一个寻址位符号名,=后的sfr-name必须是已定义过的SFR的名字,后的整常数是寻址位在特殊功能寄存器sfr-name中的位号,必须是07范围中的数。例如:sfr PSW=0xD0 ; /* 定义PSW寄存器地址为D0H */sbit OV=PSW2 ; /* 定义OV为PSW.2,地址为D2H */sbit CY=PSW7 ; /* 定义CY为PSW.7,地址为D7H */,第二种格式:sbit bit-name = int constantint constant; =后的int constant为寻址地址位所在的特殊功能寄存器的字节地址,符号后的int constant为寻址位在特殊功能寄存器中的位号。例如: sbit OV=0XD02 ;/* 定义OV位地址是D0H字节中的第2位 */ sbit CY=0XD07 ;/* 定义CY位地址是D0H字节中的第7位 */,第三种格式:sbit bit-name = int constant; =后的int constant为寻址位的绝对位地址。例如: sbit OV=0XD2 ;/* 定义OV位地址为D2H */ sbit CY=0XD7 ;/* 定义CY位地址为D7H */ 特殊功能位代表了一个独立的定义类,不能与其它位定义和位域互换。,(1) 位变量C51定义。使用C51编程时,定义了位变量后,就可以用定义了的变量来表示MCS-51的位寻址单元。 位变量的C51定义的一般语法格式如下: 位类型标识符(bit) 位变量名; 例如:bit direction_bit ;/* 把direction_bit定义为位变量 */bit look_pointer ;/* 把look_pointer定义为位变量 */,1.5 位变量的C51定义,(2) 函数可包含类型为bit的参数,也可以将其作为返回值。例如: bit func(bit b0, bit b1) /* 变量b0,b1作为函数的参数 */ return (b1); /* 变量b1作为函数的返回值 */ ,(3) 对位变量定义的限制。位变量不能定义成一个指针,如不能定义:bit * bit_pointer。不存在位数组,如不能定义:bit b_array 。 在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于MCS-51片内的RAM区中。因此,存储类型限制为data和idata,如果将位变量的存储类型定义成其它存储类型都将编译出错。,例1 先定义变量的数据类型和存储类型:bdata int ibase; /* 定义ibase为bdata整型变量 */bdata char bary4;/* bary4定义为bdata字符型数组 */然后可使用sbit定义可独立寻址访问的对象位:sbit mybit0 = ibase0 ;/* mybit0定义为ibase的第0位 */sbit mybit15 = ibase15;/* mybit0定义为ibase的第15位 */sbit Ary07 = bary07 ;/* Ary07定义为abry0的第7位 */sbit Ary37 = bary37 ;/* Ary37定义为abry3的第7位 */,对象ibase和bary也可以字节寻址: ary37=0; /* bary3的第7位赋值为0 */ bary3=a; /* 字节寻址,bary3 赋值为a */ sbit定义要位寻址对象所在字节基址对象的存储类型为bdata,否则只有绝对的特殊位定义(sbit)是合法的。操作符后的最大值依赖于指定的基类型,对于char/uchar而言是07,对于int/uint而言是015,对于long/ulong而言是031。,1.6 MCS-51并行接口的C51定义,MCS-51系列单片机并行I/O接口除了芯片上的4个I/O口(P0 P3)外,还可以在片外扩展I/O口。MCS-51单片机I/O口与数据存储器统一编址,即把一个I/O口当作数据存储器中的一个单元来看待。 使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文件中定义,也可以在程序中(一般在开始的位置)进行定义,其定义方法如下: 对于MCS-51片内I/O口按特殊功能寄存器方法定义。例如:sfr P0=0x80 ; /* 定义P0口,地址为80H */sfr P1=0x90 ; /* 定义P1口,地址为90H */,对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。例如#include #define PORTA XBYTE 0xFFC0 absacc.h是C51中绝对地址访问函数的头文件,将PORTA定义为外部I/O口,地址为 FFC0H,长度为8位。 一旦在头文件或程序中对这些片外I/O口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系,以便使程序员能用软件模拟MCS-51的硬件操作。,1.7 MCS-51 C语言编程实例,Franklin C51的编译库,程序优化,(1) 尽量选择小存储模式以避免使用MOVX指令。 (2) 使用大模式(COMPACT/LARGE)应仔细考虑要放在内部数据存储器的变量要求是经常用的或是用于中间结果的。访问内部数据存储器要比访问外部数据存储器快得多。内部RAM由寄存器组、位数据区和其它用户用“data”类型定义的变量共享。由于内部RAM容量的限制(128256字节,由使用的单片机决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。,(3) 要考虑操作顺序,完成一件事后再做一件事。 (4) 注意程序编写细则。例如,若使用for(;)循环,DJNZ指令比CJNE指令更有效,可减少重复循环次数。 (5) 若编译器不能使用左移和右移完成乘除法,应立即修改,例如,左移为乘2。 (6) 用逻辑AND/&取模比用MOD / %操作更有效。 (7) 因计算机基于二进制,仔细选择数据存储器和数组大小可节省操作。,(8) 尽可能使用最小的数据类型,MCS-51系列是8位机,显然对具有char类型的对象的操作比int或long类型的对象的操作要方便得多。 (9) 尽可能使用unsigned数据类型。MCS-51系列CPU并不直接支持有符号数的运算。因而C51编译器必须产生与之相关的更多的程序代码以解决这个问题。 (10) 尽可能使用局部函数变量。编译器总是尝试在寄存器里保持局部变量。这样,将循环变量(如for和while循环中的计数变量)说明为局部变量是最好的。使用unsigned char/int的对象通常能获得最好的结果。,MCS-51中断源编号,1.7.1 中断应用的C语言编程,1、 中断允许寄存器IE(A8H)CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器(IE)控制的。IE的状态可通过程序由软件设定;某位设定为“1”,相应的中断源中断允许;某位设定为“0”,相应的中断源中断屏蔽;CPU复位时,IE各位清“0”,禁止所有中断。,2、 中断优先级寄存器IP(B8H)MCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器(IP)中的相应位的状态来规定的。某位设定为“1”,则相应的中断源为高优先级中断;某位设定为“0”,则相应的中断源为低优先级中断。单片机复位时,IP各位清“0”,各中断源同为低优先级中断。,3、定时器工作方式寄存器 TMOD(89H):用于设置定时/计数器的工作方式,低4位用于T0,高4位用于T1。(1) GATE:门控位。GATE0时,当软件使TCON中的TR0或TR1设置为“1”,则启动定时/计数器工作;GATA1时,软件使TR0或TR1设置为“1”,同时外部中断引脚也为高电平时,才能启动定时/计数器工作。(2) C/ :定时/计数模式选择位。C/0为定时模式;C/=1为计数模式。,定时/计数器工作方式设置表,(3) M1M0 :工作方式设置位。定时/计数器有4种工作方式,由M1M0进行设置 。,4、 定时/计数器控制寄存器TCON(88H)TCON的低4位用于控制外部中断,TCON的高4位用于控制定时/计数器的启动和中断申请。TR1:定时/计数器T1运行控制位。TR1置“1”时,定时/计数器T1开始工作;TR1置“0”时,定时/计数器T1停止工作。TR1由软件置“1”或清“0”。 TR0 :定时/计数器T0运行控制位,其功能与TR1类同。,TF0:定时/计数器T0溢出中断请求标志位。在T0启动后就开始由初值加“1”计数,直至最高位产生溢出由硬件置位(TF0),向CPU请求中断。CPU响应中断时,TF0由硬件自动清“0”。 ;若用于查询方式,此位可作为状态位供查询,但应注意查询后由软件清“0”。TF1:定时/计数器T1溢出中断请求标志位。其操作功能与TF0类同。 IT0:外部中断0触发方式控制位。IE0:外部中断0中断请求标志位。IE0=1时,表示向CPU请求中断。IT1:外部中断1触发方式控制位。IE1:外部中断1中断请求标志位。IE1=1时,表示向CPU请求中断。,C51编译器支持在C源程序中直接开发中断程序。中断服务程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下: 返回值 函数名(参数) interrupt musing n ,using n 选项用于实现工作寄存器组的切换,n是中断服务子程序中选用的工作寄存器组号(0 3)。在许多情况下,响应中断时需保护有关现场信息,以便中断返回后,能使中断前的源程序从断点处继续正确地执行下去。这在MCS-51单片机中,能很方便地利用工作寄存器组的切换来实现。即在进入中断服务程序前的程序中使用一组工作寄存器,进入中断服务程序后,由using n切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。,图 1.5 扩展多个中断源,在中断服务程序中仅设置标志,并保存I/O口输入状态。Franklin C51编译器提供定义特定MCS-51系列成员的寄存器头文件。MCS-51头文件为reg51.h。C51程序如下:,# include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中断服务程序,使用第2组工作寄存器 */ flag=1; /* 设置标志 */ status=p1; /* 存输入口状态 */ ,void main(void) IP=0x04 ; /* 置INT1为高优先级中断 */ IE=-0x84 ; /* INT1开中断,CPU开中断 */ for(; ;) if(flag) /* 有中断 */ switch(status&0x3) /* 根据中断源分支 */ case 0 : break ; /* 处理IN0 */ case 1 : break ; /* 处理IN1 */ case 2 : break; /* 处理IN2 */ case 3 : break; /* 处理IN3 */ default : ; flag=0 ; /* 处理完成清标志 */ ,1.7.2 定时器/计数器(T/C)应用的C语言编程,例2 设单片机的fosc=12 MHz晶振,要求在P1.0脚上输出周期为2 ms的方波。 周期为2 ms的方波要求定时时间隔1 ms,每次时间到P1.0取反。 机器周期=12/fosc=1 s 需计数次数=1000/(12/fosc)=1000/1=1000,(1) 用定时器0的方式1编程,采用查询方式,程序如下: # include sbit P1_0=P10 ; void main(void) TMOD=0x01 ; /* 设置定时器1为非门控制方式1*/ TR0=1 ; /* 启动 T/C0 */ for( ; ;) TH0= 0xfc ; /* 装载计数器初值 */ TL0= 0x18 ; do while (!TF0) ; /* 查询等待TF0置位 */ P1_0=!P1_0; /* 定时时间到P1.0反相 */ TF0=0; /* 软件清 TF0 */ ,(2) 用定时器0的方式1编程,采用中断方式。程序如下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 /* T/C0中断服务程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新装载计数初值 */ void main( void ) TMOD=0x01 ; /* T/C0工作在定时器非门控制方式1 */ P1_0=0; TH0= 0xfc ; /* 预置计数初值 */ TL0= 0x18; ET0= 1 ; /* T/C0中断开放 */ TR0=1 ; /* 启动T/C0开始定时 */ EA=1 ; /* CPU中断开放 */ do while(1) ; /* 等待中断 */ ,1.7.3 ADC0809与8031接口的数据采集程序举例。,程序如下:,# include # include # define uchar unsigned char # define IN0 XBYTE 0x7ff8 /* 设置0809的通道0地址 */ sbit ad_busy =P33 ; /* 即EOC状态 */ void ad0809 ( uchar idata *x ) /* A/D采集函数 */ uchar i ; uchar xdata *ad_adr ; ad_adr= & IN0 ;,for ( i=0 ; i8 ;i+ ) /* 处理8通道 */ *ad_adr=0 ; /* 启动转换 */ while (ad_busy = =0 ) ; /* 查询等待转换结束 */ xi = * ad_adr ; /* 存转换结果 */ ad_adr + ; /* 下一通道 */ void main ( void ) static uchar idata ad 8 ; ad0809 ( ad ) ; /* 采样AD0809通道的值 */ ,1.7.4 AD574与8031接口的数据采集程序举例。,源程序如下:,uint ad574 ( void ) /* AD574转换器 */ r = 0 ; /* 产生CE=1 */ w = 0 ; ADCOM = 0 ; /* 启动转换 */ while ( adbusy = =1 ) ; /* 等待转换*/ return ( ( uint )(ADHI4 )+( ADLO &0x0f ) ); /* 返回12位采样值*/ main ( ) uint idata result ; result =ad574 ( ) ; /* 启动AD574进行一次转换,得转换结果 */ ,1.7.5 8031与DAC0832双缓冲接口的数据转换程序举例,将data1和data2数据同时转换为模拟量的C51程序如下:,# include # include # define INPUTR1 XBYTE 0x8fff # define INPUTR2 XBYTE 0xa7ff# define DACR XBYTE 0x2fff # define uchar unsigned char void dac2b (uchar data1 , uchar data2 ) INPUTR1 = data1 ; /* 送数据到一片0832 */ INPUTR2 = data2 ; /* 送数据到另一片0832 */ DACR= 0 ; /* 启动两路D/A 同时转换 * /,1.7.6 8031与DAC0832单缓冲区接口的数据转换举例,按片选线确定FFFEH为DAC0832的端口地址。使运行输出端输出一个锯齿波电压信号的C51程序如下:,# include # include # define DA0832 XBYTE 0xfffe # define uchar unsigned char # define uint unsigned int void main (void ) uchar i ; while ( 1 ) for ( i=0 ; i0 ; i- -) ,uchar kbscan ( void ) /* 键扫描函数 */ uchar scode ,recode ; P1=oxf0 ; if ( (P1 /* 返回特征字节码 */ else scode = ( scode 1) | 0x01 ; /* 行扫描左移一位 */ return ( 0 ) ; ,1.7.8 可编程键盘/显示器接口INTEL 8279,INTEL 8279是一种可编程键盘/显示器接口芯片,它含有键盘输入和显示器输出两种功能 。 使用它可以简化系统的软硬件设计,充分提高CPU的工作效率。,1、引脚功能:,(1)与CPU总线接口部分D0D7:双向、三态数据总线,与系统数据总线相连,用于CPU与8279之间传送控制、状态和数据信息。CLK:系统的时钟输入线,用于产生内部时钟。RESET:复位信号,输入线,高电平有效。当RESET为1时,8279复位。其复位状态为16字符显示,左端输入,编码扫描键盘,双键锁定,程序时钟编程为31。CS:片选输入线,低电平有效。CS=0时,8279才能工作。,A0: D0D7数据选择输入线。当A0=0,表示传送的是数据;当A0=1,表示输入、输出命令或状态。RD:读控制信号,低电平有效。CPU从8279读数据。WR:写控制信号,低电平有效。CPU向8279写数据。IRQ:中断请求信号,高电平有效。在键盘工作方式中,当FIFO/传感器RAM存有数据时,IRQ为高电平。CPU每次从RAM中读出数据时,IRQ变为低电平。若RAM中仍有数据,则IRQ再次恢复为高电平。在传感器工作方式中,每当检测到传感器状态变化时,IRQ就出现高电平。,(2)数据显示接口部分,OUTA0OUTA3:A组显示信号输出线。OUTB0OUTB3:B组显示信号输出线。BD:显示器消隐指示,输出。用于在数字转换时指示消隐,或用于由显示消隐命令控制下的消隐指示。SL0SL3:用于键盘/传感器矩阵或显示器的扫描输出线,可编程设定为编码方式或内部译码方式。,(3)键盘接口部分,RL0RL7:键盘返回输入线,是键盘阵列或传感器阵列的列(或行)的输入线。内部设置有上拉电路,平时保持为“1”,当矩阵结点上有开关闭合时变为0。SHIFT:移位输入线,通常用来扩充键功能,可以用做键盘上、下档功能键。CNTL/STB:控制/选通输入线。在键盘工作方式时,该信号是键盘数据的最高位,通常用来扩充键开关的控制功能,作为控制功能键使用。在选通输入工作方式时,该信号的上升沿可将来自RL0RL7的数据存入FIFO RAM中。,8279与单片机、键盘/显示器的接口,2、8279的内部结构框图,(1) I/O控制及数据缓冲器 数据缓冲器是双向缓冲器,连接内外总线,用于传送CPU和8279之间的命令或数据,对应的引脚为数据总线D0D7。 I/O控制线是CPU对8279进行控制的引线,对应的引脚为数据选择线A0、片选线 、读/写信号线和。(2) 控制与定时寄存器及定时控制 控制与定时寄存器用来寄存键盘及显示工作方式控制字,同时还用来寄存其它操作方式控制字 。(3) 扫描计数器:键盘和显示器共用,提供键盘和显示器的扫描信号。,(4) 回复缓冲器、键盘去抖及控制 在键盘工作方式中,回复线作为行列式键盘的列输入线,相应的列输入信号称为回复信号,由回复缓冲器缓冲并锁存。在逐行列扫描时,回复线用来搜寻每一行列中闭合的键。 (5) FIFO/传感器及其状态寄存器 FIFO/传感器RAM是一个双重功能的88 RAM。在键盘选通工作方式时,它是FIFO存储器,其输入/输出遵循先入先出的原则 。,(6) 显示RAM和显示寄存器,16X8。 8279内部有16X8的显示RAM,通过显示寄存器和两个四位端口0UT A0-3,0UT BO-3来刷新显示,显示器可以是LED,也可以是8段数码管,显示RAM可以是16X8的形式,也可以构成两个16x4的RAM形式,显示RAM可由CPU进行读写,被读写的RAM字节地址由显示地址寄存器指示. 显示地址寄存器保存当前CPU读或写的那个RAM地址,以及正显示着的那两个4位半字节的地址, 读写地址由CPU命令编程,也可置为每次读写后地址自动加1的工作方式,在设置了正确的工作方式后,显示RAM可直接由CPU读出,半字节A和半字节B地址自动由8279更新,以适应由CPU送入的数据,A和B半字节可独立送入,也可作为一个字送入,随CPU所设置的工作方式而定。,3、8279工作方式,(1)键盘工作方式键盘扫描方式,双键互锁:在这种方式,如果只有一个键被按下,则此键值连同CTRL和SHIFT的状态一起送到FIFO RAM中,如果FIFO空,IRQ=1;如果FIFO满,便置错误标志,键值不会送入FIFO RAM中。若有两个或两个以上键同时被按下,则不管这些键是以什么次序按下的,它只识别最

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论