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

📄 main.c

📁 C51写的Zi2020 FM发射模块控制代码!
💻 C
字号:
//===================================================
//
//	模块:	无线发射模块
//
//	日期:	2007-08-03
//
//	作者:	施探宇
//
//	说明:	Zi2020
//
//
//===================================================
#include "at89s53.h"

//---------------------------------------------------
//	测试串口速率
//---------------------------------------------------
//#define DEBUG_SPEED

//	类型定义
typedef unsigned char 	BYTE;
typedef unsigned int 	WORD;

//---------------------------------------------------
//	I2C 控制脚定义
//---------------------------------------------------
//sbit P_SDA = P3^7;
//sbit P_SCL = P3^2;
sbit P_SPK = P2^0;

sbit P_SDA = P3^6;
sbit P_SCL = P3^5;
//===================================================
//	串口初始
//===================================================
void ComInit()
{
	TR1 = 0; //启动定时器

	SCON = 0x50; //串口方式1,允许接收
	TMOD = 0x20; //定时器1定时方式2
	TCON = 0x40; //设定时器1开始计数
	PCON = 0x80; //波特率加倍控制,SMOD位

	// 	初始化速率:19200bps.
	TH1 = 253;
	TL1 = 253;

	//	清收发标志
	RI = 0; 
	TI = 0;

	//	启动定时器
	TR1 = 1; 
}

//===================================================
//	串口输出字符串(非中断方式)
//===================================================
void ComOutput(const BYTE Str[])
{
	BYTE i = 0;

	while(Str[i]) //判断是否到了字符串的尾部
	{
		SBUF = Str[i++]; 
		//输出字符
		
		while(!TI)
			;
		//空语句判断字符是否发完

		TI = 0; 
		//清TI
	}
}

//===================================================
//	串口接收字符串
//===================================================
void ComInput(BYTE Str[])
{
	BYTE c = 0;
	BYTE i = 0;

	do{
		// 	空语句判断字符是否收完
		while(!RI);

		//	读取字符
		Str[i] = SBUF;

		//	保存字符
		c = Str[i++];
		
		//	清RI
		RI = 0; 	
	
	//	判断是否到了字符串的尾部
	}while(c && (c != 0x0a) && (c != 0x0d) && (c != '@'));
	Str[i] = 0;
}

//===================================================
//	I2C延时
//===================================================
void I2cDelay()
{
	int j;
	for(j = 0; j < 20; j++)
	{
		;
	}
}

