急:89C52用IIC控制TEA5767的C程序;

急:89C52用IIC控制TEA5767的C程序;,第1张

#include"reg52h"

#include"24c02h"

#include"lcmh"

#define max_freq 108000

#define min_freq 87500

unsigned char radio_write_data[5]={0xb1,0xa0,0x20,0x11,0x00}; //要写入TEA5767的数据

unsigned char radio_write_data1[5]={0x31,0xa0,0x20,0x11,0x00}; //要写入TEA5767的数据

unsigned char radio_read_data[5]; //TEA5767读出的状态

unsigned int default_pll=0x29c2;//0x29f9; //默认存台的pll,878MHz

unsigned int pll=0;

float frequency=0;

void get_frequency(void);

extern void sta();

extern void wrbyt(unsigned char byt);

extern bit iic_testack() ;

extern void mack();

extern void stop();

extern unsigned char rdbyt();

extern uchar frq[10];

sbit ds_1302=P1^5;

void radio_write(void)

{

unsigned char i;

stop();

sta();

wrbyt(0xc0); //TEA5767写地址

if(!iic_testack())

{

for(i=0;i<5;i++)

{

wrbyt(radio_write_data1[i]);

mack();

}

}

stop();

}

//读TEA5767状态,并转换成频率

void radio_read(void)

{

unsigned char i;

unsigned char temp_l,temp_h;

pll=0;

stop();

sta();

wrbyt(0xc1); //TEA5767读地址

if(!iic_testack())

{

for(i=0;i<5;i++)

{

radio_read_data[i]=rdbyt();

mack();

}

}

stop();

temp_l=radio_read_data[1];

temp_h=radio_read_data[0];

temp_h&=0x3f;

pll=temp_h256+temp_l;

get_frequency();

}

//由频率计算PLL

void get_pll(void)

{

unsigned char hlsi;

unsigned int twpll=0;

hlsi=radio_write_data[2]&0x10;

if (hlsi)

pll=(unsigned int)((float)((frequency+225)4)/(float)32768); //频率单位:k

else

pll=(unsigned int)((float)((frequency-225)4)/(float)32768); //频率单位:k

}

//由PLL计算频率

void get_frequency(void)

{

unsigned char hlsi;

unsigned int npll=0;

npll=pll;

hlsi=radio_write_data[2]&0x10;

if (hlsi)

frequency=(unsigned long)((float)(npll)(float)8192-225); //频率单位:KHz

else

frequency=(unsigned long)((float)(npll)(float)8192+225); //频率单位:KHz

}

//手动设置频率,mode=1,+01MHz; mode=0:-01MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD

void search(bit mode)

{

radio_read();

if(mode)

{

frequency+=50;

if(frequency>max_freq)

frequency=min_freq;

}

else

{

frequency-=50;

if(frequency<min_freq)

frequency=max_freq;

}

EA=0;

get_pll();

radio_write_data1[0]=pll/256;

radio_write_data1[1]=pll%256;

radio_write_data1[2]=0x20;

radio_write_data1[3]=0x11;

radio_write_data1[4]=0x00;

radio_write();

EA=1;

}

void set_frq(uchar frq_m)

{

EA=0;

frequency=(float)((frq_m)1000+((frq_m+1))100+((frq_m+2))10+((frq_m+3)))100;

if((frequency<87500)||(frequency>108500))

{

EA=1;

frq_m=0;

(frq_m+1)=0;

(frq_m+2)=0;

(frq_m+3)=0;

return;

}

get_pll();

radio_write_data1[0]=pll/256;

radio_write_data1[1]=pll%256;

radio_write_data1[2]=0x20;

radio_write_data1[3]=0x11;

radio_write_data1[4]=0x00;

radio_write();

EA=1;

}

void auto_search(uchar dec)

{

int k=0;

unsigned char aa[6]={0};

ds_1302=0;

radio_write();

if(dec)

{

while(frequency<max_freq)

{

get_pll();

radio_write_data1[0]=pll/256;

radio_write_data1[1]=pll%256;

radio_write_data1[2]=0xA0;

radio_write_data1[3]=0x11;

radio_write_data1[4]=0x00;

radio_write_data1[0]|=0x40;

radio_write();

for(k=0;k<20000;k++)

EA=0;

radio_read();

if((radio_read_data[0]&0x80))

{

EA=0;

frequency+=50;

return;

}

}

frequency=min_freq;

}

else

{

while(frequency>min_freq)

{

get_pll();

radio_write_data1[0]=pll/256;

radio_write_data1[1]=pll%256;

radio_write_data1[2]=0x20;

radio_write_data1[3]=0x11;

radio_write_data1[4]=0x00;

radio_write_data1[0]|=0x40;

radio_write();

for(k=0;k<20000;k++)

EA=0;

radio_read();

if((radio_read_data[0]&0x80))

{

EA=0;

frequency-=50;

return;

}

}

frequency=max_freq;

}

}

程序太多,请查收你的邮箱!

IIC协议有讲的,每一次传输都有

起始

应答

错误

总线忙

非应答

等信号格式

NoACK就是非应答,他告诉iic传输的是最后一个数据,TestAck()

是发送一个字后等待从机应答

如果是用汇编语言写的程序,是可以不用先定义的,在程序中直接写引脚,如P21,P22。

只有用C语言写程序时,才必须先要定义引脚的。但不知你是从哪看到的程序,是什么程序?

如果是C程序,肯定是有定义的,而这个定义是不在reg52h 的头文件中的,需要自己来定义的。

如果是别人写的程序,那一定是有的,一是:在自己写的头文件中定义的,应该有一个自己写的头文件。

二是:可以在主程序的前面用sbit 来定义就行的。

有一个51单片机的

/

                LED闪烁的简单试验              

     连接方法: JP11(P2)和JP1用8PIN排线连接起来              

                       

/

#include <reg51h>    //此文件中定义了51的一些特殊功能寄存器

void delay(unsigned int i);  //声明延时函数

main()

{

P1  = 0x00; //置P0口为低电平

delay(600); // 调用延时程序

P1  = 0xff; //置P0口为高电平

delay(600); // 调用延时程序

}

/延时函数/

void delay(unsigned int i)

{

unsigned char j;

for(i; i > 0; i--)

for(j = 255; j > 0; j--);

}

单片机是连线

以上就是关于急:89C52用IIC控制TEA5767的C程序;全部的内容,包括:急:89C52用IIC控制TEA5767的C程序;、单片机C程序:求下面这个单片机IIC总线C程序的详细解释、单片机IIC总线,为什么编程时不用定义sda和scl reg52的document里面也没有这两个啊望指点,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9762885.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存