第九讲 底层编程技术
- 格式:doc
- 大小:53.00 KB
- 文档页数:3
鹏程C语言教学网站 第 1 页 共 3 页 2003-8-9 C语言高级程序设计讲座
第九讲 底层编程技术
鹏程C语言教学网站 庆祝建站一周年 特别企划
本文技术支持网站:http://202.112.86.129
学习目标
·掌握输入输出函数的调用
·了解扬声器发生端口的原理
I/O接口的输入输出函数
接口输入函数
int inport(int protid)
int inprotb(int protid)
import 函数从指定的接口地址protid中读入一个字(即16位二进制),而inportb则从指定的接口地址portid中读入一个字节(8位二进制数)。
接口输出函数
int outport(int portid,int value)
int outportb(int portid,unsigned char value)
outport函数把一个6位二进制数value发送到口地址为portid的接口中去,而outportb函数是将一个字节的数value送到口地址为portid的接口中去。
定时与计数器8253端口应用举例
在PC机的系统板上装有定时与计数器8253芯片,还有8255可编程并行接口芯片,由它们组成的硬件电路可用来产生PC机内扬声器的声音,对于286、386、486、586等PC微机,由于采用了超大规模集成电路,因而看不到这些芯片,它们均集成在外围电路芯片上了。
当我们操作计算机时常常听到的发声,就是由软件控制这些电路而产生的,声音的长短,音调的高低,均可由程序进行控制。下面就是一个扬声器发音程序。系统板上控制发音的电路可用下图表示,其中定时器电路产生一个方波信号,其频率可以编程设定,它决定了扬声器发音的频率,当对定时器电路进行频率设定时,首先要对其命令寄存器(口地址为0x43)写命令字,如写入0x66,则表示选择该定时器的第二个通道,计数频率先送低8位(二进制),后送高8位,这是用outportb(Ox43,0x66);实现的。接着用口地址0x42送频率计数值,先送低8位,后送高8位,即用outportb(Ox42,count.c[OD和outportb(Ox42,count.c[11)来实现。该计数值减为一半时,定时器产生低电平,减为。时,又变高电平并又重新开始减计数(仍从最初设置的计数值开始),因而产生一系统方波信号,此信号是否能推动扬声器发音,还要看由8255产生的门控信号和送数信号是否为1。它们也可编程。其口地址为Ox61,当8255的PB口的0位和1位为1时,就表示允许发声。为0时,便禁止发声。因而用outportb(0x61,bitsl3)来允许发声,而用outportb(Ox61,bits&0xfc)来禁止发声,且不改变8255其他位原来的值。 鹏程C语言教学网站 第 2 页 共 3 页 2003-8-9
程序中由rand()函数产生一个0~32767之间的伪随机整数,为使声音柔和,在freq<=1000时,退出循环而调用sound发声函数,该函数由传来的参数freq来设定频率计数值,count.divisor为119328/freq(占用两个地址单元),由于采用了联合结构,共用—个存储区,故联合结构成员countc[O]和countc[1]取该数的低8位和高8位(二进制位),用于初始化定时器的频率计数值。
运行该程序后,将会听到美妙的声音,当要停止时,可按任意键而由kbhit()函数控制do循环结束来实现。
由于PC机主频不同,发声效果将不同,选取freq>1000,将会在386PC机上(主频为33M)发出清脆的声音,当主频小于33M时,可适当增加此数。
void sound(unsigned int freq);
main()
{
unsigned int freq;
do
{
do
{
freq=rand();
}while(freq>1000);
sound(freq);
}while(!kbhit());
}
void sound(unsigned int freq)
{
unsigned i;
union
{
long divisor;
unsigned char c[2];
}count;
unsigned char bits;
count.divisor=119328/freq;
outportb(0x43,0xb6);
outportb(0x42,count.c[0]);
outportb(0x42,count.c[1]); 鹏程C语言教学网站 第 3 页 共 3 页 2003-8-9 bits=inportb(0x61);
outportb(0x61,bits|3);
for(i=0;i<20000;i++);
outportb(0x61,bits&0xfc);
}
小结
本讲简要介绍了接口编程原理以及C语言提供的用于系统底层接口的函数。主要举例讲解了inport()和outport()函数的用法。最后介绍了扬声器发生端口的原理。
下面借这里的篇幅简要介绍一下最后三讲的内容。
第十讲:在自己的软件中使用鼠标;
这一讲我们主要讲一下在软件中使用鼠标的方法。
第十一讲:软件加密方法简介
这一讲我们主要介绍几种软件的加密方法,以及如何限制软件的使用次数。
第十二讲:C语言大型作业的编写
这一讲主要是因为某些学校某些院系要求学生写C语言大作业,所以我们在这里作以下简要的辅导,最后给出一个较大型作业的例程。