论坛风格切换切换到宽版
  • 7574阅读
  • 31回复

用89C2051作哑音发生器 [复制链接]

上一主题 下一主题
离线BG7JVJ
 
发帖
14
只看楼主 倒序阅读 0楼 发表于: 2005-06-30
本人用at89c2051作出的哑音发生器,使用上还觉得可以。
现将源程序贴上,请各位指点。
        org   0030h
main:   clr   p3.7
        call   delay
        setb p3.7
        call   delay
        jmp main
delay:   mov   r7,#200
d1:     mov   r6,#200
        djnz r6,$
        djnz   r7,d1
        ret
end
其中的r7与r6的数直接影响频率,at89c2051的晶振也影响频率。
离线BD4VNF
发帖
1208
只看该作者 1楼 发表于: 2005-06-30
弄个正玄函数表进去.然后数模转换,效果会更好.现在这样弄,不合理,浪费单片机资源
离线ahzds
发帖
7423
只看该作者 2楼 发表于: 2005-06-30
2051的工作电压及其后缀、晶振频率(这是最关键的)等关键的条件没有给出来,而且这是个单频点的,修改不方便,这个程序实用可能有一些问题?有没有漂移?延时寄存器的值和频率是什么关系?
建议用定时器来产生频率,可以产生全部标准和非标准亚音。
单频点的用这个简单省事:
http://218.30.21.206/asp/bbs/dispbbs.asp?boardid=10&id=998&page=2

http://218.30.21.206/asp/bbs/showimg.asp?boardid=10&filename=2004-11/2004119151056874.jpg

多频点的用这个方案(需要自己修改):
http://218.30.21.206/asp/bbs/dispbbs.asp?boardid=14&id=1195&page=1
离线BG4RFF
发帖
1581
只看该作者 3楼 发表于: 2005-06-30
'
弄个正玄函数表进去.然后数模转换,效果会更好.现在这样弄,不合理,浪费单片机资源
'
对头,利用p1外接r/2r网络进行da转换,就是直接dds输出了,频率由定时器产生
利用p3口外接编码开关可以选择频率的
我记得会刊上有的02年还是03年的记不清了,你可以去总部网站那边下载过刊看看
离线BG7JVJ
发帖
14
只看该作者 4楼 发表于: 2005-07-01
哦!原来有这么多学问,多谢各位大侠。
离线BG7JUN
发帖
889
只看该作者 5楼 发表于: 2005-07-01
不用正弦表,没那么复杂——通常只是4位d/a,一个波形的幅度上只分8段(只考虑半个正弦波,负半波与正半波对称。其实90度以后与90度以前也是对称),只要把这8个台阶的对应的水平位置记下,对时间计数时超过一个位置、输出幅度加1或减1就可以了,反正输出计数周期比波形周期快得多。
用这种方法做太简单了,我在用pwm做,elan的单片机。
离线BG4RFF
发帖
1581
只看该作者 6楼 发表于: 2005-07-01
呵呵
反正rom够了,牺牲硬件换取软件算法的简单
离线BG7JVJ
发帖
14
只看该作者 7楼 发表于: 2005-07-02
'
不用正弦表,没那么复杂——通常只是4位d/a,一个波形的幅度上只分8段(只考虑半个正弦波,负半波与正半波对称。其实90度以后与90度以前也是对称),只要把这8个台阶的对应的水平位置记下,对时间计数时超过一个位置、输出幅度加1或减1就可以了,反正输出计数周期比波形周期快得多。
用这种方法做太简单了,我在用pwm做,elan的单片机。
'

