如何控制8253发生? 毕设中的一部分

cool1006 2007-03-14 04:40:58
毕设中的一部分 比如固定输入7 发出XI声 再输入6 就发出LA声的界面控件
...全文
561 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cool1006 2007-04-04
  • 打赏
  • 举报
回复
#include<time.h>
#include<dos.h>
#include<conio.h>
#include<stdio.h>
#define N1 64
#define N2 32
#define N4 16
#define N8 8
#define N16 4
#define END 0
enum NOTES
{ //定义不同曲调对应的频率
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=525,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796
};
int song[] ={ //定义 歌曲对应的曲谱
D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8,G10,N8,A10,
N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,E0,N8,G0,N8,
D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,
N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8,A10,N8,D10,
N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8,G0,N8,F0,N2,G0,
N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8,A10,N8,D0,N2,E0,
N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,N8,A10,N8,
C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8,C0,N8,E0,N8,D0,
N1,END,END};

void main()
{
int note=0,fre,dur,control;
clock_t goal;
printf("please leason song of kewang:\n");
while(song[note]!=0)
{
fre=song[note];
dur=song[note+1];
if(kbhit()) break; //_outp
if(fre)
{
_outp(0x43,0xb6);
fre=(unsigned)(1193180L/fre);
_outp(0x42,(char)fre);
_outp(0x42,(char)(fre>>8));
control=_inp(0x61);
_outp(0x61,(control)|0x3);
}
goal=(clock_t)dur+clock( );
while(goal>clock ( ));
if(fre)
_outp(0x61,control); //恢复对8255的设置
goal=(clock_t)0;note=note+2;

}

}
发声程序是这样的 但是2000+以上都不能运行
cool1006 2007-04-02
  • 打赏
  • 举报
回复
总是无法正常运行 请问你的调试软件是什么?
cool1006 2007-03-29
  • 打赏
  • 举报
回复
再去调调看 不过这段程序没有交互性 最好实现类似钢琴功能我按个键发个声
WingForce 2007-03-26
  • 打赏
  • 举报
回复
晕,我看错了。。。其实原来没有甚么语法错误,可能是编译器的问题

改成这样吧。。。

enum NOTES
{ //定义不同曲调对应的频率
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=525,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796
};//这里少个分号。。。

NOTES song[]={ //定义 歌曲对应的曲谱
D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8,G10,N8,A10,
N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,E0,N8,G0,N8,
D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,
N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8,A10,N8,D10,
N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8,G0,N8,F0,N2,G0,
N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8,A10,N8,D0,N2,E0,
N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,N8,A10,N8,
C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8,C0,N8,E0,N8,D0,
N1,END,END};
WingForce 2007-03-26
  • 打赏
  • 举报
回复
enum NOTES
{ //定义不同曲调对应的频率
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=525,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796
};//这里少个分号。。。

song[]={ //定义 歌曲对应的曲谱
D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8,G10,N8,A10,
N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,E0,N8,G0,N8,
D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,
N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8,A10,N8,D10,
N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8,G0,N8,F0,N2,G0,
N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8,A10,N8,D0,N2,E0,
N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,N8,A10,N8,
C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8,C0,N8,E0,N8,D0,
N1,END,END};

。。。
cool1006 2007-03-26
  • 打赏
  • 举报
回复
????高人什么意思
cool1006 2007-03-21
  • 打赏
  • 举报
回复
怎么还是没有个正确的东西啊。。。急啊 达人
qiujian5628 2007-03-21
  • 打赏
  • 举报
回复
mark
cool1006 2007-03-16
  • 打赏
  • 举报
