51单片机的调音台混响控制电路[声明:] 由于本文内容过于简单,因此只供51编程初学者参考,高手请飘过。。。[正文:]上午一个朋友打电话说收了个调音台,数码混响电路坏了,一片M65831数码混响IC和一片89C2051控制电路烧得发黄,更换M65831后混响固定为500mS,无法调节。随后发了个图纸给我,简单分析后发现电路并不复杂,89S2051接受两个按键的控制信号,进行增减计数并显示在数码管上,同时输出控制信号(D1~D4)给M65831以控制混响时间。每次设置值改变后都送入一片24C08保存。网上查到了M65831的手册,D1~D4其实就是对应0~16的二进制步进数值。鉴于该电路比较简单,重新编程的过程比较适合初学者参考,因此挖个坑,把重写过程开源供大家参考。[未完待续][本帖最后由DreamonII于2008-12-114:53编辑]电路虽简单,但需要控制的部件还挺多的。。。 ·控制7段数码管,显示0~9,A~F共16个字符; ·检测两个键的状态,我理解为一键增,一键减,再加个功能:两键同时按为清0; ·读写24C01(SDA,SCK); ·控制M65831混响时间(D1~D4计数输出)。老规矩,逐一解决然后整合。注意:以下代码采用KeilC51编写,直接在贴子里边想边写,未测试,写完后再统一调试。为书写方便****惯性定义两个类型:#defineucharunsignedchar#defineuint unsignedint复制代码由图中可以看出各控制端口的功能定义:#defineLED P1 //,输出恒为1;#defineCTRL P3 //~=P1^0; //向上键sbitKEY_2=P3^7; //向下键sbitSCK =P3^4; //IIC串行时钟,用于读写24C08sbitSDA =P3^5; //IIC串行数据,用于读写24C08ucharvalue; //定义一个变量,用于保存混响值复制代码还不知道会不会有问题,先写着,出错再改。。。再来看数码管显示控制。一提到51控制数码管,第一反应就是查表。定义显示表并不是容易的事,费时费力,好在我有先见之明,很早前就写了51LED代码生成器。。。对照图中接法逐一设置端口与笔段对应关系,注意,由于采用了共阳接法(所有笔段都是低电平点亮),因此要勾选“反相”复选钮。设置好了,点“常用字符集”按钮,生成了0~F共16个数字和一个“-”,再点一下“生成源码”按钮,码表生成好了。。。ucharcodetable[17]={0x03, 0xcf,0x25,0x85,0xc9,0x91, 0x11,0xc7,0x01,0x81,0x41, 0x19,0x33,0x0d,0x31,0x71, 0xfd};复制代码[待续][本帖最后由DreamonII于2008-12-116:43编辑]()下载次数:52008-12-113:50再看看怎么查表显示。。。//在LED上显示数字voidDisplay(ucharch){ LED=table[ch]|0x01; //查表显示。,以读取键值}复制代码什么????就这么简单???是的啊。。。不然还能怎么样呢????tid=75943&extra=page%3D4我的程序中写的有错误,不更正了。。。[未完待续]再来看看我们伟大的主要功能:混响时间控制。。。//向M65831发送控制信息voidDelayCtrl(ucharval){ uchartemp; temp=CTRL&0x0f; //保存非控制信息,并清除控制位 temp|=(val<<4); //合并控制数据 CTRL=temp; //这就完了。。。}复制代码好象还差点什么。。。。哦,对了,键“盘”。。。就两个键,这事好办了。。。放在主函数main()里查询就可以了。。。在写main()之前还有些事不得不做。。。首先,俺家51单片机太“快”了。。。如果让它撒开了跑的话,就算你只用1MHz的晶振,也会在你按下键的一瞬间把整段程序跑上几百个来回。。。咋办捏??答对了。。。延时。。。做个嵌套循环来托延一下时间,让51跑慢点。。。//延时。。。voidDelay(ucharn){ uchari=0xff; //小样,我就不信累不死你。。。 while(n--) { while(i--); i=0xff; }}复制代码其次,就算你延时了,按键判断的时间间隔也还是太短了。。。所
混响电路设计 来自淘豆网www.taodocs.com转载请标明出处.