📄 485copy08311122.c
字号:
//---------------------------------------------------------------------
//硬件连接:
// mega8 max485
// PD0 RX
// PD1 TX
// PD4 TE
//---------------------------------------------------------------------
void write(unsigned char *);
void comInit(void);
//---------------------------------------------------------------------
#include <avr/io.h>
//#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <string.h>
//#define osccal 0x7d
//#define Vref 500
#define BM(n) (1 << (n))
//#define OPEN_DAC PORTC&=0b11111101
//#define CLOSE_DAC PORTC|=0b00000010
//#define send_dac_data(x) do {PORTB|=(x&0b00000011);PORTD|=(x&0b11111100);} while(0)
/****** com 处理定义start********/
#define ENABLE_UART0_TX_INT() do { UCSRB |= BM(UDRIE); } while (0)
#define DISABLE_UART0_TX_INT() do { UCSRB &= ~BM(UDRIE); } while (0)
#define CLEAR_UART0_TX_INT() do { UCSRA &= ~BM(UDRE); } while (0)
#define SET_UART0_TX_INT() do { UCSRA |= BM(UDRE); } while (0)
#define UART1_RXD 0 // PD.0 - Input: UART1 RXD
#define UART1_TXD 1 // PD.1 - Output: UART1 TXD
#define UART0_SEND(x) do { UDR = (x); } while (0)
#define UART0_WAIT() do { while (!(UCSRA & BM(UDRE))); CLEAR_UART0_TX_INT(); } while (0)
#define UART0_WAIT_AND_SEND(x) do { UART0_WAIT(); UART0_SEND(x); } while (0)
//unsigned char adc_newflag=0;
//unsigned char adc_mux;
unsigned char pos;
unsigned char U_data=0,old_udata=0;
union
{
unsigned char val[64];
struct
{
unsigned char cmd;
unsigned char end;
};
}buffer;
//---------------------------我的循环队列-------------------
#define ERROR 0
#define OK 1
//----循环队列------
#define MAXQSIZE 100
unsigned int Uart_buf[MAXQSIZE]; //缓冲区
unsigned char front; //头
unsigned char rear; //尾
//--------循环对列的基本操作---------
void InitQueue(void) //初始化循环队列
{
front = rear = 0;
}
unsigned char QueueLenth(void) //当前队列中元素的个数
{
return (rear - front + MAXQSIZE) % MAXQSIZE;
}
unsigned char WrQueue(unsigned int e) //向队列中写入元素e
{
if((rear + 1) % MAXQSIZE == front) //队列满
return ERROR;
Uart_buf[rear] = e;
rear = (rear + 1) % MAXQSIZE;
return OK;
}
unsigned char ReQueue(unsigned int *e)
{
if(front == rear)
return ERROR;
*e = Uart_buf[front];
front = (front + 1) % MAXQSIZE;
return OK;
}
///------------------------------------------
void delay_us(int time)
{
do
time--;
while(time>1);
}
void delay_ms(unsigned int time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
/*
void adc_init(void) //adc初始化
{
DDRC=0x00;
PORTC=0X00;
ADCSRA=0X00;
ADMUX=(1<<REFS0)|(adc_mux&0x0f)|(1<<ADLAR); //选择参考电压,选择通道,选择是否左对齐
ADCSRA=(1<<ADEN)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//使能ADC,选择连续转换模式,中断允许,128分频
ADCSRA|=(1<<ADSC); //连续模式,启动第一次转换
}
*/
/*
void Dacinit(void)
{
DDRC|=(1<<1);
DDRB|=(1<<0)|(1<<1);
DDRD|=(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
}
*/
/*
ISR(SIG_ADC)
{
unsigned int adc_rel;
// adc_rel=ADCH;
// UART0_WAIT_AND_SEND(ADCH);
WrQueue(adc_rel);
//ADMUX=(1<<REFS0)|(adc_mux&0xf0)|(1<<ADLAR); //选择内部AVCC为基准
//ADCSRA|=(1<<ADSC); //启动AD转换--在单次模式下,启动ADC,在连续模式下,启动第一次
//转换
// adc_newflag++;
}
*/
unsigned int HEX4BCD(unsigned int hex_data)
{
unsigned int bcd_data=0,bu_data=0;
bcd_data|=hex_data%10;
bu_data = hex_data/10;
bcd_data|=bu_data%10<<4;
bu_data = hex_data/100;
bcd_data|=bu_data%10<<8;
bu_data = hex_data/1000;
bcd_data|=bu_data%10<<12;
return bcd_data;
}
int main(void)
{
unsigned int *p,pnum/*old_num=pnum*/;
//unsigned char bbu[10]={'0','1','2','3','4','5','6','7','8','9'};
p=&pnum;
DDRD=0xf0;
PORTD=0xff;
// OSCCAL=osccal; //校正震荡频率
// adc_mux=0;
comInit(); //串口初始化
// adc_init(); //adc初始化
// Dacinit();
InitQueue();
sei();
write("hello");
while(1)
{
// write("hello");
switch(buffer.cmd)
{
case 0x01:
memset(buffer.val,0,64);
pos=0;
break;
case 0x02:
break;
default:
break;
}
// if(ReQueue(p)&&adc_newflag!=0)adc_newflag--;
/*
if(((old_num-pnum>2)&&(old_num-pnum<100))||((pnum-old_num>2)&&(pnum-old_num)<100))
{
UART0_WAIT_AND_SEND((pnum/1000)%10+48);
UART0_WAIT_AND_SEND((pnum/100)%10+48);
UART0_WAIT_AND_SEND((pnum/10)%10+48);
UART0_WAIT_AND_SEND(pnum%10+48);
UART0_WAIT_AND_SEND(' ');
UART0_WAIT_AND_SEND(' ');
old_num=pnum;
}
*/
//dac
if(U_data !=old_udata)
{
// OPEN_DAC;
asm("nop");
asm("nop");
asm("nop");
// send_dac_data(200);
asm("nop");
asm("nop");
asm("nop");
// CLOSE_DAC;
old_udata=U_data;
}
}
}
void comInit(void) //串口初始化
{
UCSRB=0x98;
UBRRL=23;//25;//25; // baud=9600 UBRR=CK/(baud*16) -1 for 脉冲
//DDRC |= 0X06;
}
ISR(SIG_UART_RECV)
{
// buffer.val[pos++]=UDR;
// UART0_WAIT_AND_SEND(UDR);
// if(pos>=64)
// pos=0;
U_data=UDR;
}
void write(unsigned char *str)//写串口函数
{
while (*str != 0)
UART0_WAIT_AND_SEND(*str++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -