|
本帖最后由 moulin 于 2012-6-18 10:14 编辑
RT,我用的是AD7895-10,但是输出的数字量不对,因为数据手册上写的串行传输时有四个前导0,我的却没有,请问大侠们遇到这种问题怎么查错?
程序如下:
/********************************************************
名称:interrupt+SPI+EEPROM+USART.c
功能:定时1S时间将AD转换后的数据传至上位机
作者:WL
时间:2012.06.13
版本:1.0
********************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom8.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define CLR_BIT(x,y) (x&=~(1 << y)) //P411
#define GET_BIT(x,y) (x&(1 << y)) //P312
uint i;
uchar j;
uchar NUM=0X01;
uchar temp1=0,temp2=0;
uchar ch;
uint EEPADD1=0,EEPADD2=0;
/********************************************************
名称:void port_init(void)
功能:IO口初始化
参数:无
时间:2012.06.13
版本:1.0
********************************************************/
void port_init(void)
{
PORTB=0X04; //SPI的SS为高
DDRB=0X2C; //SCK为输出,MISO为输入,MOSI为输出,SPI的SS引脚为输入0X28
PORTD=0X00; //ADCONVST(PD6)为0,REDE(PD3)为0(接收状态)0X40
DDRD=0X4A; //ADCONVST(PD6)为输出,REDE(PD3)为输出,ADBUSY(PD2)为输入,TXD(PD1)为输出,RXD(PD0)为输入
}
/********************************************************
名称:void SPI_init(void)
功能:SPI初始化
参数:无
时间:2012.06.13
版本:1.0
********************************************************/
void SPI_init(void)
{
SPSR=0X00; //SPI2X(SPI倍速)为0
SPCR=0X52; //SPI使能,MSB首先发送,选择主机模式,空闲时SCK为低电平,在SCK起始沿采样,主机SCK速率为时钟的64分频
}
/********************************************************
名称:void SPI_receive(void)
功能:SPI接收
参数:无
时间:2012.06.13
版本:1.0
********************************************************/
uchar SPI_receive(void)
{
while(!(SPSR&(1<<SPIF))); //等待接收结束
CLR_BIT(SPSR,SPIF);
return SPDR;
}
/********************************************************
名称:void USART_init(void)
功能:串口初始化
参数:无
时间:2012.06.13
版本:1.0
********************************************************/
void USART_init(void)
{
UCSRB=0X00; //禁止UART发送和接收
UCSRA=0X00;
UCSRC=(1<<URSEL)|0X06; //8位数据位
UBRRL=0X33;
UBRRH=0X00;
UCSRB=0X18; //接收使能,启动USART接收器;发送使能,启动USART发送器
}
/********************************************************
名称:void UART_send(uchar data)
功能:串口发送数据
参数:发送的数据
时间:2012.06.13
版本:1.0
********************************************************/
void UART_send(uchar data)
{
while(!(UCSRA&(1<<UDRE))); //等待发送缓冲区为空
UDR=data; //发送一个字符
}
void main(void)
{
port_init();
SPI_init(); //SPI初始化
USART_init(); //USART初始化
while(1)
{
PORTD|=_BV(6); //PD6置高,AD7895的CONVST信号置高
_delay_us(6); //10us的延时
PORTD&=~_BV(6); //PD6拉低,AD7895的CONVST为低启动转换
while((PIND&0X04)!=0);
SPDR=0X00; //对SPI数据寄存器写入数据即启动SPI时钟
temp1=SPI_receive();
SPDR=0X00; //写任意数据,再给AD7895 8个SCLK
temp2=SPI_receive();
PORTD|=0X08;//
_delay_ms(1);//
UART_send(temp1);//
_delay_ms(1);//
UART_send(temp2);//
_delay_ms(1);//
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|