- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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语言提供的用于系统底层接口的函数。主要举
您可能关注的文档
- 深入调研大连二中多功能音乐厅音视频系统及灯光设备.doc
- 金三环境下个税.doc
- 本文档适用于电脑自动获取IP地址上网的用户及应用分析.doc
- 深入调研磁灶中学2011年春季高二下学期期中考试.doc
- 安全客户端简要操作手册与课件.doc
- 第八课Flash多媒体课件制作.doc
- 本报告为中国扶贫基金会新长城项目部提供及应用分析.doc
- 怎样做好密云区第三次全国农业普查.doc
- 怎样做好茂名职业技术学院水电预算实训室.doc
- 广东粤剧学校及统计探究.doc
- 四川省德阳市罗江中学2025届高三考前热身化学试卷含解析.doc
- 山东省枣庄现代实验学校2025届高三下学期第五次调研考试化学试题含解析.doc
- 吉林省长春市十一高中等九校教育联盟2025届高三一诊考试生物试卷含解析.doc
- 2025届江苏省盐城市伍佑中学高考仿真模拟化学试卷含解析.doc
- 2025届广西贺州中学高考冲刺押题(最后一卷)生物试卷含解析.doc
- 安徽省池州市贵池区2025届高三第一次模拟考试生物试卷含解析.doc
- 宁夏银川一中2025届高三(最后冲刺)化学试卷含解析.doc
- 广东省广州市增城区四校联考2025届高考压轴卷化学试卷含解析.doc
- 2025届邯郸市第一中学高考生物必刷试卷含解析.doc
- 2025届安徽省安庆市石化第一中学高考仿真卷化学试卷含解析.doc
文档评论(0)