基于C语言高级程序设计讲座.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言高级程序设计讲座 第九讲 底层编程技术 鹏程C语言教学网站 庆祝建站一周年 特别企划 本文技术支持网站:29 学习目标 ·掌握输入输出函数的调用 ·了解扬声器发生端口的原理 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,bits0xfc)来禁止发声,且不改变8255其他位原来的值。 程序中由rand()函数产生一个0~32767之间的伪随机整数,为使声音柔和,在freq=1000时,退出循环而调用sound发声函数,该函数由传来的参数freq来设定频率计数值,count.divisor为119328/freq(占用两个地址单元),由于采用了联合结构,共用—个存储区,故联合结构成员countc[O]和countc[1]取该数的低8位和高8位(二进制位),用于初始化定时器的频率计数值。 运行该程序后,将会听到美妙的声音,当要停止时,可按任意键而由kbhit()函数控制do循环结束来实现。 由于PC机主频不同,发声效果将不同,选取freq1000,将会在386PC机上(主频为33M)发出清脆的声音,当主频小于33M时,可适当增加此数。 void sound(unsigned int freq); main() { unsigned int freq; do { do { freq=rand(); }while(freq1000); 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]); bits=inportb(0x61); outportb(0x61,bits|3); for(i=0;i20000;i++); outportb(0x61,bits0xfc); } 小结 本讲简要介绍了接口编程原理以及C语言提供的用于系统底层接口的函数。主要举

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档