w412321
发表于 2017-9-26 11:39:06
我感觉,程序是错误之处还是在 I2c总线 协议的操作方法上我没有吃透,
我理解的是:单片机2051作为主控器,首先给5807发送 “”开始信号“”,
5807收到信号后,返给2051一个应答信号“”ACK“”,并发出特定的低电平脉冲,表示已收到数据。
如果5807没有收到单片机2051发送的数据,应该再重新发送数据。怎么判断?
2051发送数据完毕,最后再发送一个结束的STOP信号。
我的程序错误的地方是不是在:单片机2051对5807发出的“ACK”应答信号的判断上。
ace919
发表于 2017-9-26 16:18:01
RDA5807没有用过,51汇编汇编还玩过。楼主发个目前的完整程序,也许能帮忙看一看
w412321
发表于 2017-9-26 22:49:12
ace919 发表于 2017-9-26 16:18
RDA5807没有用过,51汇编汇编还玩过。楼主发个目前的完整程序,也许能帮忙看一看
感谢兄弟的帮忙。
完整的程序在4楼我发的压缩包里。
要是都复制粘贴下来太长,怕坛友不好看。
ace919
发表于 2017-9-27 07:49:37
本帖最后由 ace919 于 2017-9-27 08:23 编辑
w412321 发表于 2017-9-26 22:49
感谢兄弟的帮忙。
完整的程序在4楼我发的压缩包里。
要是都复制粘贴下来太长,怕坛友不好看。
收到。请问2051的晶振是3.579545M吗?
另外单片机具体型号是什么?AT89C2051还是STC的?
w412321
发表于 2017-9-27 12:58:09
ace919 发表于 2017-9-27 07:49
收到。请问2051的晶振是3.579545M吗?
另外单片机具体型号是什么?AT89C2051还是STC的?
晶振是3.579545的。
单片机是at89c2051
ace919
发表于 2017-9-27 15:47:25
w412321 发表于 2017-9-27 12:58
晶振是3.579545的。
单片机是at89c2051
匆忙中改了个,原来没用过手头也没有RDA5807,效果未知如何,楼主试试吧。
RDA5807 Pin10的电解上最好再并联个103-104的独石电容,以加强高频滤波。
飞蟾
发表于 2017-9-27 16:31:48
本帖最后由 飞蟾 于 2017-9-27 16:35 编辑
LZ的问题解决没有?解决了就不用往下看了。
你的汇编程序本意是上电后先用yanshi_350ms子程序延时,再调用I2C_WRITE子程序一次,对RDA5807进行配置,然后就进入正常使用了(调用完I2C_WRITE之后是SETB SCL和SETB SDA,这是让I2C总线空闲),是吧?
问题在于你的程序接下来就没有然后了,再往下就是I2C_WRITE和其他子程序了。恕我直言,这是初学编程的新手最常见的失误之一。你的主程序执行完之后,你以为配置完了就可以正常使用了,可单片机还会继续往下走,就会进入到I2C_WRITE子程序,然后在这个子程序末尾碰到返回指令RET。那么问题来了,这次执行I2C_WRITE并不是主程序调用的,是因为你的疏忽导致单片机自己掉进来的,那么它会RET去哪呢?天知道。除非你把单片机拔了。
要改正也很简单,在LCALL I2C_WRITE、SETB SCL和SETB SDA这三句后面,I2C_WRITE之前,加一句:
LP1:SJMP LP1;
然后就会像你把单片机拔了一样,彻底清净了。
快乐毛毛虫
发表于 2017-9-27 20:57:29
电台频率数据只发一次即可,否则就是忽大忽小的,如果发送数据快点的话,就是仆仆声了。
w412321
发表于 2017-9-28 00:05:47
ace919 发表于 2017-9-27 15:47
匆忙中改了个,原来没用过手头也没有RDA5807,效果未知如何,楼主试试吧。
RDA5807 Pin10的电解上最好再 ...
感谢ace919坛友的帮助。
您的程序刚才我编译后,上机实验了一下。
现象是这样的:
开机通电,喇叭里轻微的“塔”的一声,约2秒后,“沙、沙”两声,如此重复。
我把单片机拔掉,里面变成了一直是“沙”的噪声。
我又把单片机插上,出现的电台的声音,非常稳定了。
我断电后再一次开机,还是喇叭里轻微的“塔”的一声,约2秒后,“沙、沙”两声。
这次我不拔下2051,把它的1脚用镊子接5V复位一下,也出现了电台的声音,并且很稳定。
w412321
发表于 2017-9-28 00:28:16
飞蟾 发表于 2017-9-27 16:31
LZ的问题解决没有?解决了就不用往下看了。
你的汇编程序本意是上电后先用yanshi_350ms子程序延时,再调用 ...
感谢兄台指教。
我确实是犯了这样的错误,上次两个坛友也给我指出了这个问题。
上次我已经按照yangcheng84坛友的指导,增加了“LP1: sjmp LP1”这句指令,
刚才我又按照您说的加上这句指令,通电开机也是只有“沙”的噪声,
同样,不拔单片机,我用镊子给2051复位后,出现了电台的声音。
w412321
发表于 2017-9-28 00:31:19
快乐毛毛虫 发表于 2017-9-27 20:57
电台频率数据只发一次即可,否则就是忽大忽小的,如果发送数据快点的话,就是仆仆声了。
您是个单片机的高手。
明天我再看看程序,重新修改一下。
baofu
发表于 2017-9-28 07:05:30
w412321 发表于 2017-9-28 00:28
感谢兄台指教。
我确实是犯了这样的错误,上次两个坛友也给我指出了这个问题。
上次我已经按照yangchen ...
根据你说的,相当于上电加载程序不行,但复位后重新加载一次就可以。先怀疑单片机复位电路,比如电容电阻是否数值不合适?可以将单片机拿下来,用别的程序,例如流水灯程序实验一下,如果也是这样,开始不行,就证明是复位问题。再者,很多程序都是一开始,什么也不干,先加入较长的延时,目的就是等器件上电完全稳定后再开始真正的步骤。
ace919
发表于 2017-9-28 08:56:57
w412321 发表于 2017-9-28 00:05
感谢ace919坛友的帮助。
您的程序刚才我编译后,上机实验了一下。
现象是这样的:
确实如前面网友baofu所说,应该怀疑目前单片机复位电路可能有问题,检查复位用的电容电阻是否与图中数值基本一致,另外确认电解不漏电。
为明确显示程序正在运行中,可以加个LED。下面改的软件LED在P3.5,复位后LED长亮1.5秒左右,然后以半秒亮半秒灭的速率闪烁。另外软件中把P3口置1的语句加上了,以防硬件复位不彻底
w412321
发表于 2017-9-28 23:52:27
ace919 发表于 2017-9-28 08:56
确实如前面网友baofu所说,应该怀疑目前单片机复位电路可能有问题,检查复位用的电容电阻是否与图中数值 ...
今天白天比较忙,所以晚上才打开电脑。抱歉。
按照你所说的,我把这第二个程序下载后编译,上机通电。
P3.5所接发光管先是亮约2秒钟,后0.5秒钟闪烁。
但还是收不到电台声音,喇叭里有间歇的“沙沙”声。
说明程序已经运行。
这时候再用镊子把2051的1脚对5V复位,喇叭里出现稳定的电台声音了。
开机瞬间,我用数字表测试2051的脚,
电压显示2.3V一闪,变成0V,说明复位电路正常。
ace919
发表于 2017-9-29 08:13:58
本帖最后由 ace919 于 2017-9-29 08:29 编辑
w412321 发表于 2017-9-28 23:52
今天白天比较忙,所以晚上才打开电脑。抱歉。
按照你所说的,我把这第二个程序下载后编译,上机通电。
...
LED的亮灭规律及你的测量都表明复位正确,单片机程序已执行。目前怀疑2点:
1. RDA5807上电稳定的时间大于0.5秒,需要增大写入I2C数据之前的延迟;
2. 因为某种未知原因,需要第二次写入RDA5807才会起作用,可以循环写2次试试
下面的版本两种措施都加上了,你试试看