#include<iom16V.h>
#include<macros.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define P 3.14159265358979
#define fosc 8000000
uint m=0;
uint k,t,ADData,PWM0,PWM1,PWM2,PWM3,PWM4,PWM5,PWM6,PWM7;
void delay(uint ms)
{ //毫秒延時函數
uint i, j;
for (i= 0; i< ms; i++)
{
for (j = 0; j < 1140; j++);
}
}
void port_init() //端口初始化函數
{
DDRB=0XFF; //設置led燈
PORTB=0XFF;
DDRA=0XFF;//打開三極管
PORTA=0XFB;
PORTA=0X00;//ADC通道設置為輸入口,高阻態
DDRA=0X00;
}
void timer0_init()
{
TIMSK|=(1<<OCIE0);
TCCR0|=(0<<COM00)|(0<<COM01)|(0<<WGM00)|(1<<WGM01)|(0<<CS02)|(1<<CS01)|(0<<CS00);//8分頻
TCNT0=0;
OCR0=10;
SREG=0X80;
}
void AD_Init() //AD轉換初始化函數
{ ADMUX|=(1<<REFS0)|(1<<MUX1); //ADC參考電壓為AVcc,ADC轉換結果右對齊,選擇通道ADC2
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);//使能AD轉換,ADC時鐘64分頻
}
uint AD_GetData()
//A/D轉換函數
{
ADCSRA|=(1<<ADSC); //開始AD轉換
while(!(ADCSRA & (1<<ADIF))); //等待轉換完成
ADCSRA|=(1<<ADIF); //清零ADC中斷標志位
return ADC; //返回ADC值
}
void main(void)
{
port_init();
AD_Init();
timer0_init();
while(1)
{ ADData=(int)((long)AD_GetData()*5010/1024);
k=ADData*20/1024;
for(t=0;t<256;t++)
{
PWM0=128*sin(P*t/128)+128;//改變占空比
PWM1=128*sin(P*t/128+P/4)+128;
PWM2=128*sin(P*t/128+P/2)+128;
PWM3=128*sin(P*t/128+3*P/4)+128;
PWM4=128*sin(P*t/128+P)+128;
PWM5=128*sin(P*t/128+5*P/4)+128;
PWM6=128*sin(P*t/128+6*P/4)+128;
PWM7=128*sin(P*t/128+7*P/4)+128;
delay(k);
}
for(t=255;t>0;t--)
{
PWM0=128*sin(P*t/128)+128;//改變占空比
PWM1=128*sin(P*t/128+P/4)+128;
PWM2=128*sin(P*t/128+P/2)+128;PWM3=128*sin(P*t/128+3*P/4)+128;
PWM4=128*sin(P*t/128+P)+128;
PWM5=128*sin(P*t/128+5*P/4)+128;
PWM6=128*sin(P*t/128+6*P/4)+128;
PWM7=128*sin(P*t/128+7*P/4)+128;
delay(k);
}
}
}
#pragma interrupt_handler timer0_COMP:20
void timer0_COMP(void)
{
TCNT0=0;
OCR0=5;//充當定時器功能
m++;
if(m==PWM0)
{
PORTB&=0XFE;
}
if(m==PWM1)
{
PORTB&=0XFD;
}
if(m==PWM2)
{
PORTB&=0XFB;
}
if(m==PWM3)
{
PORTB&=0XF7;
}
if(m==PWM4)
{
PORTB&=0XEF;
}
if(m==PWM5)
{
PORTB&=0XDF;
}
if(m==PWM6)
{
PORTB&=0XBF;
if(m==PWM7)
{
PORTB&=0X7F;
}*/
if(m==256)
{
PORTB=0XFF;
m=0;
}
}
|