回复
}song[]={ //定义 歌曲对应的曲谱
这一行调式有错误 不知道错在哪里
cool1006 2007-03-15
  • 打赏
  • 举报
回复
谢谢 我用VC调式下先
洞庭小哥 2007-03-14
  • 打赏
  • 举报
回复
这是一个用8253发声 播放一首曲子的程序:
#include<time.h>
#include<dos.h>
#define N1 64
#define N2 32
#define N4 16
#define N8 8
#define N16 4
#define END 0
enum NOTES
{ //定义不同曲调对应的频率
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=525,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796
}song[]={ //定义 歌曲对应的曲谱
D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8,G10,N8,A10,
N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,E0,N8,G0,N8,
D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,
N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8,A10,N8,D10,
N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8,G0,N8,F0,N2,G0,
N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8,A10,N8,D0,N2,E0,
N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,N8,A10,N8,
C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8,C0,N8,E0,N8,D0,
N1,END,END};
main()
{
int note=0,fre,dur,control;
clock_t goal;
printf("please leason song of kewang:\n");
while(song[note]!=0)
{
fre=song[note];
dur=song[note+1];
if(kbhit()) break;
if(fre)
{
outportb(0x43,0xb6);
fre=(unsigned)(1193180L/fre);
outportb(0x42,(char)fre);
outportb(0x42,(char)(fre>>8));
control=inportb(0x61);
outportb(0x61,(control)|0x3);
}
goal=(clock_t)dur+clock( );
while(goal>clock ( ));
if(fre)
outportb(0x61,control); //恢复对8255的设置
goal=(clock_t)0;note=note+2;

}

}

洞庭小哥 2007-03-14
  • 打赏
  • 举报
回复
PC机采用一块8253定时器芯片计算系统时钟的脉冲,

若干个系统时钟周期转换成一个脉冲,这些脉冲序列可以用以计时,也可以送入计算机的扬声器产生特定

频率的声音。8253定时器芯片独立于CPU运行,它可以象实时时钟那样,CPU的工作状态对它没有任何影响。

8253芯片有三个独立的通道,每个通道的功能各不相同,三个通道的功能如下:通道0:为系统时钟

所用,在启动时由BIOS置入初值,每秒钟约发出18.2个脉冲,脉冲的计数值存放在BIOS数据区的0040:006c

存储单元中(注意,这个单元的内容对我们非常有用!),通道0的输出脉冲作为申请定时器中断的请求信

号,还用于磁盘的某些定时操作,如果改变了通道0的计数值,必须确保在CPU每次访问磁盘以前恢复原来

的读数,否则将使磁盘读写产生错误。通道1:用于控制计算机的动态RAM刷新速率,一般情况下不要去改

变它。通道2:连接计算机的扬声器,产生单一的方波信号控制扬声器发声。8253定时器芯片的每一个通道

含有3个寄存器,CPU通过访问3个端口(通道0为40h,通道1为41h,通道2为42h)来访问各个端口的3个寄存

器,8253每个端口有6种工作模式,当通道0用于定时或通道2用于定时或发声时,一般用模式3。在模式3下,

计数值被置入锁存器后立即复制到计数器,计数器在每次系统时钟到来时减1,减至0后一方面马上从锁存

器中重新读取计数值,另一方面向CPU发出一个中断请求(INT 1CH中断,很有用),如此循环在输出线上高

低电平的时间各占计数时间的一半,从而产生方波输出。

对8253定时器芯片编程是通过命令端口寄存器(控制字寄存器)43h来实现,它决定选用的通道、工作模

式、送入锁存器的计数值是一字节还是两字节、是二进制码还是BCD码等工作参数,端口43h各位的组合形式

如下:

控制字寄存器各位的功能表示

D7 D6 D5 D4 D3 D2 D1 D0
---------------------------------------------------
| SC1 SC0 | RL1 RL0 | M2 M1 M0 | BCD |
---------------------------------------------------


D0 位____若为0则采用二进制表示,否则用BCD码表示计数值。

D3-D1位____工作模式号,其值(0-5)对应6种模式。

D5-D4位____操作的类型:00:把通道中当前数据寄存器的值送入16位锁存器中,供CPU读取该值;

01:表示只读/写低8位字节数据,只写入低8位时,高8位自动置为0;

10:表示只读/写高8位字节数据,只写入高8位时,低8位自动置为0;

11:允许读/写16位字数据,8253的数据线只有8位,读/写时必须分两次进行,先
读/写低8位字节,再读/写高8位字节;

D7-D6位____决定选用的通道号,其值为0-2。



对8253芯片编程的三个步骤:

1.设置命令端口43h: 设置控制字,用来选择通道、工作模式、传输方式等,以备传输。

2.向端口发送一个工作状态字节: 将一个字的计数值,按先低字节后高字节的顺序送入通道的

I/O端口寄存器(通道0为40h,通道1为41h,通道2为42h)。///即设置技术初值

3.确定定时器的工作方式: 若是通道2,给端口61h(8255芯片接口)的第0位和第1位置数,

启动时钟信号,当第1位置1时,通道2驱动扬声器,置0时用于定时操作;

当第3个步骤完成后被编程的通道马上在新的状态下开始工作。由于8253的三个通道都独立于CPU运行,

所以在程序结束以前要恢复各通道的正常状态值。

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