bg7jun,你好!我现在的做法是利用方波输出,然后经电阻、电容积分成锯齿波。
离线BG7JUN
发帖
889
只看该作者 8楼 发表于: 2005-07-04
'
bg7jun,你好!我现在的做法是利用方波输出,然后经电阻、电容积分成锯齿波。
'
呵呵,这个我看得出来。改进的话,用电阻搭个da,软件简单一点;用pwm输出的话软件就复杂一点。
方波也凑和吧,谐波大一点,容易有交流声。另外,因为最低的67hz和最高的254.1hz差得太多,所以低通不容易做(截止频率高了对低频不起作用,低了高频幅度小),高/低两端幅度会差得比较多。
改改软件用pwm吧,硬件成本不增加,但谐波好很多。
如果用带pwm功能的单片机做就简单了——反正pwm值是一直在重复置入的,时刻一到,把pwm占空比的值加1或减1就行了,还是很方便的。而且,因为pwm周期是定频的,所以低通很容易做好。
离线BG7JVJ
发帖
14
只看该作者 9楼 发表于: 2005-07-05
jun大侠,你好!本人刚入单门,对pwm一点也不知道,请大侠多多指点。
离线BG7JUN
发帖
889
只看该作者 10楼 发表于: 2005-07-05
pwm就是:如果要输出幅度最大是8,那么对于幅度为1,就是1/8的时间输出高、其它7/8的时间输出低(“1/8”称为“占空比”);如果是2,就是2/8高、6/8低……依此类推,直到8/8,也就是整个时间都是高。连续输出这个脉冲波就得到了一个平均的电压;连续改变脉冲的占空比就可输出任意波形。
如果输出是正负波形的,那么,-1对应7/16,1对应9/16,0对应8/16……依此类推,-8就是0/16,8对应16/16。然后用电容隔直。
这个“16”的周期(通常叫斩波周期,它的频率叫斩波频率),要比输出波形的最高频率高10倍以上,越高越好。例如,对于亚音,斩波频率至少要2.5khz,为了低通电路简单一点,至少要做到10k以上。尽量对于不同的亚音用相同的斩波频率,亚音频率的变化用不同的个数的斩波周期来实现,幅度就不会随亚音频率变化了——楼主那个电路用积分电路实现低通,最低频和最高频率的幅度会差4倍。
pwm是实现da的一种方法——如果周期足够小、对占空比计数的分辨率足够高,再加上一些数字滤波算法,就可以得到一种称为sigma-delta的da转换算法(前面那两个英文单词实际上是两个希腊字母,懒得找了),现在cd的转换很多就是用这种方法,可以实现96k-20bit的精度。
离线BG4RFF
发帖
1581
只看该作者 11楼 发表于: 2005-07-05
我认为还是用直接dds的好,不需要太快的速度,用51建议用那个电阻网络转换的
假如你的单片机足够快,比如用pic或者avr就另当别论了
离线BG7JUN
发帖
889
只看该作者 12楼 发表于: 2005-07-05
'
呵呵
反正rom够了,牺牲硬件换取软件算法的简单
'
如果彻底牺牲的话,找个eprom,写上8位的正弦表(7位da加一位符号位),外接一个晶体驱动的可置数计数器去驱动eprom的地址线,用d/a或r-2r权电阻网络接在数据线上,就是一个dds的原型电路了——全硬件实现……
单片机加da(权电阻网络也是da)是最灵活、经济的方案,不过牺牲得不够彻底。
以前做过一个复杂的32路语音录放控制电路,用在产品中——用epld做计数器,51单片机控制地址计数器初始值和结束值的置数,flash保存声音;epld自动实现每周期/每通道地址加1和结束地址判断;epld外接ram用于保存32路地址的初始值、结束值和当前地址值,内部用寄存器实现状态控制,可以同时控制32路语音播放;外接flash保存语音,可以通过epld实现录音(呵呵,这个功能也很难做的,用过flash的不仿想想难在什么地方?);每通道时序需要超前计算和判断——这是以前做过最得意的电路之一,其实就是个小规模的专用控制器,因为一片epld做不下,两片epld之间还通过数据线交换状态。现在已经想不起来当时是怎么把这么复杂的东西一步步实现的,而且也只用了个把月,拿几张纸画了画时序图、没费什么劲就定了方案和epld的规模——那时好象比现在聪明得多。
离线BG7JUN
发帖
889
只看该作者 13楼 发表于: 2005-07-05
'
我认为还是用直接dds的好,不需要太快的速度,用51建议用那个电阻网络转换的
假如你的单片机足够快,比如用pic或者avr就另当别论了
'
硬件有硬件的做法,软件有软件的做法,看各人擅长和喜好,以及这个电路还要实现什么附加功能——不用亚音片、用纯硬件也可以实现,只不过成本及灵活性比较差。
如果用da实现,软件就没什么好做的了,也是最常用的亚音生成方法;如果用pwm实现,尤其是在51上,对于写软件就需要技巧,才有点挑战性。如果是做产品,前者在可行性、成功率、成本等方面都有无可比拟的优势;如果是玩,那就用后者,理由就是“更好玩”。
做系统设计,最忌讳直接就想到某个方法是最好的,哪怕凭直觉就知道这个方法优势很多,也必须作为多个方案之一进行评审。
离线BG4RFF
发帖
1581
只看该作者 14楼 发表于: 2005-07-05
'
硬件有硬件的做法,软件有软件的做法,看各人擅长和喜好,以及这个电路还要实现什么附加功能——不用亚音片、用纯硬件也可以实现,只不过成本及灵活性比较差。
如果用da实现,软件就没什么好做的了,也是最常用的亚音生成方法;如果用pwm实现,尤其是在51上,对于写软件就需要技巧,才有点挑战性。如果是做产品,前者在可行性、成功率、成本等方面都有无可比拟的优势;如果是玩,那就用后者,理由就是“更好玩”。
做系统设计,最忌讳直接就想到某个方法是最好的,哪怕凭直觉就知道这个方法优势很多,也必须作为多个方案之一进行评审。
'



