w412321 发表于 2017-9-24 10:52:27

乙猪老师,我把7脚8脚置低现象依旧。

无声岁月 发表于 2017-9-24 11:21:30

在你原来程序的这段:
lcall I2C_WRITE   ;调用I2C写入程序
SETB SCL
SETBSDA
;---------------------------------------------------------------------------------------
改为:
lcall I2C_WRITE   ;调用I2C写入程序
SETB SCL
SETBSDA
L1: SJMPL1
;---------------------------------------------------------------------------------------
改完要重新汇编,没错,再才写入芯片试试

无声岁月 发表于 2017-9-24 11:30:07

原来不对的地方是调完子程序(即执行:lcall I2C_WRITE   ;调用I2C写入程序)后,再次执行I2C_WRITE,应该加一个死循环---L1: SJMPL1

无声岁月 发表于 2017-9-24 11:41:26

如有仿真器跟踪一下就更好

w412321 发表于 2017-9-24 13:10:39

无声岁月 发表于 2017-9-24 11:41
如有仿真器跟踪一下就更好

按照您说的,我刚才又试了重新编译程序,在程序的加上了这句L1: SJMPL1 跳转指令,
结果收不到电台了。
又改在在END指令前面加上L1: SJMPL1,还是收不到声音了。
去掉L1: SJMPL1指令,能收到电台了,但收台声音还是忽大忽小的。
我又仔细的看了程序,修改的部分指令后重新编译,结果收台声音还是忽大忽小。
现在我怀疑是不是我的STOP子程序写的有问题,还是程序架构有错误。

前后改了十多次了。
对了,我没有仿真器,都是自己装好电路,直接写程序试验。
因为初学单片机,我的水平低,见笑了。

无声岁月 发表于 2017-9-24 19:40:38

因为我没用过RDA5807,所以只能根据我的理解给一点建议,不一定能帮得了你,请见谅。1-我在17楼写的修改方法应该是正常写程序的方法,也就是在主程序有一个循环程序段,不然主程序调用完子程序后程序会乱跑;但由于你说改了之后不能收音,那么就应该是子程序段I2C_WRITE有问题;2-我看了一下子程序I2C_WRITE,其中“I2C_ACk:    ;;;;;发送接收确认信号“这段程序应该是接收RDA5807返回的ACK,基本没问题,但最好能加上一个循环等待ACK的到来,否则可能没收到ACK你的单片机就开始发下一数据;3-你可以参考别人的程序,仔细对照一下看漏了那些细节

无声岁月 发表于 2017-9-24 19:41:22

也可能芯片有缺陷,这个网上有人反映,看:http://www.52rd.com/Blog/Detail_RD.Blog_gower_dcg_24122.html

无声岁月 发表于 2017-9-24 19:43:51

本帖最后由 无声岁月 于 2017-9-24 19:44 编辑

学单片机最好要有仿真器,不然出问题很浪费时间

乙猪 发表于 2017-9-24 20:26:31

无声岁月 发表于 2017-9-24 19:43
学单片机最好要有仿真器,不然出问题很浪费时间

或者买一个逻辑分析仪。

yangcheng84 发表于 2017-9-24 23:38:14

w412321 发表于 2017-9-22 19:36
请 yangcheng84坛友指教。
发上来我写的小程序,见笑了。

我很久不用汇编了,也没看5807手册.

看了您原文,似乎程序没有跑循坏.且编程首地址就是0000H,没有跳过中断向量,可能就是问题所在.

改2地方:

编程地址
ORG000H

改为ORG0100H



写完数据就死循环:
RET改为

LOOP:SJMPLOOP


另外增加上电延时

改写后如下:

SDA EQU P3.2 ;;
SCL EQU P3.3 ;;

ORG 100H    ;跳转到100H开始编程



START:


mov p3, #0ffh   ;2051P3口P1口全置高
mov p1, #0ffh

setbSCL ;;5807 7脚
setb   SDA ;;5807 8脚

