C语言接口编程技术..
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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中断了当前正在运行的程序,而转人相应的服务程序中去的过程。这些引起程序中断的事件称为中断源,程序安排的事件是指中断指令,程序执行到中断指令