。。。话不多说。。直接上代码。。若有错误请多指教(实测可行)- /******************************************************
- //文件名称:
- //作 者: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值转换
- }
- }
复制代码
|