计算机软件及应用C程序设计_第1页
计算机软件及应用C程序设计_第2页
计算机软件及应用C程序设计_第3页
计算机软件及应用C程序设计_第4页
计算机软件及应用C程序设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

19:4315.1C51概述C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,位操作能力强,适用于各种应用的程序设计。使用C语言进行单片机应用系统开发,具有编程灵活、调试方便、目标代码编译效率高的特点。C语言也是目前使用最广的单片机应用系统编程语言。由C语言编程的单片机应用程序,称为单片机C语言程序。MCS-51系列单片机开发系统的编译软件可以对51单片机C语言源程序进行编译,称为C51编译器。在C51编译软件中可进行51单片机C语言程序的调试。------C51编译器19:4321)扩展了专门访问MCS-51单片机硬件的数据类型(bit);2)存储类型按MCS-51单片机存储空间分类;3)存储模式遵循存储空间选定编译器模式;4)指针分为通用指针和存储器指针;5)函数增加了中断函数和再入函数。5.1C51概述

------C51特点C51编译器针对MCS-51单片机硬件在下列几方面对ANSIC进行了扩展。19:433C51编程和汇编语言编程过程一样。单片机C语言源程序经过编辑、编译、连接后生成目标程序(.BIN和.HEX)文件,然后运行即可。调试51单片机C语言程序可用KeilC51编译器。注意,使用C51编程可以取代繁琐的汇编语言编程,但仍需要了解MCS-51单片机的硬件结构。所以对于单片机系统的开发应采用汇编语言与C51混合编程的方法更为有效。5.1C51概述------C51特点19:4345.2C51语法基础

标识符由字符串、数字和下划线等组成,应该注意的是第一个字符必须是字母或下划线,不能用数字开头,如“1_a”是错误的,编译时会有错误提示。在C51编译器中,只支持标识符的前32位为有效标识。C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名用户自定义标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。C51中的关键字除了有ANSIC标准的32个关键字外,还根据MCS-51单片机的特点扩展了相关的关键字。5.2.1标识符和关键字------标识符19:4355.2.1标识符和关键字----关键字列表19:4365.2.1标识符和关键字----关键字列表19:4375.2.1标识符和关键字----关键字列表19:4385.2.2数据类型

C51具有ANSIC的所有标准数据类型。其基本数据类型包括:char、int、short、long、float和double。

对C51编译器来说,short类型和int类型相同,double类型和float类型相同。-----C51的数据类型19:439

除此之外,为了更加有利地利用MCS-51的结构,C51还增加了一些特殊的数据类型,包括bit、sbit、sfr、sfr16。数据类型如表5-2所示。5.2.2数据类型

-----C51的数据类型19:4310bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量。它的值是一个二进制位,不是0,就是1,类似一些高级语言中的boolean型数据的True和False。6.bit位标量5.2.2数据类型

-----bit位标量19:43117.sfr特殊功能寄存器

sfr是一种C51扩充数据类型,占用一个内存单元,值域为0~255。利用它可以访问MCS-51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90定义一个特殊功能寄存器变量“P1”,0x90是指51单片机的P1端口地址90H,变量P1即指51单片机的P1端口。如reg51.h5.2.2数据类型

-----sfr特殊功能寄存器19:43128.sfr1616位特殊功能寄存器

sfr16也是一种C51扩充数据类型,用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器,如定时器T0和T1。

sfr16型数据占用2个内存单元,取值范围为0~65535。5.2.2数据类型

-----16位特殊功能寄存器19:4313

sbit也是一种C51扩充数据类型,利用它可以访问芯片内部RAM中的可寻址位或特殊功能寄存器中的可寻址位。

9.sbit可寻址位5.2.2数据类型

-----sbit可寻址位19:4314运算符和程序结构与标准C区别不大19:43155.3C51对MCS-51单片机的访问MCS-51单片机的存储器分为片内数据存储器、特殊功能寄存器、片外数据存储器、片内程序存储器和片外程序存储器。在C51中访问这些存储器时,是通过定义不同存储类型的变量,以说明该变量所访问的存储器位置。5.3.1存储类型----C51访问存储器19:43161.data直接寻址片内RAM

