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

📄 gongkong.c

📁 avr控制继电器的程序 可以在2ms内快速控制
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -