<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        CD紋機控制器單片機程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年02月16日   【字體:

         ////////////////////////////////////////////////////////////////////////////////
        ////環境:編譯為ICCAVR 6.25A
        ////單片機:ATMEGA 8A
        ////日期:2014年2月11日
        ////功能:CD紋機控制器
        ////作者:夜貓子(QQ610027265)
        ////晶振:外部有源晶振,主頻10M
        ////備注:適合用于 恒源隆的CD紋機的自動控制
        ////////////////////////////////////////////////////////////////////////////////
        //包含頭文件////////////////////////////////////////////////////////////////////
        #include<iom16v.h>
        #include<macros.h>
        //定義數據類型//////////////////////////////////////////////////////////////////
        #define uchar unsigned char
        #define uint unsigned int
        //定義輸出io口//////////////////////////////////////////////////////////////////
        #define Y1_OUT DDRC|=BIT(5);
        #define Y1_H PORTC|=BIT(5);  
        #define Y1_L PORTC&=~BIT(5);
        #define Y2_OUT DDRD|=BIT(6);
        #define Y2_H PORTD|=BIT(6);  
        #define Y2_L PORTD&=~BIT(6); 
        #define Y3_OUT DDRD|=BIT(7);
        #define Y3_H PORTD|=BIT(7);  
        #define Y3_L PORTD&=~BIT(7);
        #define Y4_OUT DDRB|=BIT(0);
        #define Y4_H PORTB|=BIT(0);  
        #define Y4_L PORTB&=~BIT(0);
        #define Y5_OUT DDRC|=BIT(4);
        #define Y5_H PORTC|=BIT(4);  
        #define Y5_L PORTC&=~BIT(4);
        #define Y6_OUT DDRB|=BIT(1);
        #define Y6_H PORTB|=BIT(1);  
        #define Y6_L PORTB&=~BIT(1);
        //ad求平均的個數(N的值越大ad越準)///////////////////////////////////////////////
        #define N  3 
        //數碼管亮度調節0x00-0xff
        #define P  0x01
        //定時器的初值//////////////////////////////////////////////////////////////////
        #define TEMERH  0xf0
        #define TEMERL  0x00
        //全局變量//////////////////////////////////////////////////////////////////////
         uint  addata,adc,i,q=1,t1,t2,t3,tt1,tt2,tt3;
         uchar g1,g2,g3;
        //io初始化//////////////////////////////////////////////////////////////////////
        void port_init()
        {
           DDRC&=BIT(0)&BIT(1)&BIT(2)&BIT(3); //AD轉換口設置為輸入
           PORTC&=BIT(0)&BIT(1)&BIT(2)&BIT(3);   //AD轉換口設置為無上拉
            
           DDRD|=0x3f;
           PORTD|=0x3f;          //配置PD口為輸入,有上拉電阻
           DDRD&=0xC0;
          
           Y1_H;Y2_H;Y3_H;Y4_H;Y5_H;Y6_H;              //輸出為高電平
           Y1_OUT;Y2_OUT;Y3_OUT;Y4_OUT;Y5_OUT;Y6_OUT;  //配置成輸出
         
        }
        //spi初始化/////////////////////////////////////////////////////////////////////
        void spi_init()
        {
                DDRB|=BIT(2)|BIT(3)|BIT(5);//置spi數據口為輸出
                SPCR=0x51;
                PORTB|=BIT(2);
                SPSR&=0x7f;
        }
        //初始化max7219數碼管模塊////////////////////////////////////////////////////////
        void initmax7219()
        {
                spi_init();
                max7219(0x0c,0x00);   //掉電模式:0,普通模式:1
                max7219(0x09,0xff);   //譯碼方式:BCD碼
                max7219(0x0a,P);      //亮度調節
                max7219(0x0b,0x07);   //掃描界限;4個數碼管顯示
                max7219(0x0c,0x01);   //掉電模式:0,普通模式:1
                max7219(0x0f,0x00);   //顯示測試:1;測試結束,正常顯示:0
        max7219(3,10); max7219(6,10); //顯示橫杠
                delay_ms(2);
        }
        //定時器1初始化子程序///////////////////////////////////////////////////////////
        void init_timer1()
        {
          TCCR1B|=0x04;//256分頻
          TCNT1H=TEMERH;//高8位初值
          TCNT1L=TEMERL;//低8位初值
          TIMSK|=BIT(2);//定時器1的中斷使能
        }
        //延時函數//////////////////////////////////////////////////////////////////////
        void delay_ms(uint i)
        {
            while(i--)
            {                         
           uint j;               
                for(j=1;j<=1332;j++);              
            }
        }
        //向max7219寫入地址和數據///////////////////////////////////////////////////////
        void max7219(uchar add,uchar date)
        {
          PORTB&=~BIT(2);
          SPDR=add;
          while(!(SPSR&0x80));
          add=SPSR;//讀取SPSR來清除SPIF;
          SPDR=date;
          while(!(SPSR&0x80))
          date=SPSR;
          PORTB|=BIT(2);
        }
        //ADC單次轉換子程序帶1個參數,1個返回值/////////////////////////////////////////
        int Mega8_ad(uchar chl)
        {
            uint sum=0;
             uchar count;
             ADMUX=0x00;            //采用外部參考電壓,輸出數據右對齊
             ADMUX|=chl;            //設置指定的通道
             ADCSR=0x80;        //使能adc采用單次轉換,查詢模式,     
             ADCSR|=BIT(1)|BIT(0);  //8分頻
         for(count=0;count<N;count++)
                {
          ADCSR|=BIT(6);     //啟動轉換
                   while(!(ADCSR&(BIT(ADIF))));  //等待轉換結束
                   addata=ADCL;     //讀取低8位數據
                   addata+=ADCH*256; //讀取高2位數據
                   adc=addata/10.24;
                   sum=sum+adc;
                   delay_ms(1);
                 }
                   return (sum/N);               //返回N次轉換的平均值
         }
        //切換ADC通道采集四個電位器的值送液晶顯示//////////////////////////////////////
        void adc_max7219()
        {
           uchar shi1=0, ge1=0;              
        t3=Mega8_ad(0X40);                         //選擇PC0為AD通道,將轉換結果賦給t1
             max7219(2,t3/10);
        max7219(1,t3%10);   //送顯示
         delay_ms(2);
        t2=Mega8_ad(0X41);                         //選擇PC1為AD通道,將轉換結果賦給t1
             max7219(5,t2/10);
        max7219(4,t2%10);    //送顯示
        delay_ms(2);   
        t1=Mega8_ad(0X43);                         //選擇PC3為AD通道,將轉換結果賦給t1
             max7219(8,t1/10);
        max7219(7,t1%10 );    //送顯示
        delay_ms(2);  
        }
        //////看門狗初始化//////////////////////////////////////////////////////////////
        void watchdog_init(void)
        {
         WDR(); //this prevents a timout on enabling
         WDTCR = 0x1F; //特別注意這一條不是ICC生成的,是后來加上的。
         WDTCR = 0x0c; //WATCHDOG ENABLED - dont forget to issue WDRs
        }

         


        //主函數////////////////////////////////////////////////////////////////////////
        void main()
        {
         watchdog_init();//看門狗
         

            port_init();       //初始化io
        initmax7219();     //初始化max7219
            Mega8_ad(0X40);  //啟動一次通道0的AD轉換 此值舍去
            Mega8_ad(0X41);  //啟動一次通道1的AD轉換 此值舍去
            Mega8_ad(0X43);  //啟動一次通道3的AD轉換 此值舍去
            adc_max7219();   //啟動一次通道0123的AD轉換 送顯示
            init_timer1();     //初始化定時器1
            SREG|=BIT(7);      //打開總中斷
          while(1)  //循環//這里面主要檢測按鍵
          { 
          WDR();
        ///////////////////////////////////////////////////////////////////////////////
        if(!(PIND&BIT(2)))//停止按鈕
          {
           delay_ms(5);
        if(!(PIND&BIT(2)))
        {
         q=1;
              Y1_H;
         Y2_H;
         Y3_H;
         g1=0;g2=0;g3=0;
         tt1=0;tt2=0;tt3=0;
         adc_max7219();   //只有按住停止按鈕才能設置定時值
         if(!(PIND&BIT(1)))//按住停止按鈕 再按啟動按鈕
            {
           delay_ms(5);
        if(!(PIND&BIT(1)))
           {
                 Y3_L;
                 while(!(PIND&BIT(1)))WDR();
           }
            }
         }
        delay_ms(50); 
          }
         

        if(!(PIND&BIT(1))&&(PIND&BIT(2))&&q)//啟動按鈕
           { 
            delay_ms(10);
        if(!(PIND&BIT(1))&&(PIND&BIT(2)))//啟動按鈕
              {
               while(!(PIND&BIT(1)))WDR();//等待啟動按鈕松開
          Y3_L;Y1_L;g1=1;
              }
           }
         //工作模式判斷/////////////////////////////////////////////////////////////////
        if(t1<tt1) //t1時間到                             
         {       
           if(!(PIND&BIT(3))&&(PIND&BIT(0)))     //高光模式(必須關掉走刀開關)
          {
            delay_ms(5);
             if(!(PIND&BIT(3))&&(PIND&BIT(0)))
         {
         g1=0;
         tt1=0;
         Y1_H;
         Y3_H; 
         }
          }
           else if(!(PIND&BIT(0))&&(PIND&BIT(3))) //否則為CD紋模式
              {                                   //(判斷走刀按鈕,必須關掉走刀按鈕)
         delay_ms(5);
        if(!(PIND&BIT(0))&&(PIND&BIT(3))) //再次判斷
         {
          Y2_L;
          if((PIND&BIT(1))&&(!(PIND&BIT(4)))) //行程開關(啟動按鈕必須松開)
          {
              delay_ms(5);
           if((PIND&BIT(1))&&(!(PIND&BIT(4))))
            {
        g2=1;
                     if(t2<tt2)   //t2時間到
         {
                        Y1_H;Y3_H;g3=1;q=0; 
           if(t3<tt3)   //t3時間到(啟動按鈕必須松開)
         {
          g1=0; g2=0; g3=0;
          tt1=0;tt2=0;tt3=0;
          Y2_H;q=1;
         }
           }
        } }
         }
         } 
         }   
         
        ///////////////////////////////////////////////////////////////////////////////

                }
        }


        //定時器1的中斷程序///給繼電器定時用////////////////////////////////////////////
        #pragma interrupt_handler timer1:9
        void timer1(void)
        {
        TCNT1H=TEMERH; 
        TCNT1L=TEMERL;
        if(g1)tt1++;
        if(g2)tt2++;
        if(g3)tt3++;

        //系統閃爍燈
            i++;
           if(i>5) Y6_L;
           if(i>10)
            {
            Y6_H;
            i=0;
            }
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