📄 doo1.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 + -