📄 gongkong.c
字号:
#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 + -