avr128 串口1的程序,晶振16M,主要功能是ADC采集的电压值变化就用串口将其输出,串口助手收不到预期结果#define F_CPU 16000000UL#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char SendBuff[10];
uint PRE_ADC_ResultX = 0,PRE_ADC_ResultY = 0;
void Init_USART1(void)
{
UCSR1B = 0X00;
UCSR1A = 0x00;
UCSR1C = 0X06;//8位数据位,1位停止位
UBRR1L = 103 % 256;//波特率:9600
UBRR1H = 103 / 256;
//UBRR = 103 对应波特率为9600
UCSR1B = _BV(RXEN1) | _BV(TXEN1);//允许接收和发送
//{ | _BV(RXCIE0);}//{允许接收中断}
DDRD |= 0X80;
}
void putchar1(uchar c)
{
if(c == '
') putchar1('
');
while(!(UCSR1A & 0X20));
UDR1 = c;
}
void ADC_Init(void)
{
DDRF = 0X00;PORTF = 0X00;//配置AD转换端口
ADCSRA = 0XE6;
//ADC转换置位,启动转换,连续转化模式,关闭中断,128分频
}
uint ADC_Convert(uint CH)
{
uint Result;
ADMUX = CH;// ADC通道选择
//读取转换结果,并转换为电压
Result = (uint)(ADC*500.0/1023.0);//读取转换结果
SendBuff[CH*3+0] = Result / 100 + '0';
SendBuff[CH*3+1] = Result % 100 / 10 + '0';
SendBuff[CH*3+2] = Result % 100 % 10 + '0';
return Result;
}
void KEYSCAN()
{
uint x,y;
char *Show_x = "X轴坐标:
";
char *Show_y = "Y轴坐标:
";
x = ADC_Convert(0);
_delay_ms(100);
y = ADC_Convert(1);
_delay_ms(100);
if(x != PRE_ADC_ResultX || y != PRE_ADC_ResultY)//如果模数转换结果发生变化
{
unsigned char i = 0,j=0;
PRE_ADC_ResultX = x;
PRE_ADC_ResultY = y;
while(Show_x
!= ' ')
putchar1(Show_x[i++]);
for(i = 0;i < 3;i++)
putchar1(SendBuff);
putchar1('
');
while(Show_y[j] != ' ')
putchar1(Show_y[j++]);
for(j = 3;j < 6;j++)
putchar1(SendBuff[j]);
putchar1('
');
}
}
int main()
{
char *s = "AVR128 MCU TEST:
";
uchar t = 0;
Init_USART1();
ADC_Init();
while(s[t] != ' ')
putchar1(s[t++]);
while(1)
{
KEYSCAN();
}
}
熔丝位设置如图,求大神帮忙看看,万分感激
此帖出自小平头技术问答
一周热门 更多>