lcall yanshi_350ms   ;长延时,待上电稳定
lcall yanshi_350ms
lcall yanshi_350ms

MOV SP,#5fH



mov 50h, #11000000b    ;工作于5767模式
mov 51h, #2dh          ;;;;;;95mhz
mov 52h, #68h          ;;;;;;95mhz
mov 53h, #00011000b;;
mov 54h, #00010000b;;
mov 55h, #00000000b;;

lcall I2C_WRITE   ;调用I2C写入程序
SETB SCL
SETBSDA
;---------------------------------------------------------------------------------------

I2C_WRITE:          ;;;I2C写入数据
                     ;;
LCALL I2C_START   ;发送开始信号


MOV A,50h            ;50H送数;
LCALL I2C_SEND8BIT   ;;;送八位数据
LCALL I2C_ACK      ;;;发送接收确认信号
                     ;=1,无确认,再次发送


MOV A,51h
LCALL I2C_SEND8BIT
LCALL I2C_ACK


MOV A,52h
LCALL I2C_SEND8BIT
LCALL I2C_ACK


MOV A,53h
LCALL I2C_SEND8BIT
LCALL I2C_ACK


MOV A,54h
LCALL I2C_SEND8BIT
LCALL I2C_ACK



MOV A,55h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET

LOOP:SJMP LOOP   ; //死循环
;-----------------------------------------------------
;=======================================================

w412321 发表于 2017-9-25 00:56:58

感谢yangcheng84和无声岁月、乙猪坛友的帮助。
yangcheng84坛友,我按照您的方法修改了程序,
不加LOOP:SJMP LOOP   ; //死循环这句,能收到电台,声音还是一会儿大一会儿小。
加上LOOP:SJMP LOOP   ; //死循环 这句,就收不到台了,噪声一片。

w412321 发表于 2017-9-25 00:59:42

无声岁月坛友提供的链接我看了,下面的回复里就有人说RDA5907不能直接置频,只能自动搜索。
难道5807真的不能直接置频吗?
明天我在仔细看看程序。

tanjianchao 发表于 2017-9-25 13:04:29

w412321 发表于 2017-9-25 00:59
无声岁月坛友提供的链接我看了,下面的回复里就有人说RDA5907不能直接置频,只能自动搜索。
难道5807真的 ...

RDA5807是可以搜索和直接置频的,但由于我不懂汇编,只懂bascom-avr语言,我写过bascom的程序,帮不了你了。

w412321 发表于 2017-9-25 20:21:57

tanjianchao 发表于 2017-9-25 13:04
RDA5807是可以搜索和直接置频的,但由于我不懂汇编,只懂bascom-avr语言,我写过bascom的程序,帮不了你 ...

把你的写频思路讲讲也好,说说5807寄存器的设置。
我是刚入门单片机,玩5807 就当是一个学习进步的机会。

tanjianchao 发表于 2017-9-25 21:31:07

w412321 发表于 2017-9-25 20:21
把你的写频思路讲讲也好,说说5807寄存器的设置。
我是刚入门单片机,玩5807 就当是一个学习进步的机会 ...

下面是直接置频的子程序:

I2cstart
I2cwbyte &B00100000                                        '&H20芯片地址
I2cwbyte &B11010010                                        '02H    下面是寄存器地址
I2cwbyte &B00000001                                        '02L
Pll = Freq - 870
Byte0 = Pll / 4
Portc.4 = 0
Waitms 2
I2cwbyte Byte0                                                    '03H
Byte1 = Byte0 * 4
Byte1 = Pll - Byte1
Byte1 = Byte1 * 64
Byte1.4 = 1
I2cwbyte Byte1                                                   '03L
I2cwbyte &B00000010                                        '04H
I2cwbyte &B00000000                                        '04L
I2cwbyte &B10001000                                        '05H
I2cwbyte &B10001111                                        '05L,1111=音量最大,0000=静音,0111比较合适
I2cstop
页: 1 [2] 3 4 5 6
查看完整版本: 用RDA5807做个简单的收音机,求助寄存器设置问题