📄 单片机控制高频头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 + -