⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm+

📁 PWM及其ADC应用
💻
字号:
#include <mega16.h>
flash unsigned char OCR[4]={204,153,102};
flash unsigned char led_7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
flash unsigned char position[4]={0xfe,0xfd,0xfb,0xf7};
unsigned char dis_buff[4],posit,j,dis_buffer[1];
unsigned int adc_data,adc_v;
bit time_2ms_ok;

//4位Led数码管动态扫描
void display(void)
{
    PORTA |= 0x0f;
    PORTC = led_7[dis_buff[posit]];
    if(posit==3) PORTC |= 0x80;
    PORTA &= position[posit];
    if(++posit>=4) posit=0;
}

//Timer0比较匹配中断服务
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
    time_2ms_ok=1; 
    display();
}

//Time2溢出中断服务 快速PWM装值
 interrupt [TIM2_OVF] void timer2_ovf_isr(void)
 {    
     OCR2=OCR[dis_buffer[j]];
 }
 
//ADC电压值送显示缓冲区函数
void adc_to_disbuffer(unsigned int adc)
{
    unsigned char i;
    for(i=0;i<=3;i++)
    {
        dis_buff[i]=adc%10;
        adc/=10;
    }
}

//ADC转换完成中断服务
interrupt [ADC_INT] void adc_int_isr(void)
{
    
    adc_data=ADCW;      //读取ADC转换结果
    adc_v=(unsigned long) adc_data*5000/1024;//换算成电压值
    adc_to_disbuffer(adc_v);
}

void main(void)
{
    DDRA=0x0f;
    PORTA=0x0f;
    DDRC=0xff;
    PORTC=0x00;
    
    //T/C0初始化
    TCCR0=0x0b;//   内部时钟,64分频(4Mhz/64=62.5Khz)CTC模式
    OCR0=0x7c;   //计数重装值
    TIMSK=0x42; //使能T/C2溢出中断,使能T/C0比较匹配中断
    
    //T/C2初始化
    DDRD=0x80;  //PD7口输出PWM波
    TCCR2=0x69; //OC2快速PWM, 内部时钟,1分频 
    OCR2=204;   //装值
    
    //ADC初始化
    ADMUX=0x47;//参考电源AVcc,ADC7单端输入
    SFIOR&=0X1F;
    SFIOR |=0x60;  //选择T/C0比较匹配中断为ADC触发源
    ADCSRA=0xad;   //ADC使能,自觉触发转换,ADC转换中断使能,ADC clk=125Khz
    #asm("sei")
while (1)
      {
        if(adc_data<=409)
        {
            dis_buffer[0]=0;
        } 
        if((adc_data>409)&&(adc_data<=818))
        {
            dis_buffer[0]=1;
        } 
         if(adc_data>818)
        {
            dis_buffer[0]=2;
        } 
      };
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -