标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。