久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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;
    }
}

關閉窗口

相關文章

主站蜘蛛池模板: 成人一级黄色毛片 | 亚洲免费毛片 | 久久精品久久久 | www.99热.com| 一区二区三区免费 | 亚洲成人免费在线观看 | 欧美黄色网 | 日韩精品四区 | 国产一区二区欧美 | 91精品国产91久久久久久最新 | 国产成人综合一区二区三区 | 黄色精品视频网站 | 欧美一区二区三区在线观看 | 日本精品视频在线观看 | 91视频电影 | 日韩在线一区二区三区 | 日韩一区三区 | 精品在线观看入口 | 中文字幕日韩欧美一区二区三区 | 丝袜久久 | 免费黄色片在线观看 | 色婷婷亚洲一区二区三区 | 欧美一级黄 | 亚洲精品电影在线观看 | 天天爽天天操 | 久久成人免费 | 91伊人 | 国产一区二区三区四区五区3d | 二区视频 | 亚洲精品久久久久中文字幕二区 | 国产精品久久久久久久久久久久 | 爱爱视频网 | 欧美激情免费在线 | 亚洲一区视频在线 | 久久夜视频 | 日本韩国欧美在线观看 | 亚洲色欲色欲www | 国产福利在线小视频 | 欧美成人黄色小说 | 精品免费国产视频 | 欧美日韩久久久久 |