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

📄 uart.c.bak

📁 详细介绍M8两版间通讯
💻 BAK
字号:
/*
串口通信模块,使用之前,应该在Main 函数中对串口进行初始化,
串口数据接收方式采用中断进行
*/
#include <iom8v.h>
#include <macros.h>
#define fosc 8000000 //晶振8MHZ
#define baud 19200	 //波特率
extern void adc_init(void);
extern unsigned int adc_rel;//AD转换结果
extern unsigned char adc_mux;//AD通道,默认为0通道
extern unsigned char InterruptFlag;

extern unsigned char ExtendRomAddr,ExtendRomVal;//定义片外EEPROM
extern unsigned char ExtendRomRW;

unsigned int eeprom_addr;
unsigned char eeprom_val;
unsigned char getchar(void) {while(!(UCSRA& (1<<RXC)));return UDR;}
/*字符输出函数*/
void putchar(unsigned char c)
 {
	while (!(UCSRA&(1<<UDRE)));
	UDR=c;
 }

/*字符串输出函数*/
void puts(char *s)
 {
	while (*s)
	 {
		putchar(*s);
		s++;
	 }
	putchar(13);
	putchar(10);
 }

void uart_init(void)
 {
	//OSCCAL=0xA1;//在主程序中设置
	UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
	//允许接收中断、发送和接收
	  UBRRL=(fosc/16/baud-1)%256;
	  UBRRH=((fosc/16/baud-1)/256)&0b01111111;
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	//8位数据+1位STOP位
 }

#pragma interrupt_handler UartGet:12
void UartGet(void)//使用中断方式接收UART的输入字符
 {
	unsigned char charInput,channel='0',i;
	unsigned int val=0,temp=1000;
	static unsigned char LED_state=0;
	charInput=UDR;
	switch (charInput)
	 {
		case 'O'://调节输出电压'O'
		 {
			channel=getchar();
			charInput=getchar();//无用的前导空格字符
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			if (val>0xfff) val=0xfff;
			if (channel=='0') OCR1A=val;
			else if (channel=='1') OCR1B=val;
			break;
		 }
		case 'M'://读取ADC通道及ADC转换结果
		 {
			channel=getchar();
			adc_mux=channel-48;//将ASCII码转换为数字
			TCNT0=0x10;//防止串口接受信息时,Timer0中断即将发生。
			InterruptFlag|=0b00000001;//通知Timer0中断程序,需要发送测试数据
			break;
		 }

		case 'R'://读取片内EEPROM
		 {
			charInput=getchar();//无用的前导空格字符
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			eeprom_addr=val;
			InterruptFlag|=0b00000010;//通知Timer0中断程序,需要发送数据
			break;
		 }

		case 'r'://读取AT2402(或者另外一块模拟AT2402的8Mega2#)EEPROM
		 {
			charInput=getchar();//无用的前导空格字符
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			ExtendRomAddr=val;
			ExtendRomRW|=0b00000010;//通知Main程序,需要发送At2402(或者Mega8 2#)EEPROM数据
			break;
		 }
		 
		case 'W'://写入片内EEPROM
		 {
			charInput=getchar();//无效的空格字符
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			eeprom_addr=val;
			
			charInput=getchar();//无用的前导空格字符			
			val=0;//复位
			temp=1000;//复位
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			eeprom_val=(unsigned char)val;
			InterruptFlag|=0b00000100;//通知Timer0中断程序,需要写入数据
			break;
		 }
		 
		case 'w'://写入AT2402(或者另外一块模拟AT2402的8Mega2#)珽EPROM
		 {
			charInput=getchar();//无效的空格字符
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			ExtendRomAddr=val;
			
			charInput=getchar();//无用的前导空格字符			
			val=0;//复位
			temp=1000;//复位
			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
			 {
				charInput=getchar()-48;
				val+=charInput*temp;
				temp/=10;
			 }
			ExtendRomVal=(unsigned char)val;
			ExtendRomRW|=0b00000100;//通知Main程序,需要写入At2402(或者Mega8 2#)EEPROM数据
			break;
		 }
		 

		default://B口进行IO输出		 {

		 }
	 }
 }

⌨️ 快捷键说明

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