ATMEGA48,设计一个电阻网络,用AD实现三个按键的输入判断功能

该程序实现了ADC初始化、电压采样和转换,根据电压值控制LED灯的状态。通过ADC读取电压,当电压达到特定范围时,相应LED灯亮起或熄灭,实现了基于电压输入的按键模拟功能。

 

#include<iom48v.h>
unsigned int ad;    

//io初始化
void io_init(void)
{
    DDRB = 0B11111111;
    PORTB = 0B11111111;
}

//ADC初始化
void adc_init()
{
    ADMUX = 0x46;  //(0100 0110)基准源AVCC,AREF引脚外加滤波电容,右对齐,adc6
    ADCSRA = 0xc3; //(1100 0011)使能,开始转换,ADC预分频器选8分频
    ADCSRB = 0x00; //(0000 0000)连续转换模式
}


//ADC采样
unsigned int ad_get(void)
{
    unsigned int j;
    ADCSRA |= 0x40;          //(0100 0000)开始转换
    while (!(ADCSRA & 0x10)); //等待采样结束
    j = ADC;        //读取ADC结果
    ADCSRA |= 0x10; //清标志
    return j;       //返回结果
}

//电压转换函数
int ad_convert(unsigned int i)
{
   long x;
   unsigned int y;
   x = (5*1000*(long)i)/1024;
   y = (unsigned int)x;
   return y;
}
 
 //延时函数
void delay(int count)
{
    int i;
    for(i=1;i<=count;i++)
    ;
}

//主程序,不同(电压)对应按下不同的按键,按键按下对应的灯闪亮,按键松开对应的灯灭
void main(void)
{                  
    io_init();
    adc_init();
    while(1)
    {
    ad = ad_convert(ad_get());
    if(ad > 4000) 
    {
    PORTB = ~(1<<0); 
    }
    if((ad > 3000) && (ad < 4000))
    {
    PORTB = ~(1<<1);
    }
    if((ad > 1000) && (ad < 2000))
    { 
    PORTB = ~(1<<2);
    }
    delay(1000000);
    PORTB =0b11111111;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值