中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 跪求把这段汇编转换成C语言!!谢谢啦!!!
作者:
标题: 跪求把这段汇编转换成C语言!!谢谢啦!!! 上一主题 | 下一主题
zj57421017
新手上路





积分 5
发帖 2
注册 2010-5-7
状态 离线
『楼 主』:  跪求把这段汇编转换成C语言!!谢谢啦!!! 使用 LLM 解释/回答一下

一,happy birthday 生日快乐歌用21个音阶设计的程序
Void happy birthday()要用C51格式写程序!
{
setb tr0(tr0=1;) ;启动定时器0
start0:
setb p3.3;
30h=0x00;
next:
mov a,30h
mov dptr,#table
inc dptr
movc a,@a+dptr
mov r5,a ;将节拍码存入r5
cjne a,#0ffh,next1
jmp ennd
next1:
clr c
mov a,dpl
subb a,#1
mov dpl,a
mov a,dph
subb a,#0
mov dph,a
mov a,30h
movc a,@a+dptr
jnz sing
clr tr0 ;休止符?是,则不发音
jmp d1 ;跳到d1
sing:
dec a ;取到的音符码减1
mov 22h,a ;存入(22h)
rl a ; 乘2
mov dptr,#table1 ;至table1取相对应的高字节
movc a,@a+dptr
mov th0,a ;取到的高字节存入TH0
mov 21h,a ;取到的高字节存入(21h)
mov a,22h ;乘2
rl a ;加1
inc a ;至table1取相对应的低位
movc a,@a+dptr
mov tl0,a ;取到低字节存入tl0
mov 20h,a ;取到低字节存入(20h)
setb tr0 ;启动timer0
d1:
call delay ;声音延时 基本单位时间 1/4拍187毫秒
inc 30h ;取简码简指针加1
inc 30h ;取简码简指针加1
jmp next ;取下一个码
ennd:
clr tr0 ;停止timer0
ret
table:
db 12,2,0,1,12,2,13,4,12,4,15,4,14,4,0,4
db 12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4
db 12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4
db 18,2,0,1,18,1,17,4,15,4,16,4,15,4,0,4
db 12,2,0,1,12,1,13,4,12,4,15,4,14,4,0,4
db 12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4
db 12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4
db 18,2,0,1,15,1,17,4,15,4,16,4,15,4,0,4,0ffh,0ffh

}


2010-5-8 19:19
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
070
高级用户

苏醒的沉睡者


积分 659
发帖 217
注册 2003-2-15
来自 福建
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

我乱写了一个,应该是有错误的,没测试,只供参考
应该适合turboc




#include <dos.h>

#define DELAY 168
#define SIZE 130

typedef unsigned char BYTE;

int main(int argc, char *argv)
{
BYTE music = {
2,2,0,1,12,2,13,4,12,4,15,4,14,4,0,4,
12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4,
12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4,
18,2,0,1,18,1,17,4,15,4,16,4,15,4,0,4,
12,2,0,1,12,1,13,4,12,4,15,4,14,4,0,4,
12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4,
12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4,
18,2,0,1,15,1,17,4,15,4,16,4,15,4,0,4,
0ffh,0ffh

}

for ( i = 0 ; i < SIZE; i++ )
{
sound(music);
delay(DELAY);

}

nosound();

return 0;
}


应该要把数组里的值再做一下运算,不然这么低的频率应该听不到。。。




好久没碰Dos,手都生了,赶紧回来练练.嘿嘿
2010-5-10 17:14
查看资料  发送邮件  发短消息  网志  OICQ (181315400)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

蜂鸣器发音吗??




综合型编程论坛

我的作品索引
2010-5-11 22:31
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (523066680)  编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

LZ是MCS51单片机的程序,当然不能用基于X86的Turbo C,2楼的程序当然不行。不知LZ所用的编译器可是Keil C?由于C51系列兼容单片机程序存储器容量通常很小(AT89C51为4KB),而C语言的编译效率并不高,在C51使用C语言开发通常意味着要增加不少硬件成本,个人强力推荐在低端单片机开发直接使用汇编。
另,单片机开发要附上电路图(起码要简图),否则很难理解LZ的用意。


2010-5-30 16:56
查看资料  发短消息  网志   编辑帖子  回复  引用回复
cnch
中级用户




积分 326
发帖 70
注册 2003-1-10
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

LZ的这段程序只需稍加改动,应该可以嵌入到Keil C51里的,就象TC一样,它也支持嵌入汇编;另外,你可以学习一下Keil C51,如:象启动定时器0只需写入TR0=1即可,等等....不一一例举.


2010-9-5 15:06
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
cobras
新手上路





积分 14
发帖 5
注册 2007-1-19
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

c51没写过,不过x86还可以.作者的代码差table1和delay.
下面代码已经将table1补全.

short table1 = { // frequency table
// 1 2 3 4 5 6 7
// 82,
// 87, 98, 110, 124, 131, 147, 165,
175, 196, 220, 247, 262, 294, 330,
349, 392, 440, 494, 523, 587, 659,
698, 784, 880, 988, 1047,
};

char table = { // music map, pairs of (tone, beat)
12,2,0,1,12,2,13,4,12,4,15,4,14,4,0,4,
12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4,
12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4,
18,2,0,1,18,1,17,4,15,4,16,4,15,4,0,4,
12,2,0,1,12,1,13,4,12,4,15,4,14,4,0,4,
12,2,0,1,12,1,13,4,12,4,16,4,15,4,0,4,
12,2,0,1,12,1,19,4,17,4,15,4,14,4,13,4,
18,2,0,1,15,1,17,4,15,4,16,4,15,4,0,4,-1,-1
};

void c51_delay(char beat)
{
int delay;
delay = beat * 187;
// sleep of delay ms
}

void c51_start_timer0()
{
// TR0 = 1;
}

void c51_stop_timer0()
{
// TR0 = 0;
}

void c51_make_sound(char tone)
{
union {
short word;
char byte;
}u;

u.word = table1;
// TH0 = u.byte;
// TL0 = u.byte;
}

void c51_happy_birthday(void)
{
int i;

c51_start_timer0();
for (i = 0; table != -1; i += 2) {
if (table == 0) {
c51_stop_timer0();
}else {
c51_make_sound(table);
c51_start_timer0();
}
c51_delay(table);
}
c51_stop_timer0();
}

#include <windows.h>

void happy_birthday(void)
{
int i;
int delay;

for (i = 0; table != -1; i += 2) {
delay = table * 187;
if (table == 0) {
Sleep(delay);
}else {
Beep(table1 - 1], delay);
}
}
}

int main(void)
{
happy_birthday();
return 0;
}


2010-9-10 17:43
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: