⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机控制高频头i2c程序.txt

📁 单片机控制高频头I2C程序,对于开发流媒体方面人员有用
💻 TXT
字号:
#include<reg52.h>
#include<stdio.h>
#define DELAY_TIME 100 /*不要小于100!否则可能造成时序混乱*/
#define TRUE 1
#define FALSE 0

sbit SCL=P2^1;/*假设由P2.1和P2.0控制*/
sbit SDA=P2^0;

sbit KEYP12=P2^2;
sbit KEYP13=P2^3;

void system_init(void);
void BPS19200();
void delay_ms(int number1);


unsigned int ADD,DB1,DB2,PB,temp,temp1;
unsigned int NDB;
unsigned int fr;

    void I2C_Start(void)
    {
        /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=0;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

    void I2C_Stop(void)
    {
        /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

    void SEND_0(void)   /* SEND ACK */
    {
        /*发送0,在SCL为高电平时使SDA信号为低*/
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

    void SEND_1(void)
    {
        /*发送1,在SCL为高电平时使SDA信号为高*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

    bit ChAck(void)
    {
        /*发送完一个字节后检验设备的应答信号*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        F0=SDA;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
        if(F0==1)
            printf("write Wrong!\n");
        return TRUE;
    }

    void WriteI2CByte(char b)reentrant
    {
        /*向I2C总线写一个字节*/
        char i;
        for(i=0;i<8;i++)
            if((b<<i)&0x80)
                SEND_1();
            else
                SEND_0();
    }

void system_init(void)//系统初始化
{    
    SCON = 0x50; //串口方式1,允许接收
    PCON=  0x80; // SMOD=1, 波特率加倍
    TMOD = 0x20; //定时器1 定时方式2
    TCON = 0x40; //设定时器1 开始计数
    BPS19200();
    TI = 1;
    TR1 = 1; //启动定时器
    //printf("AT+CNMI=2,7\r");
        
}

void BPS19200()
{
    TH1 = 0xFA;  //22.1184M 19200 波特率
    TL1 = 0xFA;
}


void delay_ms(int number1)//延时函数
{                                   //craystal  22.1184Mhz
    unsigned char i; 
    unsigned int j;
    for (j=0;j<number1;j++)
    {
            for (i=0;i<229;i++);   //11.0592Mhz   (1ms)       
            for (i=0;i<229;i++);   //22.1184Mhz   (1ms) 
    }
}

/***********************************主程序*********************************/

void main()
{
    
    system_init(); //系统初始化
    //Start-C2-ACK-05-ACK-8A-CE-ACK-ACK-A4-ACK-STOP

    ADD=0XC2; //地址
    DB1=0X0B; //分频1
    DB2=0X54; //分频2
    while(1)
    {
        KEYP12=1;
        KEYP13=1;
        if(KEYP12==0) 
            {
            DB2++;
            if(DB2>255) DB2=0,DB1++;
            }
        if(KEYP13==0) 
            {
            DB2--;
            if(DB2==0) DB2=255,DB1--;
            }


    I2C_Start();//I2C总线开始
     
    WriteI2CByte(ADD);
    ChAck();
                
    WriteI2CByte(DB1);
    ChAck();
    
    WriteI2CByte(DB2);
    ChAck();

    WriteI2CByte(0x8E);
    ChAck();

    
    NDB=(DB1*256+DB2)/16;
    NDB=NDB-38;
    
    if(NDB>0 && NDB<160) PB=0XA0;
    if(NDB>168 && NDB<464) PB=0X90;
    if(NDB>471 && NDB<863) PB=0X30; //频段计算
    
    WriteI2CByte(PB);  //频段控制
    ChAck(); 

    I2C_Stop(); //I2C总线停止
    
    delay_ms(100);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -