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

📄 doo1.c

📁 433M收发,内有PCB(用99打开),源程序ICC打开,用了IC发送和三极管两种,接收用RX3310
💻 C
字号:
#include <iot13v.h>
#include <macros.h>
#include "delay.h"
#include "eeprom.h"
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define xtal 9.8

int mark=1500;	

unsigned int ai,aa;
unsigned char crc,i,j,flag=0,flagh=0,flagl,acount=0,bcount=0,powbit=0;
unsigned char DECODER_CODE1,DECODER_CODE0; 
unsigned char data[3];	
unsigned char dataf[3];


//PB3是控制输出端口!
#define	POWER_ON		PORTB |= (1 << PB2)	//打开输出
#define	POWER_OFF		PORTB &= ~(1 << PB2)	//关闭输出	
#define	LED_ON			PORTB |= (1 << PB0)	//打开输出
#define	LED_OFF			PORTB &= ~(1 << PB0)	//关闭输出
#define	RF_ON			PORTB |= (1 << PB1)	//打开输出
#define	RF_OFF			PORTB &= ~(1 << PB1)	//关闭输出

//端口初始化
void port_init(void)
{
	PORTB = 0x38;	//输入设置有上拉电阻,输出预设低电平
	DDRB  = 0x07;	//PB4输入,PB3输出
} 
//转换初始化
void adc_init(void)
{
	ADCSRA=0x00;	//vcc作为模拟参考电压

	ADCMUX = 0x03;	//选择ADC2通道
	ACSR = (1 << ACD);//禁用模拟比较器

	//使能ADC,终端允许,自由模式,时钟CLK/8
	//0x86允许转换ADEN,ADSC,时钟128分频 75KHz@9.6MHz system clock
	ADCSRA = (1 << ADEN) | 0x07;//| ( 1 << ADATE )
	
}
//看门狗初始化
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR=(1<<WDCE)|(1<<WDE);
 WDTCR=(0<<WDE);
}

//从AD口读入一个值
unsigned int GetADC(void)
{

unsigned int	adc_value;

	ADC = 0;
	ADCSRA  |=  (1 << ADSC);	//启动AD转换

	del(10);
	while(!(ADCSRA&(BIT(ADIF))));////ADIF=4, 表示若ADCSR的第5位置为1,则中断AD转换
	//loop_until_bit_is_set(ADCSRA, ADIF);//等待AD转换结束

	ADCSRA |= (1 << ADIF);		//写1清除标志位

	adc_value = ADC;		//读转换结果

	return adc_value;
}


/****************************************** 
CRC3校验函数  
输  入:        ptr需要进行校验的数据包  
        len需要校验的数据包字节数  
输  出:        校验码; 
调  用:        无; 
被调用:        从机协议打包函数; 
功  能:        将一给定的数据包进行CRC3校验给调用者返回校验码  
******************************************/ 
unsigned char CRC3(unsigned char *data, unsigned char len) 
{ 
    unsigned char i; 
    unsigned char j; 
    j = 0; 
	crc=0;

    while(len) 
    { 
        /*多项式除法*/ 
        if(*data & (0x80>>j))  //如果该位为1 
            crc |= 0x01;  //则在余数尾部添1否则添0 
        if(crc >= 0x8) 
            crc ^= 11; 
        crc <<= 1; 
        j++;
		if(len==1)
		{
		  if(j == 7) 
         { 
            j = 0; 
            data++; 
            len--; 
         }
		}
		else
		{ 
         if(j == 8) 
         { 
            j = 0; 
            data++; 
            len--; 
         }
		}
	}
    return(crc); 	 
}


//地址计算
void addr_f(void)
{
    unsigned char i; 
    unsigned char j;
data[0]=EEPROM_read(0);
data[1]=EEPROM_read(1);		  //EEPORM内地址,最大FFFF
data[2]=0;
if(GetADC()<327)  data[2]|=0x80;
if(powbit) data[2]|=0x40;	   
data[2]+=CRC3(data,3);
}
//要发送的数据1
void data_1(void)
{
 RF_OFF;
 del(700);
 RF_ON;
 del(350);
}
//要发送的数据0
void data_0(void)
{
 RF_OFF;
 del(350);
 RF_ON;
 del(700);
} 
//发送数据 
void rf (unsigned char *dataf)
{
    unsigned char i; 
    unsigned char j;
 RF_ON;			//起始位
 del(350);
 for(i=0;i<3;i++)
 {		 for(j=0;j<8;j++)
 		 {
         if(*dataf& (0x80>>j))  //如果该位为1 
            data_1();
            else data_0();
		} 
		dataf++; 
 }
 RF_OFF;
}
//主函数!不用解释了
void main()
{

   unsigned char i;
	//以下初始化硬件
	port_init();	//端口初始化  
	adc_init();	//ADC初始化
	watchdog_init();//初始化看门狗	
	POWER_ON;
	if(!(PINB&0X10)) powbit=1;	
	delay(1);

	while(1)
	{
	WDR();	
    LED_ON;
	delay(100);
	addr_f();
	for(i=0;i<50;i++)
	{
	dataf[0]=data[0]; 
	dataf[1]=data[1];
	dataf[2]=data[2];
	rf(dataf);  
	delay(3);
	} 
	POWER_OFF;
	delay(100);
	LED_OFF; 
     }
}

⌨️ 快捷键说明

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