📄 gongkong.c
字号:
out[0]=0x00;
out[1]=0x00;
f_len=0x02;
tmp1=0;
put_c(0xA5);
put_c(0x5A);
put_c(f_len+5); //长度
put_c(0xF1); //F1指令标识
put_c(rx_buffer[2]); // 数据帧序号
for(i=0;i<f_len;i++)
{
put_c(out[i]);
tmp1=tmp1+out[i];
}
put_c((f_len+5+0xF1+rx_buffer[2]+tmp1)%256);
put_c(0xAA);
}
else
{
eeprom_busy_wait();
eeprom_read_block (&out[0],&eep_f1[rx_buffer[2]-1][0], f_len); //块读出
tmp1=0;
put_c(0xA5);
put_c(0x5A);
put_c(f_len+5); //长度
put_c(0xF1); //F1指令标识
put_c(rx_buffer[2]); // 数据帧序号
for(i=0;i<f_len;i++)
{
put_c(out[i]);
tmp1=tmp1+out[i];
}
put_c((f_len+5+0xF1+rx_buffer[2]+tmp1)%256);
put_c(0xAA);
}
}
//--------------------------------------------------------------
void read_delay1(void)
{
unsigned char out[3];
eeprom_busy_wait();
eeprom_read_block (&out[0],&eep_delay1[0], 2); //块读出
put_c(0xA5);
put_c(0x5A);
put_c(0x06);
put_c(0xF2);
put_c(out[0]);
put_c(out[1]);
put_c((0x06+0xF2+out[0]+out[1])%256);
put_c(0xAA);
}
//--------------------------------------------------------------
void read_delay2(void)
{
unsigned char out[3];
eeprom_busy_wait();
eeprom_read_block (&out[0],&eep_delay2[0], 2); //块读出
put_c(0xA5);
put_c(0x5A);
put_c(0x06);
put_c(0xF3);
put_c(out[0]);
put_c(out[1]);
put_c((0x06+0xF3+out[0]+out[1])%256);
put_c(0xAA);
}
//--------------------------------------------------------------
void read_baud(void)
{
unsigned char out[5];
eeprom_busy_wait();
eeprom_read_block (&out[0],&eep_baud[0], 4); //块读出
put_c(0xA5);
put_c(0x5A);
put_c(0x08);
put_c(0xF4);
put_c(out[0]);
put_c(out[1]);
put_c(out[2]);
put_c(out[3]);
put_c((0x08+0xF4+out[0]+out[1]+out[2]+out[3])%256);
put_c(0xAA);
}
void read_door(void)
{
}
//--------------------------------------------------------------
void load_f1(unsigned char No) //加载设备通信数据帧到内存f1[]数组里,f[0]为长度。(本函数由按键扫描程序调用一次)
{
unsigned char d_len;
eeprom_busy_wait();
d_len=eeprom_read_byte (&eep_f1[No-1][0]); //读出长度
if(d_len>=30) f1[No-1][0]=0xff;
else
{
eeprom_busy_wait();
eeprom_read_block (&f1[No-1][0],&eep_f1[No-1][0], d_len); //块读出
}
}
//----------------------------------------------------------------------------
void load_delay1(void) //开机和有新数据设置后调用一次
{
eeprom_busy_wait();
eeprom_read_block (&a_delay1[0],&eep_delay1[0], 2); //块读出
delay1=a_delay1[0]*256+a_delay1[1];
}
//----------------------------------------------------------------------------
void load_delay2(void) //开机和有新数据设置后调用一次
{
eeprom_busy_wait();
eeprom_read_block (&a_delay2[0],&eep_delay2[0], 2); //块读出
delay2=a_delay2[0]*256+a_delay2[1];
}
//----------------------------------------------------------------------------
void load_baud(void) //开机和有新数据设置后调用一次
{
eeprom_busy_wait();
eeprom_read_block (&a_baud[0],&eep_baud[0], 4); //块读出
// baud=a_baud[0]*16777216+a_baud[1]*65536+a_baud[2]*256+a_baud[3];
baud=0;
baud=a_baud[0]*256;
baud=(baud + a_baud[1])*256;
baud=(baud + a_baud[2])*256;
baud=baud + a_baud[3];
if (baud==0) baud=9600;
}
//----------------------------------------------------------------------------
load_door()
{
}
//=====================================================
void send_f1(unsigned char No) //发送内存f1[]数组里的数据帧给设备。(本函数由按键扫描程序调用一次)
{
unsigned char i;
unsigned char d_len;
d_len=f1[No-1][0];
if (d_len!=0xFF)
{
cli();
PORTC|=(1<<4); //电脑串口关闭
PORTC&=~(1<<5); //设备串口打开
init_USART(baud);
for(i=1;i<d_len;i++)
{
while( !(UCSRA & (1<<UDRE)) );
UDR=f1[No-1][i];
}
_delay_ms(16);
init_USART(9600);
sei();
}
}
//---------------------------------------------------------------
void key(void)
{
unsigned char k,kk;
k=PINB;
kk=PIND>>6;
/* if(k==0x3E&delay1!=65535&delay1>2) {LED1_OFF();TAD=0;_delay_ms(500);TAU=delay1;LED0_ON();}
if(k==0x3D&delay1!=65535&delay1>2) {LED0_OFF();TAU=0;_delay_ms(500);TAD=delay1;LED1_ON();}
if(k==0x3B) {send_f1(4);_delay_ms(400);}
if(k==0x37) {send_f1(3);_delay_ms(400);}
if(k==0x2F) {send_f1(3);_delay_ms(400);}
if(k==0x1F) {send_f1(4);_delay_ms(400);}
if(kk==0x02&delay2!=65535&delay2>2) {LED3_OFF();TBD=0;_delay_ms(500);TBU=delay2;LED2_ON();}
if(kk==0x01&delay2!=65535&delay2>2) {LED2_OFF();TBU=0;_delay_ms(500);TBD=delay2;LED3_ON();}
*/
if(k==0x3E&delay1!=65535&delay1>2)
{
LED1_OFF();
TAD=0;
_delay_ms(500);
TAU=delay1;
LED0_ON();
send_f1(1);
_delay_ms(400);
}
if(k==0x3B&delay1!=65535&delay1>2)
{
LED0_OFF();
TAU=0;
_delay_ms(500);
TAD=delay1;
LED1_ON();
send_f1(2);
_delay_ms(400);
}
if(k==0x2F) {send_f1(1);_delay_ms(400);}
if(kk==0x02){send_f1(2);_delay_ms(400);}
}
//===============================================================================
void SPI_MASTERINIT(void)
{
DDRB=(1<<MOSI)|(1<<MISO);
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MASTERTRANSMIT(char CData)
{
SPDR=CData;
put_c(0x62);
while(!(SPSR&(1<<SPIF)))
{};
put_c(0x63);
}
void SPI_SLAVEINIT(void)
{
DDRB=(1<<MISO);
SPCR= (1<<SPE);
}
char SPISLAVERECEIVE(void)
{
while(!(SPSR&(1<<SPIF)))
return SPDR;
}
//=============================
int main(void)
{
DDRB =0x00;
PORTB =0x3F;
DDRC =0x3F;
PORTC =0x3f;
DDRD =0xC2;
PORTD =0xFF;
load_f1(1); //加载设备数据帧到内存f[]数组
load_f1(2);
load_f1(3);
load_f1(4);
load_delay1(); //加载延时设定1到delay1变量
load_delay2(); //加载延时设定2到delay2变量
load_baud(); //加载波特率设定到baud变量
init_USART(MCU_baud);
//PORTC&=~(1<<4); //电脑串口打开
//PORTC|=(1<<5); //设备串口关闭
// PORTC|=(1<<4); //电脑串口关闭
PORTC&=~(1<<5);
intt();
sei();
POWER_UP_RESET_CC1100();
SPI_MASTERINIT();
while(1)
{
CSN_L;
_delay_ms(50);
if(SPISLAVERECEIVE()!=0x00)
put_c(SPISLAVERECEIVE());
}
while(1)
{
put_c(0x60);
_delay_ms(40000);
//-------------监测处理电脑指令---------------
if(bit_is_set(bit_uart,b_rx_over))
{
cbi(bit_uart,b_rx_over);
Decom();
}
//--------------------------------------------
if(0x3F!=PINB|(0x03!=(PIND>>6))) key();
}
}
//-------------------------------------------------------------------
ISR(USART_RXC_vect)
{
unsigned char data;
data=UDR;
SPI_MASTERTRANSMIT(data);
put_c(0x61);
}
RESET_CC1100()
{
CSN_L;
while (MISO_H);
SPI_MASTERTRANSMIT(0x30);
while (MISO_H);
CSN_H;
}
void POWER_UP_RESET_CC1100(void)
{
CSN_H;
SCLK_H,MOSI_L;
delay_ns(1);
CSN_L;
delay_ns(1);
CSN_H;
delay_ns(80);
SCLK_L;
RESET_CC1100();
}
void delay_ns(unsigned char n)
{
while (n--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -