//main.c
#include <avr/io.h>
#include <pwm.h>
//typedef unsigned char uint8;
//typedef unsigned int uint16;
#define uchar unsigned char
#define uint unsigned int
/*typedef enum
{
READ = 0,
WRITE
}IIC_RW_TAG;
typedef enum
{
FALSE = 0,
TRUE
}BOOLEAN;
typedef enum
{
NON_KEY = 0,
KEY1,
KEY2
}KEY_VALUE;*/
#define BIT(i) (1 << i)
#define ADC_PORT 2
//#define KEY3_PORT 0
//#define KEY4_PORT 1
#define LOW_ADC_LINE 0x155//0x186//0x01//
#define HIGH_ADC_LINE 0x2BB//0x2AA//0x3FE//
//#define GREEN 3
//#define RED 4
#define VOLUME_ADD 0x5
#define VOLUME_SUB 0xa
//#define RED_ON DDRB |= (1 << RED) //输出低电平 测试:红灯亮
//#define RED_OFF DDRB &= ~(1 << RED) //输入,外部电阻上拉为高电平 测试:红灯灭
//#define GREEN_ON DDRB |= (1 << GREEN) //输出低电平 测试:绿灯亮
//#define GREEN_OFF DDRB &= ~(1 << GREEN) //输入,外部电阻上拉为高电平 测试:绿灯灭
void Delay_ms(uint n);
//void Delay_IIC(uint16 n);
void ADC_init(void);
//KEY_VALUE Get_KEY_VALUE(void);
void sys_init(void);
int main(void);
void Delay_ms(uint n) //n = 0时,为最大延时
{
uint m = 250;
while(--n)
{
while(--m);
}
}
/*void Delay_IIC(uint16 n) //n = 0时,为最大延时
{
while(--n);
}*/
void ADC_init(void)
{
ADCSRA=0x00;
/***************************************************
//内部1.1v参考电压,0通道
ADMUX ADC多路复其选择寄存器 - ADMUX
7 6 5 4 3 2 1 0
- REFS0 ADLAR - - - MUX1 MUX0
____________________________________________
REFS0 | 参考电压选择
0 | Vcc 作为模拟参考电压
1 | 片内基准电压1.1V
--------------------------------------------
ADLAR = 0 右对齐
MUX1.MUX1:01 - ADC1
*******************************************************/
ADMUX = 0x01; //选择ADC1通道
ACSR = (1 << ACD); //禁用模拟比较器
/********************************************************************
ADCSRA:ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
7 - ADEN: ADC使能
6 - ADSC: ADC开始转换
5 - ADATE: ADC自动触发使能
4 - ADIF: ADC中断标志位
3 - ADIE: ADC中断允许
2..0 - ADPS2..0: ADC预分频选择
000 - 2 ; 001 - 2;010 - 4; 011 - 8;
100 - 16;101 - 32;110 - 64;111 - 128
*********************************************************************/
//使能ADC,终端允许,自由模式,时钟CLK/8
//0x86允许转换ADEN,ADSC,时钟128分频 75KHz@9.6MHz system clock
ADCSRA = (1 << ADEN) | 0x07;//| ( 1 << ADATE )
}
/*KEY_VALUE Get_KEY_VALUE(void)
{
KEY_VALUE key_ret = NON_KEY;
uint16 adc_value1;
uint16 adc_value2;
ADC = 0;
ADCSRA |= (1 << ADSC); //启动AD转换
Delay_IIC(8);
loop_until_bit_is_set(ADCSRA, ADIF); //方法1 等待AD转换结束
////loop_until_bit_is_clear(ADCSRA, ADSC); //方法2 检测ADSC=0也行
ADCSRA |= (1 << ADIF); //写1清除标志位*/
/*******计算公式******************************************
ADC(ADCH+ADCL) = (Vin * 1024)/Vref
Vin :选定的输入因交上的电压,Vref选定的参考电源的电压,现为Vcc
********************************************************/
/*adc_value1 = ADC;
Delay_ms(20); //去抖动延时
ADCSRA |= (1 << ADSC); //启动AD转换
Delay_IIC(8);
loop_until_bit_is_set(ADCSRA, ADIF); //方法1 等待AD转换结束
////loop_until_bit_is_clear(ADCSRA, ADSC); //方法2 检测ADSC=0也行
ADCSRA |= (1 << ADIF); //写1清除标志位
adc_value2 = ADC;
if ((adc_value1 < HIGH_ADC_LINE) && (adc_value2 < HIGH_ADC_LINE))
{
key_ret = KEY1;
if ((adc_value2 < LOW_ADC_LINE) && (adc_value1 < LOW_ADC_LINE))
{
key_ret = KEY2;
}
}
return key_ret;
} */
void sys_init(void)
{
/*********I/O初始化说明*******************************
PIN: 1 3 2 7 6 5
PORTB: PB5 PB4 PB3 PB2 PB1 PB0
FUN: ADC0 IIC_SDA IIC_SCL LED signal _RST
init: 将所有I/O口均初始化为输入状态
DDRB: 0 0 0 0 0 0
PROTB: 0 0 0 0 0 0
******************************************************/
OSCCAL = 0x58; //校准片内RC振荡器频频率9.6MHz
DDRB = 0x00; //将所有I/O口均初始化为输入状态
PORTB = 0x00; //BIT(ADC_PORT);
}
int main()
{
//KEY_VALUE key_val = NON_KEY;
sys_init();
ADC_init();
port_init();
timer0_init();
uchar k;
uint adc_data1,adc_l1,adc_h1,adc_value[6],adc_min,adc_max;
while(1)
{
for(k=0;k<6;k++)
{
adc_min=adc_value[0];
adc_max=adc_value[0];
if(adc_min>adc_value[k])
adc_min=adc_value[k];
if(adc_max<adc_value[k])
adc_max=adc_value[k];
ADC = 0;
ADCSRA |= (1 << ADSC);
Delay_ms(20);
loop_until_bit_is_set(ADCSRA, ADIF);
Delay_ms(20);
adc_l1=ADCL;
adc_h1=ADCH;
adc_value[k]=adc_h1<<8|adc_l1;
adc_data1=(adc_value[0]+adc_value[1]+adc_value[2]+adc_value[3]+adc_value[4]+adc_value[5]-adc_max-adc_min)/16;//*1.11631345490389;//35;
PWMON = 1; //初始为PWM开启
OCR0A =adc_data1;//*0.056512141280353200883002207505519;// PWM[PWMVal]; //更改占空比
TCCR0A = 0x83; //开启PWM
//Delay_IIC(8);
//Get_KEY_VALUE();
/*while(1)
{
key_val = Get_KEY_VALUE();
switch(key_val)
{
case KEY2:
RED_OFF; //测试:红灯亮
GREEN_ON; //测试:绿灯灭
break;
case KEY1:
RED_ON; //测试:红灯亮
GREEN_OFF; //测试:绿灯灭
break;
default:
GREEN_OFF; //测试:绿灯灭
RED_OFF; //测试:红灯灭
break;*/
}
}
}
- 1
- 2
- 3
- 4
- 5
前往页