找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 848|回复: 0
收起左侧

avr单片机所做的呼吸流水灯出现频闪的现象

[复制链接]
ID:633612 发表于 2019-12-13 15:05 来自手机 | 显示全部楼层 |阅读模式
#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;
                                    }
                           
}
     
         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表