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

📄 gongkong.c

📁 avr控制继电器的程序 可以在2ms内快速控制
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <stdint.h>
#include <avr/sfr_defs.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <compat/deprecated.h>

//管脚定义
#define LED0			0 	//PB0
#define LED1			1 	//PB1
#define LED2			2 	//PB2
#define LED3			3 	//PB2
#define MOSI            3
#define MISO            4
#define SLK             5
#define CSN             2   //PD2

#define CSN_L  PORTD&=~(1<<CSN)
#define CSN_H  PORTD|=(1<<CSN)

#define MISO_L (!(MISO_H))
#define MISO_H (PINC &= (1<<MISO))   

#define GDO0 5               
#define GDO2 1                        

#define SCLK_L PORTB &= ~(1<<SLK)   
#define SCLK_H PORTB |=  (1<<SLK)          

#define MOSI_L PORTD &= ~(1<<MOSI)            
#define MOSI_H PORTD |=  (1<<MOSI)   

#define MISO_L (!(MISO_H))                
#define MISO_H (PINC &= (1<<MISO))      

#define GDO0_L (!(GDO0_H))                 
#define GDO0_H (PINC &= (1<<GDO0))           

#define GDO2_L (!(GDO2_H))                   
#define GDO2_H (PINC &= (1<<GDO2))














#define LED0_ON()		PORTC&=~(1<<LED0)   //输出低电平,继电器吸合。
#define LED0_OFF()		PORTC|=(1<<LED0)	//输出高电平,继电器断开。
#define LED1_ON()		PORTC&=~(1<<LED1)
#define LED1_OFF()		PORTC|=(1<<LED1)
#define LED2_ON()		PORTC&=~(1<<LED2)
#define LED2_OFF()		PORTC|=(1<<LED2)
#define LED3_ON()		PORTC&=~(1<<LED3)
#define LED3_OFF()		PORTC|=(1<<LED3)
#define MCU_baud        9600


#define RX_BUFFER_SIZE 100
volatile unsigned char rx_buffer[RX_BUFFER_SIZE];
volatile unsigned char rx_wr_index;
volatile unsigned char bit_uart;
#define b_uart_head    0   //接收uart数据的头标志
#define b_rx_ing       1   //已经收到A55A帧头,正在收数据域标志
#define b_rx_over      2   //收到一帧结束标志

//--------EEPROM数组----------
volatile unsigned char eep_f1[8][30] __attribute__((section(".eeprom")));
volatile unsigned char eep_delay1[2] __attribute__((section(".eeprom")));
volatile unsigned char eep_delay2[2] __attribute__((section(".eeprom")));
volatile unsigned char eep_baud[4] __attribute__((section(".eeprom")));
volatile unsigned char eep_door __attribute__((section(".eeprom")));


volatile unsigned char f1[8][30];   //数组形式的设置数据
volatile unsigned char a_delay1[2];
volatile unsigned char a_delay2[2];
volatile unsigned char a_baud[2];
volatile unsigned char a_door;