直接寻址片内数据存储区RAM(128字节),访问速度快。2.bdata位寻址片内RAM

可位寻址片内数据存储区RAM(16个字节),允许位与字节混合访问。3.idata间接寻址片内RAM

间接寻址内部数据存储区,可访问全部内部地址空间(00~FFH,256字节)。5.3C51对MCS-51单片机的访问-----定义存储类型19:43174.pdata分页寻址片外RAM

分页(256Byte)外部数据存储区RAM(256字节),由操作码MOVX@Ri访问。5.xdata寻址片外RAM

寻址片外数据存储区RAM(64K字节),由操作码MOVX@DPTR访问。6.code寻址ROM

寻址片内外程序存储区ROM(64K字节),由操作码MOVX@A+DPTR访问。5.3C51对MCS-51单片机的访问-----定义存储类型19:43185.3.2存储器模式

存储器模式决定了变量的默认存储类型和参数传递区,变量定义不明确存储区类型时使用默认值。

C51有三种存储器模式:

SMALL、LARGE和COMPACT。-----变量的存储类型19:43195.3.2存储器模式存储模式说明小编译模式SMALL参数及局部变量放入可直接寻址的片内数据存储区(最大128B,默认存储类型是data),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数。紧凑编译模式COMPACT参数及局部变量放入分页片外数据存储区(最大256B,默认的存储类型是pdata),通过寄存器R0和R1间接寻址,栈空间位于内部数据存储区中。大编译模式LARGE参数及局部变量直接放入片外数据存储区(最大64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针访问的效率较低,尤其是对两个或多个字节的变量,这种数据存储类型的访问机制直接影响代码的长度,不方便之处在于这种数据指针不能对称操作。-----变量的存储类型19:4320有两种方式:预处理命令和编译控制命令。(1)使用预处理命令设定数据存储模式需在程序的第一句加预处理命令。如:#pragmasmall/*设定数据存储模式为小编译模式*/#pragmacompact/*设定数据存储模式为紧凑编译模式*/#pragmalarge/*设定数据存储模式为大编译模式*/数据存储模式的设定5.3.2存储器模式-----存储模式的设定19:4321(2)使用编译控制命令设定数据存储模式用C51编译程序对C51源程序进行编译时,使用编译控制命令,格式如下:C51源程序名SMALLC51源程序名COMPACTC51源程序名LARGE 5.3.2存储器模式-----存储模式的设定19:43225.3.2存储器模式#pragmalarge#include<reg51.h>#include<stdio.h>voidmain(void){chari;i=10;while(1);}可以通过“在线汇编”功能看到生成代码的区别。---【例5-1】变量和函数的存储模式设置19:43235.3.3特殊功能寄存器的访问MCS-51系列单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的0x80~0xFF地址范围内。对SFR的操作只能用直接寻址方式。为了能直接访问这些特殊功能寄存器,C51提供了定义sfr的方法。这与ANSIC不兼容,只适用于MCS-51系列单片机。-----定义sfr的方法19:4324----1.sfr数据类型

特殊功能寄存器数据类型来实现。定义特殊功能寄存器名的语法如下:

sfr特殊功能寄存器名=整型常量;5.3.3特殊功能寄存器的访问1.sfr数据类型19:4325----1.sfr数据类型5.3.3特殊功能寄存器的访问#pragmalarge/*默认存储类型为MCS-51直接寻址片内RAM*/#include<reg51.h>#include<stdio.h>sfrkkk=0x80;voidmain(void){chari;i=10;kkk=0x11;while(1);}19:43262.用sbit数据类型访问可位寻址的特殊功能寄存器中的位MCS-51系列单片机片内21个特殊功能寄存器(SFR)中有11个特殊功能寄存器是可位寻址的。访问这些可位寻址的特殊功能寄存器中的位的方法可由关键字sbit定义特殊功能寄存器位寻址数据类型来实现。定义特殊功能寄存器位名的语法有下列三种(p97)sbit特殊功能寄存器位名=特殊功能寄存器名^整型常量

sbit特殊功能寄存器位名=整型常量1^整型常量2sbit特殊功能寄存器位名=整型常量5.3.3特殊功能寄存器的访问----2.sbit数据类型19:43275.3.3特殊功能寄存器的访问#pragmalarge/*默认存储类型为MCS-51直接寻址片内RAM*/#include<reg51.h>#include<stdio.h>sfrkkk=0x80;sbitOV1=PSW^2;/*在前面定义了PSW后,OV位于PSW的第2位*/sbitCY1=0xD7;/*进位标志位Cy的绝对位地址为D7H*/voidmain(void){bits=1;CY1=1;CY1=0;OV1=1;OV1=0;while(1);}----实例19:4328例5-2

特殊功能寄存器的访问。#include”reg51.h”sbitP10=P1^0; /*定义P10为P1口第0位,即P1.0口*/sbitP12=P1^2; /*定义P12为P1口第2位,即P1.2口*/

voidmain() { P10=1; /*置位P1.0口*/ P12=0; /*复位P1.2口*/ PSW=0x08; /*程序状态字置0x08*/

…… }5.3.3特殊功能寄存器的访问----应用实例19:43295.3.4存储器和并行口的访问MCS-51单片机片内有128个字节的RAM区(00H~7FH),可扩展片外64KB的ROM和RAM,有P0、P1、P2、P3四个8位双向并行I/O口,每个端口可以按字节输入或输出,也可以按位进行输入或输出,四个口共32根口线。使用C51编程时,片内/外存储器、片内I/O口与片外扩展I/O口可以统一在头文件中定义,也可以在程序中进行定义(一般在程序开始的位置)。C51定义存储器、并行口方法如下。----在头文件中定义19:43301.对存储器使用绝对地址访问C51编译器提供了一组宏定义用来对MCS-51系列单片机的CODE、DATA、PDATA和XDATA空间进行绝对地址访问。函数原型如下:#defineCBYTE((unsignedcharvolatile*)0x50000L)#defineDBYTE((unsignedcharvolatile*)0x40000L)#definePBYTE((unsignedcharvolatile*)0x30000L)#defineXBYTE((unsignedcharvolatile*)0x20000L)#defineCWORD((unsignedintvolatile*)0x50000L)#defineDWORD((unsignedintvolatile*)0x40000L)#definePWORD((unsignedintvolatile*)0x30000L)#defineXWORD((unsignedintvolatile*)0x20000L)这些函数原型放在absacc.h文件中。5.3.4存储器和并行口的访问-----绝对地址访问19:4331CBYTE以字节形式对CODE区寻址,DBYTE以字节形式对DATA区寻址,PBYTE以字节形式对PDATA区寻址,XBYTE以字节形式对XDATA区寻址,CWORD以字形式对CODE区寻址,DWORD以字形式对DATA区寻址,PWORD以字形式对PDATA区寻址,XWORD以字形式对XDATA区寻址。5.3.4存储器和并行口的访问-----绝对地址访问19:4332例5-3使用绝对地址访问存储器(p98)#include<absacc.h>#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharvoidmain(void){ uintui_var1; ucharuc_var1;

5.3.4存储器和并行口的访问-----绝对地址访问19:4333例5-3使用绝对地址访问存储器ui_var1=XWORD[0x0000];/*访问外部RAM的0000H~0001H地址的内容*/uc_var1=XBYTE[0x0002];/*访问外部RAM的0002H地址的内容*/XWORD[0x0000]=0xAABB;/*将0xAABB送入外部RAM的0000H~0001H地址中*/XBYTE[0x0002]=0xAA;/*将0xAA送入外部RAM的0002H地址中*/

……for(;;); }5.3.4存储器和并行口的访问-----绝对地址访问19:43342.对存储器使用指针访问例5-4

使用指针访问存储器。(p98)#defineucharunsignedchar#defineuintunsignedint

voidtest_memory(void){ucharidataivar1;/*定义一个指向idata存储空间的变量*/ucharxdata*xdp;/*定义一个指向XDATA存储器空间的指针*/chardata*dp;/*定义一个指向DATA存储器空间的指针*/

采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。5.3.4存储器和并行口的访问---指针访问19:4335ucharidata*idp;/*定义一个指向IDATA存储器空间的指针*/xdp=0x1000;/*XDATA指针赋值,指向XDATA存储器地址1000H处*/*xdp=0x5A; /*将数据5AH送到XDATA区的1000H单元*/dp=0x61; /*DATA指针赋值,指向DATA存储器地址

61H处*/*dp=0x23; /*将数据23H送到DATA区的61H单元*/idp=&ivar1; /*idp指向IDATA区的变量ivar1*/*idp=0x16; /*数据16H送到IDATA区的变量ivar1所在的地址单元中,等价于ivar1=0x16*/ }5.3.4存储器和并行口的访问---指针访问19:43363.C51定义片内I/O口单片机内部并行口可用关键字sfr定义,I/O口定义格式举例:sfrP0=0x80; /*定义P0口,地址80H*/sfrP1=0x90; /*定义P1口,地址90H*/5.3.4存储器和并行口的访问----sfr定义片内I/O19:4337----例5-5操作片内I/O口例5-5操作片内并行I/O口

sfrP1=0x90; /*定义P1口,地址90H*/ sfrP3=0xB0; /*定义P3口,地址B0H*/ sbitDIPswitch=P1^4; /*P1口第4位(P1.4口)为DIP开关的输入*/ sbitLEDgreen=P3^5; /*P3口第5位(P3.5口)为LED的输出*/ voidmain() {unsignedcharinval=0; for(;;){if(DIPswitch==1)/*检查P1.4口输入是否为高*/ {inval=P1&0x0F;/*读P1口0~3位*/ LEDgreen=0; /*置P1.5口输出为低*/ } Else{LEDgreen=1; /*置P1.5口输出为高*/ } P3=(P3&0x0F)|inval;/*P1口0~3位输出与P3口的0~3位相或输出*/ } }5.3.4存储器和并行口的访问19:43384.C51定义外部并行口

对片外扩展的I/O口,则根据其硬件译码地址,将其看作片外数据存储器的一个单元,使用#define语句进行定义。用指针定义,指针的定义在absacc.h头文件中。5.3.4存储器和并行口的访问----#define语句定义片外I/O19:4339----例5-6操作片外I/O口例5-6#include“absacc.h”#definePAXBYTE[0xffec] /*将PA定义为外部I/O口,地址为0xffec*/voidmain(){PA=0x5A; /*将数据5AH写入地址为0xffec的存储单元或I/O端口*/}5.3.4存储器和并行口的访问19:43405.3.5位地址访问C51对位变量的定义有3种方法:1.用bit关键字定义C51位变量例如:

bitlock; /*将lock定义为位变量*/ bitdirention;/*将direction定义为位变量*/ bitdisplay; /*将display定义为位变量*/注意:不能定义位变量指针;也不能定义位变量数组。----对位变量的定义19:4341例如:

bitfun(bita1,bita2) {

…… return(a1); }5.3.5位地址访问2.函数可包含bit的参数和返回值----函数的定义19:4342----位寻址存储区的位变量定义

3.定义位寻址存储区的位变量C51编译器允许数据类型为bdata的变量放入片内RAM可位寻址区中。例如:先定义变量的数据类型和存储类型,然后使用sbit定义位变量。bdataintibdata;/*ibdata定义为bdata整型变量*/bdatacharcarry[5];/*carry定义为bdata字符数组*/sbitmybit0=ibdata^0;/*mybit0定义为ibdata的第0位*/sbitmybit15=ibdata^15;/*mybit15定义为ibdata的第15位*/5.3.5位地址访问19:4343----位寻址存储区的位变量定义sbitarrybit07=carry[0]^7; /*arrybit07定义为carry[0]的第7位*/sbitarrybit37=carry[3]^7; /*arrybit37定义为carry[3]的第7位*/arrybit37=0; /*carry[3]的第7位赋值为0(位寻址)*/carry[0]=’A’; /*carry[0]赋值为’A’(字节寻址)*/

位置(^操作符)后的最大值取决于指定的基本数据类型。对于char而言是0~7;对于int而言是0~15;对于long而言是0~31。5.3.5位地址访问19:43443.可位寻址存储区的位变量定义voidmain(){bits=0;ucharss=0x11;OV=s;s=ss^3;}

5.3.5位地址访问19:43455.6.3C51语言和MCS-51汇编语言混合编程

下面简单介绍汇编语言与高级语言的混合编程。C51高级语言一般用来编写主程序和运算程序比较方便,用汇编语言编写与硬件有关的子程序更直接而速度快。

在混合编程中,关键是传递参数和函数的返回值。它们必须有完整的约定。19:4346C51程序调用汇编语言程序要注意以下几点1)被调函数要在主函数中说明,在汇编程序中,要使用伪指令使CODE选项有效并声明为可再定位段类型,并且根据不同情况对函数名作转换,见表5-6所示。5.6.2C51语言和MCS-51汇编语言混合编程

19:43472)对为其他模块使用的符号进行PUBLIC声明,对外来符号进行EXTRN声明。3)参数的传递。在混合语言编程中,关键是入口参数和出口参数的传递,C51编译器可使用寄存器传递参数,也可以使用固定存储器或使用堆栈,由于MCS-51的堆栈深度有限,因此多用寄存器或存储器传递。用寄存器传递最多只能传递三个参数,需选择固定的寄存器,见表5-7所示。5.6.3C51语言和MCS-51汇编语言混合编程----调用汇编19:4348例如:func1(inta),“a”是第一个参数,在R6、R7传递,func2(intb,intc,int*d),“b”在R6,R7中传递,“c”在R4,R5中传递,“d”在R1,R2,R3中传递。如果传递参数寄存器不够用,可以使用存储器传送,通过指针取得参数。汇编语言通过寄存器或存储器传递参数给C51程序。通过寄存器传递返回值给C51程序,返回值使用寄存器见表5-8所示。5.6.3C51语言和MCS-51汇编语言混合编程----调用汇编19:4349例5-28(p117)用P1.0口产生周期为4ms的方波信号,同时用P1.1口产生周期为8ms的方波信号。分别用汇编语言和C语言设计三个模块程序如下:模块一:用C语言编写主程序,使P1.1产生周期为8ms的方波;模块二:用C语言编程,使P1.0产生周期为4ms的方波;模块三:用汇编语言编写延时1ms程序。程序的执行过程是:模块一调用模块二获得8ms方波,模块二调模块三,向汇编程序传递字符型参数(x=2),实现2ms延时。5.6.3C51语言和MCS-51汇编语言混合编程

19:4350

#include<reg51.h> #defineucharunsignedchar sbitP1_1=P1^1; voiddelay_4ms(void);/*声明延时4ms函数(模块二)*/ main() {uchari; for(;;) {P1_1=0; delay_4ms(); /*调模块二延时4ms*/ P1_1=1;/*产生8ms方波*/ delay_4ms();/*调模块二延时4ms*/ } }5.6.2C51语言和MCS-51汇编语言混合编程

(1)模块一程序设计(P1.1产生周期为8ms的方波)19:4351(2)模块二程序设计(delay_4ms:使P1.0产生周期为4ms的方波)

#include<reg51.h> #defineucharunsignedchar sbitP1_0=P1^0;

delay_1ms(ucharx);

/*声明延时1ms函数(模块三)*/ voiddelay_4ms(void) {P1_0=0; delay_1ms(2);/*调汇编函数(模块三)*/ P1_0=1; delay_1ms(2);/*调汇编函数(模块三)*/ }5.6.2C51语言和MCS-51汇编语言混合编程

19:4352(3)模块三程序设计(汇编语言编写延时1ms程序delay_1ms)PUBLIC_DELAY_1MS;DELAY_1MS为其他模块调用

DESEGMENTCODE;定义DE段为再定位程序段

RSEGDE ;选择DE为当前段_DELAY_1MS:NOPDELA:MOVR1,#0F8H ;延时

