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

📄 485copy08311122.c

📁 458通讯
💻 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 + -