//===================================================
//	I2c开始
//===================================================
void I2cStart()
{
	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 0;
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2c停止
//===================================================
void I2cStop()
{
 	P_SDA = 0;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 1;
	I2cDelay();
}

//===================================================
//	I2c读应答
//===================================================
BYTE I2cGetAck()
{
	BYTE iAck = 0;

	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	if(!P_SDA)
		iAck = 1;
	else
		iAck = 0;
	I2cDelay();

	P_SCL = 0;
	I2cDelay();

	return iAck;
}

//===================================================
//	I2c主应答
//===================================================
void I2cSetAck()
{
	P_SDA = 0;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
	P_SDA = 1;
}

//===================================================
//	I2c写入一个字节
//===================================================
void I2cWriteByte(BYTE nData)
{
	BYTE i;

	for(i = 0;i < 8;i ++)
	{
		if(nData & 0x80)
		{
			P_SDA = 1;
		}
		else
		{
			P_SDA = 0;
		}
		nData <<= 1;
		I2cDelay();

		P_SCL = 1;
		I2cDelay();
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}
	I2cDelay();
}

//===================================================
//	I2c写入一个字节
//===================================================
void I2cWriteVByte(BYTE nData)
{
	char i;

	for(i = 0;i < 8;i ++)
	{
		if(nData & 0x01)
		{
			P_SDA = 1;
		}
		else
		{
			P_SDA = 0;
		}
		I2cDelay();

		nData >>= 1;

		P_SCL = 1;
		I2cDelay();
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}

	I2cDelay();

}
//===================================================
//	I2c读取一个字节
//===================================================
BYTE I2cReadByte()
{
	BYTE nData = 0;
	char i;
	
	for(i = 0;i < 8;i ++)
	{
		nData <<= 1;
		I2cDelay();	
		
		P_SCL = 1;
		I2cDelay();

		if(P_SDA)
		{
			nData |= 1;	
		}
		else
		{
			nData &= 0xfe;	
		}
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}

	I2cDelay();

	return nData;
}

//===================================================
//	I2c读取一个字节
//===================================================
BYTE I2cReadVByte()
{
	BYTE nData = 0;
	char i;
	
	for(i = 0;i < 8;i ++)
	{
		nData >>= 1;
		I2cDelay();	
		
		P_SCL = 1;
		I2cDelay();

		if(P_SDA)
		{
			nData |= 0x80;	
		}

		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}

	I2cDelay();

	return nData;
}

//===================================================
//	写I2C设备
//===================================================
int I2cWrite(BYTE DEV,BYTE ADDR,BYTE DATA)
{
	BYTE iAck = 0;

	I2cStart();

	I2cWriteByte(DEV);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x101;
	
	I2cWriteByte(ADDR);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x102;

	I2cWriteByte(DATA);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x103;

	I2cStop();

	return DATA;
}

//===================================================
//	读I2C设备
//===================================================
int I2cRead(BYTE DEV,BYTE ADDR)
{
	BYTE nData = 0;
	BYTE iAck = 0;
		
	I2cStart();

	I2cWriteByte(DEV);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x201;

	I2cWriteByte(ADDR);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x202;

	I2cStart();
	I2cWriteByte(DEV | 1);
	iAck = I2cGetAck();
	if(!iAck)
		return 0x203;
 	
	nData = I2cReadVByte();
	I2cSetAck(); 
	I2cStop();

	return nData;
}

//===================================================
//	喇叭
//===================================================
void Beep(BYTE feq,BYTE delay)
{
	BYTE i,j;
	for(i = 0 ; i < feq; i++)
	{
		P_SPK = !P_SPK;
		for(j = 0; j < delay; j++)
			;
	}
}
//===================================================
//	起始函数
//===================================================
void main()
{
	BYTE dipaly[6];
	BYTE i = 0;
	
	//	纠错数据
	BYTE nData = 0x77;

	//	读写数据
	int bRead  = 0;
	int bWrite = 0;

	//	是否正确
	bit bOK = 0;

	WORD fmData = 0xc370;
	int iDelay = 1000;
	
	P_SDA = 1;
	P_SCL = 1;

	EA = 0;

	do{

		//	Zi2020写入0x0371
		bWrite  = I2cWrite(0x6c,0x00,0x71);
		bWrite  = I2cWrite(0x6c,0x01,0xc3);
		bWrite  = I2cWrite(0x6c,0x02,0x00);
		bWrite  = I2cWrite(0x6c,0x13,0x80);

//		bRead   = I2cRead(0x6c, 0x00);

	#if 1
		dipaly[5] = (bWrite & 0x0f00) >> 8;
		dipaly[4] = (bWrite & 0x00f0) >> 4;
		dipaly[3] = (bWrite & 0x000f) >> 0;
	#else
		dipaly[5] = (bWrite / 100) % 10;
		dipaly[4] = (bWrite / 10) % 10;
		dipaly[3] = (bWrite / 1) % 10;
	#endif

		dipaly[2] = (bRead & 0x0f00) >> 8;
		dipaly[1] = (bRead & 0x00f0) >> 4;
		dipaly[0] = (bRead & 0x000f) >> 0;

		for(i = 0; i < 6; i++)
		{
			P0 = (i << 4) | dipaly[i];
			I2cDelay();
			I2cDelay();
			I2cDelay();
		}
		
		//	擦除LED
		P0 = 0x60;

	}while(1);

	return ;
}

⌨️ 快捷键说明

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