LOP1:NOP NOP DJNZR1,LOP1DJNZR7,DELA;R7为C程序传递过来的参数

;(x=2)

EXIT:RET END5.6.2C51语言和MCS-51汇编语言混合编程19:4353#include<reg51.H>#include<stdio.h>

voidmain(void){SCON=0x50;//串口方式1,允许接收

TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数

TH1=0xE8;//11.0592MHz1200波特率

TL1=0xE8;19:4354

TI=1;TR1=1;//启动定时器

while(1){printf("HelloWorld!\n");//显示HelloWorld}19:4355

以上各模块可以先分别汇编和编译,生成的.OBJ文件,然后运行连接将各OBJ文件连接,生成一个新的文件。在集成环境下的连接调试可以连续进行。使用KEILC51仿真软件进行编译连接的步骤如下:5.6.3C51语言和MCS-51汇编语言混合编程1)编辑各个模块程序后保存。2)点击文件/新建项目,弹出项目窗口。3)点击项目菜单,选加入模块,此时弹出有文件目录的对话框,选中要加入刚才编辑好的文件(模块)并打开。此时在项目窗口中可以看到加入的模块文件。----调试步骤19:43564)点击项目菜单中的全部编译,并取名保存项目。于是系统对加入的各模块进行编译,并进行连接。5)编译连接完成后会弹出信息窗口,如编译连接有错,信息窗口将出现错误信息。6)模块连接成功后生成二进制文件(.BIN)和十六进制文件(.HEX)。7)点击跟踪或单步按钮,就可对程序进行跟踪调试,程序运行到不同模块时,wave就会弹出相应的模块源程序窗口,显示程序运行情况。5.6.3C51语言和MCS-51汇编语言混合编程----调试步骤19:43575.6.4编程优化的概念

本章介绍了C51的基本数据类型、存储类型及C51对单片机内部部件的定义,并简介了C语言基础知识和各种结构的程序设计,介绍了利用C语言编制单片机应用程序的方法。高效率的程序应该是占用存储空间少、运行时间短、编程省力省时。如何编写高效的单片机C51程序,通常应注意以下问题。19:43585.6.3编程优化的概念1.选择小存储模式2.尽可能使用最小数据类型3.尽量使用“unsigned”数据类型4.尽量使用局部变量5.选择效率高的编译器19:4359例5-14

如图5-3所示,单片机P1口的P1.0和P1.1各接一个开关K1、K2,P1.4、P1.5、P1.6和P1.7各接一只发光二极管。由K1和K2的不同状态来确定哪个发光二极管被点亮。选择结构程序-----多分支程序设计19:4360例5-14

#include“reg51.h” voidmain() { chara; a=P1; a=a&0x03;/*屏蔽高6位*/ if(a==0)P1=0x7F; elseif(a==1)P1=0xBF; elseif(a==2)P1=0xDF; elseP1=0xEF; }选择结构程序-----多分支程序设计19:4361【例5-15】

用switch语句完成例5-14任务。程序如下。#include<reg51.h>voidmain(){ chara; a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x7F;break; case1:P1=0xBF;break; case2:P1=0xDF;break; default:P1=0xEF; }}选择结构程序-----多分支程序设计19:4362例5-19#defineUCHunsigenedchar UCHcodetem[]={32,34,36,37,39,41}; UCHf_to_c(UCHdeg) { returntem[deg]; } voidmain() { UCHx; x=f_to_c(3); }查表程序

编写一个将摄氏温度转换为华氏温度的查表程序,已知摄氏温度0、1、2、3、4、5对应的华氏温度为32,34,36,37,39,41。---查表程序应用19:4363单片机内/外部资源应用程序设计#include“reg51.h”#include“intrins.h”sbitP1_0=P1^0;voiddelay(void) /*延时函数*/ { inta=5000; While(a--)_nop_(); }例5-21

