ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AVR单片机 ATMEGA8单片机 ADC电压采样 数码管输出

2022-01-20 16:02:58  阅读:142  来源: 互联网

标签:DIAN LED 数码管 ATMEGA8 单片机 JI QI buf define


1. 先看原理图,使用内部的ADC电压采样,通过数码管输出

 

2. 相关代码

#include <avr/io.h>

//1 总的来说,ADC总共有3个寄存器,
//  这个ADC是10位的,原来找到了寄存器的头文件
#define  LED_DATA PORTD
#define  LED_CONTROL PORTB
#define  LED_0    PORTB0
#define  LED_1    PORTB1
#define  JI_DIAN_QI PORTC1
#define  DIAN_JI PORTC3
#define  LED_2    PORTB2
#define  JI_DIAN_QI_ON  PORTC |= (1<<PORTC1)
#define  JI_DIAN_QI_OFF PORTC &= ~(1<<PORTC1)

#define  DIAN_JI_ON  PORTC |= (1<<PORTC3)
#define  DIAN_JI_OFF PORTC &= ~(1<<PORTC3)

//1 目前看来引脚的顺序发生了变化
//  ADC采样用的是ADC2
//  电机控制是PC3
//  继电器控制是PC1
char buf[3] = {0};
char adc_buf[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void AD_Init(void)
{
    //参考电压AREF,左对齐,ADC2单端输入
    ADMUX |= (1 << ADLAR) | (1 << MUX1);
    //AD使能, 连续转换,中断使能,32分频, 6M / 32 = 187.5khz
    ADCSRA |= (1 << ADEN) | (1 << ADFR) | (1 << ADPS2) | (1 << ADPS0);
    //AD开始转换
    ADCSRA |= (1 << ADSC);
}

void delay(unsigned int j)
{
    while(j--)
    {
            int i = 20000;
            while(i--);    
    }

}

void gpio_init()
{
    DDRD = 0XFF;
    DDRB |= (1<<LED_1) + (1<<LED_2) + (1<<LED_0);

    DDRC |= (1<<JI_DIAN_QI) + (1<<DIAN_JI);
    JI_DIAN_QI_OFF;
    DIAN_JI_OFF;
}

void led_display()
{
    int i =10000;
    while(i--)
    {
        
        LED_DATA = buf[0];
        LED_CONTROL |= 1<<LED_0;
        delay(50000);
        delay(50000);
        delay(50000);
        delay(50000);
        LED_CONTROL &= ~(1<<LED_0); 
        
        LED_DATA = buf[1];
        LED_CONTROL |= 1<<LED_1;
        delay(50000);
        delay(50000);
        delay(50000);
        delay(50000);
        LED_CONTROL &= ~(1<<LED_1);
                
        LED_DATA = buf[2];
        LED_CONTROL |= 1<<LED_2;
        delay(50000);
        delay(50000);
        delay(50000);
        delay(50000);
        LED_CONTROL &= ~(1<<LED_2);    
    }    
}
int main(void)
{
    unsigned  long int result = 0;
    
    unsigned char i;
    unsigned char flag = 0;
    gpio_init();
    //AD初始化
    AD_Init();

     while(1)
     {
         i = 5;
         result = 0;
         //1 循环10次采样,求平均值
         AD_Init();
         while(i--)
         {
            while((ADCSRA & (1 << ADIF)) == 0);
            //读取转换值
            result += ADCH; 
         }

         //result = result/10;
    
         result = ((result * 50 * 3)/5)/254;
         
        //JI_DIAN_QI_ON;
        //DIAN_JI_ON;

         
                 if(result < 108)
                 {
                     flag = 1;
                     JI_DIAN_QI_ON;
                 }
                 else if(result > 144)
                 {
                     flag = 2;
                     JI_DIAN_QI_OFF;
                 }
                 else
                 {
                     if(flag == 1)
                     JI_DIAN_QI_ON;
                     else if(flag == 2)
                     JI_DIAN_QI_OFF;     
                 }
                 
                 if(result > 110)
                  DIAN_JI_ON;
                 else
                  DIAN_JI_OFF;
            
        
         //数据更新
         buf[2] = adc_buf[result / 100];
         buf[1] = adc_buf[result % 100 / 10];
         buf[0] = adc_buf[result % 10 ]; 
         //数据显示
         led_display();
     }
}

 

标签:DIAN,LED,数码管,ATMEGA8,单片机,JI,QI,buf,define
来源: https://www.cnblogs.com/429512065qhq/p/15826653.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有