|
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define PD PORTD
#define PC PORTC
#define PB PORTB
//控制端口定义
//端口操作定义
#define CS_7715 PB7 //AD7715的片选接在PA4
#define SET_CS_7715 PORTB |= 1<<CS_7715
#define CLR_CS_7715 PORTB &= ~(1<<CS_7715)
#define RET PB6 //AD7715的复位接在PA5
#define SET_RET PORTB |= 1<<RET
#define CLR_RET PORTB &= ~(1<<RET)
#define DRRY PB2 //AD7715的数据有效接在PB3
#define DRRY_7715 (PINB & (1<<DRRY))
const uchar led[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const uchar ledrl[]={0XFE,0XFD,0XFB,0XF7,0XEF};
void delay_ms(void)//1ms延时函数
{
unsigned int i;
asm("nop");
for (i=0;i<1139;i++)
{
;
}
}
void delay_nms(unsigned int n)//延时n毫秒
{
unsigned int i;
for (i=0;i<n;i++)//执行n次1毫秒延时
{ delay_ms(); }
}
void delay_nus(unsigned int n)//延时N微秒,N>=5 晶振:8MHz
{
unsigned int i;
for (i=5;i<n;i++)
{
asm("nop");
asm("nop");
}
}
void port_init(void)
{
PD=0XFF;
DDRC=0XFF;
PC=0XFF;
DDRD=0XFF;
DDRB=0Xff;
PB=0XFF;
}
//SPI initialize
// clock rate: 62500hz
void spi_init(void)
{
DDRB |= (1<<PB5)|(1<<PB4); //设置MOSI 和SCK 为输出
DDRB &= ~(1<<PB3);
SPCR = 0x53; //setup SPI
SPSR = 0x00; //setup SPI
}
//写入AD7705一字节函数
//入口:data 需写入的字节数据
uint wr_byte(unsigned char data)
{
SPDR = data;
while(!(SPSR &(1 << SPIF)));
return SPDR;
}
//读出AD7705数据函数
//出口:读出的2字节数据
unsigned int rd_7705(void)
{
unsigned int temp; //定义临时变量
wr_byte(0x38); //选择读数据寄存器,1通道
SPDR = 0; //启动数据传输
while(!(SPSR &(1 << SPIF))); //等待传输结束
temp = SPDR<<8; //读取高字节
delay_nms(20);
SPDR = 0; //启动数据传输
while(!(SPSR &(1 << SPIF))); //等待传输结束
temp |= SPDR; //读取低字节
return(temp);
}
//判断有无数据函数
//出口:读出的2字节数据
unsigned int ad7715(void)
{
if(DRRY_7715==0)
{
return(rd_7705());
}
else
{
return(10);
}
}
//AD7705初始化函数
void init_7715(void)
{
spi_init();
DDRB |= (1<<CS_7715)|(1<<RET); //定义端口方向
DDRB &= ~(1<<DRRY);
PORTB|= 1<<DRRY;
CLR_CS_7715; //片选有效
CLR_RET; //复位端低有效
delay_nms(100); //保持500MS低电平
SET_RET; //复位端回复高
delay_nms(1);
wr_byte(0x10); //选择时通信存器
wr_byte(0x44); //50HZ的转换频率
wr_byte(0x00); //选择设置寄存器
wr_byte(0x38); //自校准模式,增益为1,单极性
}
void main(void)
{unsigned int ladc=0;
port_init();
spi_init();
init_7715();
while(1)
{
ladc=ad7715();
PD=led[ladc/10000];
PC =ledrl[0];
delay_nms(1);
PD=led[(ladc%10000)/1000];
PC =ledrl[1];
delay_nms(1);
PD=led[(ladc%1000)/100];
PC =ledrl[2];
delay_nms(1);
PD =led[(ladc%100)/10];
PC =ledrl[3];
delay_nms(1);
PD =led[ladc%10];
PC =ledrl[4];
delay_nms(1);
PC=0XFF;
}
}
数码管不显示,请高手指点。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|