qin552011373 发表于 2013-11-14 15:04 
建议自己先写,有问题再来问
我自己写的程序大家帮我看看,我用uart读出的数据不对,大家看看程序那里有问题,使用gcc编译的,谢谢
#define BAUD 9600
#include<avr/io.h>
#include<util/delay.h>
#include<util/setbaud.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include <avr/signal.h>
#include<avr/interrupt.h>
#define SETB_PB(x) PORTB|=(1<<(x))
#define CLR_PB(x) PORTB&=~(1<<(x))
unsigned data_temp=0;
void Time0_OCR0Init()
{
PORTB|=(1<<PB3);
DDRB|=(1<<PB3);
TCCR0|=(1<<WGM01)|(1<<CS00)|(1<<CS01)|(1<<COM00);//普通模式 64预分频ctc
TIMSK|=(1<<OCIE0);
OCR0=0x55;
TCNT0=0X00;
}
void ADC_Init()
{
ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX0); //片内AVCC参考电压,单输入ADC0
//ADMUX=0x00;
ADCSRA= 0x00;
//ADMUX =(1<<REFS0);
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADATE );//中断使能,使能ADC 64分频
SFIOR|=(1<<ADTS1)|(1<<ADTS0);//定时器、计数器比较匹配时触发源
}
unsigned ADC_Read()
{
return(ADCL+(int)(ADCH<<8));
}
void Usart_Init(unsigned int baud) //USART串口初始化
{
UBRRH=UBRRH_VALUE;
UBRRL=UBRRL_VALUE; /*设置波特率*/
UCSRB=(1<<RXEN)|(1<<TXEN);
//UCSRC=(1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<UCSZ0)|(1<<UCSZ1);//(1<<UMSEL) 一位停止位;奇校验;8位;下降沿采样,上升沿改变数据;异步模
UCSRC = ((1<<URSEL)|(3<<UCSZ0));
}
void Usart_Send(unsigned char data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
void Usart_SendString(unsigned char *pcString)
{
while (*pcString)
{
Usart_Send(*pcString++);
}
}
SIGNAL(SIG_ADC) //AD转换器结束产生中断USART发送数据
{
// unsigned char tab[10]={0x00,0x01,0x02,0x03,
// 0x04,0x05,0x06,0x07,
// 0x08,0x09};
unsigned char i,j,m,n;
ADCSRA |= (1 << ADIF);
data_temp=ADC_Read();
data_temp=(data_temp*2.56/1024*10); //十进制输出
i= data_temp/1000+0x30;
j=data_temp%1000/100+0x30;
m=data_temp%100/10+0x30;
n=data_temp%10+0x30;
Usart_Send(i);
Usart_Send(j);
Usart_Send(m);
Usart_Send(n);
Usart_Send(' ');
// HD7279_DisplayDigital(7,tab,0);
// HD7279_DisplayDigital(6,tab[j],0);
// HD7279_DisplayDigital(5,tab[m],1);
// HD7279_DisplayDigital(4,tab[n],0);
_delay_ms(25);
}
int main()
{
DDRA=0x00;
SREG&=~0X80;
Time0_OCR0Init();
ADC_Init();
Usart_Init(BAUD);
SREG|=0X80;
ADCSRA |= (1 << ADSC);
while(1)
{
ADCSRA |= (1 << ADSC); //开始AD转换
}
}
|