外部中断0引脚(P3.2口)接一个开关,P1.0口接一个发光二极管。开关闭合一次,发光二极管改变一次状态。19:4364voidint_srv(void)interrupt0using1 /*外中断函数*/{ delay(); If(INT0==0) /*测试INT0==0后P1.0取反*/ {P1_0=!P1_0;while(INT0==0);}}voidmain() { P1_0=0; EA=1; /*开中断*/ EX0=1; While(1); }单片机内/外部资源应用程序设计19:4365#defineN12

charfilter()

{

charcount,i,j;

charvalue_buf[N];

int

sum=0;

for

(count=0;count<N;count++)

{

value_buf[count]=get_ad();

delay();

}

for(j=0;j<N-1;j++)

{

for(i=0;i<N-j;i++)

{

if(value_buf[i]>value_buf[i+1])

{

temp=value_buf[i];

value_buf[i]=value_buf[i+1];

value_buf[i+1]=temp;

}

}

}

for(count=1;count<N-1;count++)

sum+=value[count];

return(char)(sum/(N-2));

}中位值平均滤波19:4366#include<reg51.h>#defineUCHunsignedcharpdata*start1=0x40 ;pdata*end1=0x50 ;voidmain() { UCHi=1; for(i=1;i<=10;i++) { *start1=i; start1++; } start1=0x40 ; end1=0x50 ; for(i=1;i<=10;i++) { *end1=*start1; start1++; end1++; } }习题5-519:43675.6.2单片机内/外部资源应用程序设计

例5-22用定时器0实现从P1.0口输出方波信号,周期为50ms。设单片机的fOCS=6MHz。

程序如下:#include<reg51.h>sbitP1_0=P1^0;voidmain()/*主函数*/{TMOD=0x01;/*设置T0工作 于定时方式1*/TH0=-12500/256;/*写定时器中 加1计数器的计数初值*/TL0=-12500%256;

ET0=1;/*允许定时器0中断*/EA=1;/*全部中断允许*/TR0=1;/*启动定时器0工作*/while(1);/*等待中断*/}voidT0_srv(void)interrupt1using1/*中断函数*/{TH0=-12500/256;/*重写计数 初值*/TL0=-12500%256;P1_0=!P1_0;/*P1.0取反*/}----例5-2219:43685.6.2单片机内/外部资源应用程序设计例5-23如图5-7所示,单片机扩展可编程接口芯片8155,8155的PA口控制8只发光二极管,形成走马灯,每位点亮的时间为0.1秒。

8155的端口地址如下:命令口地址(COM8155):FEF8HPA口地址(PA8155):FEF9HPB口地址(PB8155):FEFAHPC口地址(PC8155):FEFBH----例5-2319:4369#include“reg51.h”#include“absacc.h”#defineCOM8155XBYTE[0xfef8]#definePA8155XBYTE[0xfef9]voiddelay(void) /*延时1ms函数*/{ TH0=-500/256; TL0=-500%256; TR0=1; While(!TF0); /*循环等待定时器0定时时间到*/ TF0=0; TR0=0;}5.6.2单片机内/外部资源应用程序设计----例5-2319:4370voidmain(){ chari; chardisp_word=0x01; /*从第1位开始点亮*/ COM8155=0x01; /*初始化8155*/ do {PA8155=disp_word; /*输出点亮一位*/ for(i=0;i<100;i++){delay();} /*点亮0.1秒*/ disp_word=disp_word<<1;/*左移控制字,准备点亮下一位*/ if(disp_word==0)disp_word=0x01; } while(1);}5.6.2单片机内/外部资源应用程序设计----例5-2319:4371例5-24

如图5-8所示为扩展独立键盘电路。编写程序实现键盘管理。5.6.2单片机内/外部资源应用程序设计----例5-2419:4372程序如下:#include“reg51.h”#include“absacc.h”voiddelay(void) /*延时1ms*/ { TH0=-500/256; TL0=-500%256; TR0=1; while(!TF0); /*循环等待定时器0定时时间到*/ TF0=0; TR0=0; }5.6.2单片机内/外部资源应用程序设计----例5-2419:4373voidmain(){ charx,i; for(;;) { x=P1; x=x&0x0f; if(x==0) continue; for(

温馨提示

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

评论

0/150

提交评论