资源描述
本程序经过测试 ,AVR单片机 模拟量转换以及显示程序! ICCAVR软件编译!
#include <iom16v.h>
#include <macros.h>
unsigned char led4[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char led4_buf[] = {0, 0, 0, 0, 0}; /*显示信息*/
//**********************************
void delay_ms(unsigned int i) {
unsigned int a;
unsigned char b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
//**********************************
//**********************************
void main(void) {
unsigned int i;
DDRA = 0x7F; /*方向输入*/
PORTA = 0xFF; /*打开上拉*/
DDRB = 0xFF; /*方向输出*/
PORTB = 0xFF; /*电平设置*/
DDRC = 0xFF;
PORTC = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;
led4_init(); /*显示初始化*/
led4_buf[4] = 3; /*小数点位置*/
while (1) {
delay_ms(100); /*周期控制*/
i = get_ad(); /*获取电压*/
i = (unsigned int)(((unsigned long)i*5000)/1024); /*将AD结果转成电压值*/
int_to_bcd(i); /*将电压值提取出来*/
}
}
//********************************
void led4_init(void) {
/*初始化定时器*/
OCR1A = 1000; /*计数周期为4mS,F=1M*/
TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
TCCR1A = 0x00;
TCCR1B = (1 << WGM12); /*定时器工作在CTC计数器模式*/
TCCR1B |= (1 << CS11); /*设置定时器的分频值为8分频*/
/*SPI接口初始化*/
DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
SPCR = (1<<SPE); /* 使能SPI接口*/
SPCR |= (1<<MSTR); /* 主机模式*/
SPCR |= (1<<SPR0); /* 时钟速率fck/16,62.5Kbit/S */
/*中断使能*/
SEI();
}
//***********************************
unsigned int get_ad(void) {
unsigned int i;
ADMUX = (1 << REFS0);//|(1<<REFS1); /*基准AVCC*/
ADMUX |= (1 << MUX2) | (1 << MUX1) | (1 << MUX0); /*通道7*/
ADCSRA = (1 << ADEN) | (1 << ADSC) /*使能、开启*/
| (1 << ADPS1) | (1 << ADPS0)|(1 << ADPS2); /*8分频*/
while(!(ADCSRA & (1 << ADIF))); /*等待采样结束*/
i = ADC; /*读取AD结果*/
ADCSRA &= ~(1 << ADIF); /*清标志*/
ADCSRA &= ~(1 << ADEN); /*关闭转换*/
return i; /*返回结果*/
}
//*******************************
void int_to_bcd(unsigned int temp) {
unsigned char i;
if (temp > 9999) { /*防止数值过大*/
temp = 9999;
}
for (i = 0; i < 4; i++) {
led4_buf[i] = temp % 10; /*提取当前变量最低位*/
temp = temp / 10; /*去掉当前最低位值*/
}
}
//**********************888]
#pragma interrupt_handler Int_TCCR1A: iv_TIMER1_COMPA
void Int_TCCR1A(void) {
unsigned char temp;
static unsigned char i;
PORTB &= ~(1 << 4); /*准备锁存*/
PORTB |= 0x0F; /*清除显示位选*/
temp = led4_buf[i] % 16; /*过虑溢出的值*/
temp = led4[temp]; /*取出数示码值*/
if (led4_buf[4] == i) { /*显示小数点*/
SPDR = temp& 0x7F; /*加载显示值,启动SPI传输*/
}
else {
SPDR = temp; /*加载显示值,启动SPI传输*/
}
while (!(SPSR & (1<<SPIF))); /* 等待传输结束 */
PORTB |= (1 << 4); /*锁存数据*/
PORTB &= ~(1 << i); /*设置位选*/
if (i > 3) { /*显示位置处理*/
i = 0;
}
else {
i ++;
}
}
展开阅读全文