?? 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 + -