C语言接口编程技术..

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二节C语言接口编程技术

一、C语言特点

C语言以其简洁、灵活、表达能力强、产生的目标代码质最高、可移植性好为其基本特点而著称于世,详细归纳起来,它具有以下几个特点:

• C语言兼容了其他计算机语言的一些优点,其程序结构紧凑、简洁、规整,表达式简练、灵活、实用。用C语言编写的程序可读性强、编译效率高。

• C语言具有丰富的数据类型。在系统软件中,特别是操作系统中,对计算机的所有软件、硬件资源要实施管理和调度,这就要求有相应的数据结构作为操作基础。C语言具有5种基本的数据类型和多种构造数据类型(数组、结构、联合、枚举)以及复杂的导出类型。C 语言还提供了与地址密切相关的指针及其运算符。

• C语言具有丰富的运算符,多达科种。丰富的数据类型与丰富的运算符相结合,使C 语言具有表达灵活和效率高等特点。

•语言是一种结构化程序设计语言,特别适合于大型程序的模块化设计:

• C语言是处于汇编语言和高级语言之间的一种中间型程序设计语言,它既具有高级语言面向用户、可读性强、容易编程和维护等特点,又具有汇编语言面向硬件和系统,可以直接访问硬件的功能,C语言的运行效率可以与汇编语言媲美。

• C语言具有较高的可移植性。在C语言的语句中,没有依赖于硬件的输人输出语句,程序的输人输出功能是通过调用输人输出函数实现的,而这些函数是由系统提供的独立于C 语言的程序模块。从而便于硬件结构不同的计算机之间实现程序的移植。

二、C语言端口操作编程

利用C语言进行计算机的接口编程,主要是利用C语言对端口输人输出操作的支持,PC/XT/AT微型计算机上运行的几种C语言版本,都支持对端口的输人输出操作。C语言对这些端口的输人输出函数以库函数的形式进行了封装,这些库函数实际上调用了汇编语言中的INI}UT指令,开发者不必自己开发C语言的接口函数,简化了开发难度。

1.端口操作函数

C程序为了要访问端口(即口地址),专门设计了端口输人输出函数,它们是

int inport()

int inpartb()

int outport()

int outportb()

这四个函数的函数原型都在函数库"dos. h"中,所以在使用这四个函数之前,需要在程序中包含进库函数"dos. h。

(1)端口读函数C语言中的读端口的函数有两个:inport()和inportb()。他们都是从指定的端口读人数据。其调用形式为:

int inpart(int port

int inportb(int port)

inport()函数从指定的端口port读人一个字长的值,其长度为l6位;inportb()函数从指定的端口part读人一个字节,其长度为8位。

如:下列语句将从口地址2F0H中得到一个字长的数:

unsigned int c;

c=import (Ox2f0);

(2)端口写函数C语言中向端口输出数据的函数有两个:outport()和outportb()。他们都是向指定的端口输出数据。其调用形式为:

void outport(int port。int worn)

void outportb(int peat,char byte)

outport ( )函数向指定的端口art输出一个字长值word,其长度为16位;

outportb()函数向指定的端口port输出一个字节值byte,其长度为8位。

如:下列语句将数4095送往口地址为2F2H和2F3H的接口中去:

outport(Ox2f2,4095);

数据发送时.程序将4095转变为二进制数,低8位送2F2H,高8位送2F3H

2.端口访问实例

(1)微机发声在PC机主板内装有定时器与计数器( CTC ),芯片为8253 --5。其中1号计数器定期向4个DMA通道请求一次I/O传送;0号计数/本时器为通用的计数器,实现日时钟;2号计数/定时器支持扬声器的声调发生器。上述CTC的口地址已由机器内部译码,口地址为4Q-43H。主机板上还安装有8255并行接口,其口地址为60-63H,已由机上译码。用CTC配合8255产生声音的原理如图9一1所示。

由图9一1可知.C程序实现发声喇叭,应分别访问42H,43H,61H,并在

访问61H时将原输人的字节的bit0和bit1置1才能使喇叭发声。面我们列出发声程序,主要为了理解上述端口操作函数的应用二该程序运行时。可在屏幕上显示由随机数得到的频率数,同时发出相应的声音二由于声音是断续的(开与关8255),同时频率数是随机的,所以使人得到一种似乎是旧式科学幻想电影中的音乐效果。程序清单如下:

#define DELAY ZUODa

void sound(unsigned int freg);

main()

{do

do{

freg=rand();

}while (freg>5000);

sound ( freg );

}while(!kbhi());

}

void sound( unsigned int freg)

{unsigned

union{

long divisor;

unsigned char c[2];

}count;

unsigned char p;

count.divisor=119328O/freg;

outportb (Ox43,Oxc6);

outpartb (0x42,count.c[0]);

???

转换完成后,将转换结果用函数inpartb()采集到计算机内并进行处理。所采集到的8个通道数据,是十进制数0一2.55。我们暂不作工程量转换,只是原理性地将它们在屏幕上轮流显示。

上述ALE, START, OE等信号,主要采用类似于汇编语言中的累加器输人输出方法,即采用inpartb ( )和outpartb ( )函数。作为外设的口地址,需A9?1,故选用2F0H, 2F1H, 2F2H,这很方便地可由A0-A9地址线输人进行译码。

全部用C语言写出的数据采集系统的清单如下:

main()

{

int i;

unsigned char c;

unsigned char a;

do{

a=0;

do{

outportb (Ox02f0,a);

outportb(0x02f1,a) ;/*发送通道地址并启动转换*/

for(i=0;i<100;i++);

c = inportb (Ox02f2 );/*采集转换结果*/

if( a<=6)printf("%03d",c);

else printf("%03d\n",c);

}while(++a<=7)

for(i=0;i<=10000;i++);

}while(!kbhit());

}

三、中断服务程序

1,中断的概念

所谓的中断,是指CPU在正常运行一个程序时,由于程序中的事先安排或是由外界事件的触发,导致CPU中断了当前正在运行的程序,而转人相应的服务程序中去的过程。这些引起程序中断的事件称为中断源,程序安排的事件是指中断指令,程序执行到中断指令

相关文档
最新文档