📄 pwm+
字号:
#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 + -