中科因仑“3+1”工程特种兵精英论坛
标题:
基于ATmega16单片机ADC模数转换程序--数码管显示
[打印本页]
作者:
lxe
时间:
2014-8-7 19:45
标题:
基于ATmega16单片机ADC模数转换程序--数码管显示
。。。话不多说。。直接上代码。。若有错误请多指教(实测可行)
/******************************************************
//文件名称:
//作 者:LXE
//版 本:
//日 期:2014.8.7
//说 明:PA0口为ADC输入口PB口用以发送段码PA4~PA7用以发送位码 8M时钟
//修改记录:
*******************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //断码表PB0~PB7
uchar table[]={0x10,0x20,0x40,0x80}; //位码表PA4~PA7
uchar buf[]={0,0,0,0}; //数据缓存区
uchar k = 0;
/*******************************************************
//函数名称:uint get_ADC(void)
//函数功能:进行ADC模数转换
//输入参数:无
//返回参数:ad_data
********************************************************/
uint get_ADC(void)
{
uint ad_data;
DDRA &= ~BIT(0); //PA0设为输入
PORTA &= ~BIT(0); //PA0不上拉
SFIOR = 0x00; //ADC转换触发源为连续自动转换
ADMUX = (1<<REFS0); //0x40;ADC参考电源AVcc,AREF并接电容,选择单端输入,输入口为PA0
ADCSR = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1); //0xC6;ADC使能置1,转换开始位置1,ADC时钟分频为64分频 8M时钟
while(!(ADCSR & (1<<ADIF))); //等待转换结束,ADC中断标志置位
ad_data = ADC; //读取ADC值
ADCSR |= (1<<ADIF); //ADC中断标志位写入1"清零"
ADCSR = 0x00; //关闭ADC转换
return ad_data; //返回本次ADC转换值
}
/*******************************************************
//函数名称:void Adc_to_display(void)
//函数功能:将得到的ADC值转换为10进制数
//输入参数:无
//返回参数:无
********************************************************/
void Adc_to_display(void)
{
uint adc = 0;
ulong temp = 0;
temp = get_ADC();
adc = temp*5000/1024; //ADC值转换为电压值
buf[3] = adc / 1000; //获取电压值存入buf缓存区
buf[2] = adc % 1000 /100; //获取电压值存入buf缓存区
buf[1] = adc % 100 /10; //获取电压值存入buf缓存区
buf[0] = adc % 10; //获取电压值存入buf缓存区
}
/*******************************************************
//函数名称:void timer0_ovf_isr(void)
//函数功能:定时器0溢出中断2ms
//输入参数:无
//返回参数:无
********************************************************/
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
if(k > 3){k = 0;} //用四个数码管显示
PORTB = seg[buf[k]]; //PB口发送段码
PORTA = ~table[k]; //PC口发送位码
k++;
}
/*******************************************************
//函数名称:void main(void)
//函数功能:主函数
//输入参数:无
//返回参数:无
********************************************************/
void main(void)
{
DDRA = 0xFF; //设置PA口为输出方式
PORTA = 0xFF; //设置PA口为上拉模式
DDRB = 0xFF; //设置PB口为输出方式
PORTB = 0xFF; //设置PB口为上拉模式
/*******初始化定时器0******/
TCNT0 = 0x4E; //赋初值
TCCR0 = 0x03; //设置TC0为CLK/1024分频,启动TC0
TIMSK = 0x01; //设置定时计数器的屏蔽寄存器
SEI(); //中断使能
while(1)
{
Adc_to_display(); //ADC值转换
}
}
复制代码
作者:
hxh
时间:
2014-8-7 19:52
学习了
作者:
lucky80204
时间:
2014-8-8 09:12
受教了。。。呵呵
作者:
liliuyang
时间:
2014-8-8 09:19
不错,领悟了
作者:
张衍波
时间:
2014-8-8 13:36
老好人呢,,,,
作者:
lxe
时间:
2014-8-9 08:58
张衍波 发表于 2014-8-8 13:36
老好人呢,,,,
这话是几个意思??
作者:
jerryzhai
时间:
2014-8-9 11:20
八错,我决定用你的{:soso_e102:}
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4