哦,我可没考虑那么多,我只是想用自己觉得简单点的思路去完成的,原来还有这些
我的确该多学学了
离线1a2b3c
发帖
204
只看该作者 15楼 发表于: 2005-07-05
感觉好浪费和复杂化,
另外有了单片机等高时钟的东西在里面,对接收机很影响,,本来就忌讳这些
离线BG7JUN
发帖
889
只看该作者 16楼 发表于: 2005-07-06
'
感觉好浪费和复杂化,
另外有了单片机等高时钟的东西在里面,对接收机很影响,,本来就忌讳这些
'
这也要担心?哪个机器里不用单片机了?内置ram/rom的片子emc很容易控制,不用担心。
有些icom、kenwood的手台,里面有主副两个单片机。
离线1a2b3c
发帖
204
只看该作者 17楼 发表于: 2005-07-06
所以实际的很多地方对单片机等部分进行了屏蔽,原因也是因为这个,另外选择晶体频率的时候也很注意,免得高次落入接收的范围。当然这对大部分的非单点接收机来说似乎没有影响,但如果正好你的接收机只接收一个频点,又正好是偕波那就知道了。

当然现在的机器不可能没有处理器的参与,可以说100%的需要,因此这方面的处理也越重要。
离线BG7JUN
发帖
889
只看该作者 18楼 发表于: 2005-07-06
呵呵,我当然知道,我就做这个的。屏蔽主要用在接收电路的lna、1st mix部分,最需要屏蔽的是vco,其它地方基本上都可以不屏蔽。对于现在内置rom的mcu,如果有低emc型的、而且时钟速率不是很高的,基本上挨在一起布板都没问题,通常只有vco一个屏蔽罩。
对于超外差的电路,谐波不能落在接收机高放通带内,稍稍再考虑一下组合干扰的问题,问题就不大了,如果有问题就要换个晶体频率了。零中频的机器就难设计了——最近才发现motorola的6200(frs机)居然是零中频的电路,不过灵敏度太低,只有-113dbm。
宽带接收机就难以避免了,yaesu的设计比较有意思,用一个io口控制一个三极管作为开关来控制一个电容,如果某个频率有干扰,通过这个io口使mcu的工作频率偏一点,干扰就没有了。
离线BG7JVJ
发帖
14
只看该作者 19楼 发表于: 2005-07-06
'
pwm就是:如果要输出幅度最大是8,那么对于幅度为1,就是1/8的时间输出高、其它7/8的时间输出低(“1/8”称为“占空比”);如果是2,就是2/8高、6/8低……依此类推,直到8/8,也就是整个时间都是高。连续输出这个脉冲波就得到了一个平均的电压;连续改变脉冲的占空比就可输出任意波形。
如果输出是正负波形的,那么,-1对应7/16,1对应9/16,0对应8/16……依此类推,-8就是0/16,8对应16/16。然后用电容隔直。
这个“16”的周期(通常叫斩波周期,它的频率叫斩波频率),要比输出波形的最高频率高10倍以上,越高越好。例如,对于亚音,斩波频率至少要2.5khz,为了低通电路简单一点,至少要做到10k以上。尽量对于不同的亚音用相同的斩波频率,亚音频率的变化用不同的个数的斩波周期来实现,幅度就不会随亚音频率变化了——楼主那个电路用积分电路实现低通,最低频和最高频率的幅度会差4倍。
pwm是实现da的一种方法——如果周期足够小、对占空比计数的分辨率足够高,再加上一些数字滤波算法,就可以得到一种称为sigma-delta的da转换算法(前面那两个英文单词实际上是两个希腊字母,懒得找了),现在cd的转换很多就是用这种方法,可以实现96k-20bit的精度。
'

bg7jun大侠你好!如你所说,斩波频率会对音频影响啊?
真正做出的哑音你用来上台试过了吗?我很想试试,不过我还没有这方面的编程技巧。
是否有什么源程序能指点吗?