📄 uart.c.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 + -