volatile unsigned int delay1; //整数形式的设置数据
volatile unsigned int delay2;
volatile unsigned long baud;
volatile unsigned int TAU=0,TAD=0,TBU=0,TBD=0;
unsigned long speed;
//-------------------------------------------------------------------
void put_c(unsigned char c) //发送数据给电脑上位机
{
PORTC&=~(1<<4);//电脑串口打开
//PORTC&=~(1<<5);//设备串口打开
PORTC|=(1<<5);//设备串口打开
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}
//-------------------------------------------------------------------
/*
ISR(USART_RXC_vect)
{
  unsigned char data;
  data=UDR;
  if((data==0xa5) && (bit_is_clear(bit_uart,b_rx_ing)))
  { sbi(bit_uart,b_uart_head);
    rx_buffer[rx_wr_index++]=data;
  }
  else if((data==0x5a) && (bit_is_clear(bit_uart,b_rx_ing)))
       { if(bit_is_set(bit_uart,b_uart_head))
	     { rx_wr_index=0;
		   sbi(bit_uart,b_rx_ing);
		   cbi(bit_uart,b_rx_over);
         }
         else
		  rx_buffer[rx_wr_index++]=data;
         cbi(bit_uart,b_uart_head);
       }
	   else
	   { rx_buffer[rx_wr_index++]=data;
		 cbi(bit_uart,b_uart_head);
		 if(rx_wr_index==rx_buffer[0])
	     { 
		    cbi(bit_uart,b_rx_ing);
		    sbi(bit_uart,b_rx_over);
		    //close_uart_rx();
          }
	   }
  if(rx_wr_index==RX_BUFFER_SIZE)
   rx_wr_index--;	
}
*/
//-------------------------------------------------------------------
ISR(TIMER1_OVF_vect)
{
if (TAU!=0|TAD!=0|TBU!=0|TBD!=0)
  {
    if (TAU==1|TAD==1|TBU==1|TBD==1) TTT2();
    if (TAU>1|TAD>1|TBU>1|TBD>1) TTT1();
   }
TCNT1H=0xd5;
TCNT1L=0xcf; 
}
void TTT1(void)
{
if (TAU>0) TAU=TAU--;
if (TAD>0) TAD=TAD--;
if (TBU>0) TBU=TBU--;
if (TBD>0) TBD=TBD--;
}
void TTT2(void)
{
if (TAU==1) {TAU=0;LED0_OFF();}
if (TAD==1) {TAD=0;LED1_OFF();}
if (TBU==1) {TBU=0;LED2_OFF();}
if (TBD==1) {TBD=0;LED3_OFF();}
}
//-------------------------------------------------------------------
void init_USART(unsigned long SSP)//USART 初始化
{
   unsigned long BAUDRATE;
   BAUDRATE=SSP;
   UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
   UBRRL= (F_CPU/BAUDRATE/16-1)%256;
   UBRRH= (F_CPU/BAUDRATE/16-1)/256;
   UCSRB=(1<<TXEN)|(1<<RXCIE)|(1<<RXEN);
   UCSRA = 0x00;

  cbi(bit_uart,b_uart_head);
  cbi(bit_uart,b_rx_ing);
  cbi(bit_uart,b_rx_over);
  rx_wr_index=0;
}
//-------------------------------------------------------------------
void intt(void)
{
TCCR1B=0x05;
TCNT1H=0xd5;
TCNT1L=0xcf; 
TIMSK=1<<TOIE1;
SREG=1<<7;
}
//-------------------------------------------------------------------
//效验数据
unsigned char uart_check(void)
{ 
  unsigned char i;
  unsigned int checksum=0; 
  for(i=0;i<rx_buffer[0]-2;i++)
   checksum+=rx_buffer[i];
  if(((checksum%256)==rx_buffer[rx_buffer[0]-2]) && (rx_buffer[rx_buffer[0]-1]==0xAA))
   return(0x01);
  else
   return(0x00);
} 
//-------------------------------------------------------------------
//设置信息反馈
void  return_info(unsigned char bs)
{ 
    put_c(0xa5);
    put_c(0x5a);
	put_c(0x05);
	put_c(0xfa);
	put_c(bs);
	put_c((255+bs)%256);
	put_c(0xaa);
} 
//-------------------------------------------------------------------
void Decom(void)
{ 
  if(uart_check())
  {
    switch(rx_buffer[1])
    { 
	  case 0xf1:save_f1();   //保存设置的数据帧
	            return_info(rx_buffer[1]);  //返回OK
	            break;
      case 0xf2:save_delay1();  //保存设置的继电器延时值
	            load_delay1();  //加载延时设定1到delay1变量
	            return_info(rx_buffer[1]);  //返回OK
	            break;
	  case 0xf3:save_delay2();
	            load_delay2();  //加载延时设定2到delay2变量
	            return_info(rx_buffer[1]);  //返回OK
	            break;
      case 0xf4:set_baud();  //设置波特率
	            return_info(rx_buffer[1]);  //返回OK
				load_baud();  //加载波特率设定到baud变量
	            break;
      case 0xf5:set_door();  //设置波特率
	            return_info(rx_buffer[1]);  //返回OK
				load_door();  //加载波特率设定到baud变量
	            break;
//-----------------------------
	  case 0xa1:read_f1();  //读出当前设置的数据帧
	            break;
      case 0xa2:read_delay1();  //读出当前设置的继电器延时
	            break;
	  case 0xa3:read_delay2();
	            break;
      case 0xa4:read_baud();  //读出当前设置的波特率
	            break;
      case 0xa5:read_door();  //读出当前设置的波特率
	            break;
	  default:break;			 
	}
	//return_info(rx_buffer[1]);  //返回OK
  }
}
//-----------------------------------------------------------------------
void save_f1(void)
{
  cli();
  eeprom_busy_wait();
  eeprom_write_block (&rx_buffer[3], &eep_f1[rx_buffer[2]-1][0], rx_buffer[3]);		//块写入
  load_f1(rx_buffer[2]);
  sei();
}
//--------------------------------------------------------------
void save_delay1(void)
{
  cli();
  eeprom_busy_wait();
  eeprom_write_block (&rx_buffer[2], &eep_delay1[0], 2);		//块写入
//load_delay1();  //加载延时设定1到delay1变量
  sei();
}
//--------------------------------------------------------------
void save_delay2(void)
{
  cli();
  eeprom_busy_wait();
  eeprom_write_block (&rx_buffer[2], &eep_delay2[0], 2);		//块写入
//load_delay2(); //加载延时设定2到delay2变量
  sei();
}
//--------------------------------------------------------------
void set_baud(void)
{
  cli();
  eeprom_busy_wait();
  eeprom_write_block (&rx_buffer[2], &eep_baud[0], 4);		//块写入
  sei();
}
void set_door(void)
{
  cli();
  eeprom_busy_wait();
  eeprom_write_block (&rx_buffer[2], eep_door, 1);		//块写入
  sei();
}
//--------------------------------------------------------------
void read_f1(void)
{
unsigned char i;
unsigned char f_len;
unsigned char out[30];
unsigned char tmp1;
    eeprom_busy_wait();
	f_len=eeprom_read_byte (&eep_f1[rx_buffer[2]-1][0]);		//读出长度
 if (f_len==0xFF)
 {

⌨️ 快捷键说明

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