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

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

        STC12C5A60S2各模塊的應用分享大家

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

        /*****************串口應用 ******************/
        ///////////////////串口一
        //////////////                         
        #include"12c5a60s2.h"
        #include"uart.h"
        unsigned   char   buf[3],g;
        void   initUart()
        {
         EA=1;   
         BRT=0XFD;  //獨立波特率發生器9600 
         AUXR=0X11;  //啟動獨立波特率發生器,12分頻
        //  TMOD=0X20;  //用定時器1做波特率發生器
        // TH1=0XFD;
        // TL1=0XFD;
        // TR1=1;
         REN=1;   
         SM1=1;
         ES=1;
         g=0;
        }
        void   sendDate(unsigned   char date)
        {
         SBUF=date;
         while(!TI);
         TI=0;
        }
        void  work()
        {
         sendDate(buf[0]);
         sendDate(buf[1]);
        }
        void   res()interrupt  4
        {
         buf[g++]=SBUF;
         if(g>=2)
         {
          g=0;
          work();
         }
         while(!RI);
         RI=0;
        }
         ////////////////////串口二////////////////
        #include<12c5a60s2.h>
        #include"uart2.h"
        #define   S2TI  0X02    //不能位尋址
        #define   S2RI  0X01    //不能位尋址
        unsigned  char   shuzhi;
        void   initUART2()
        {
         BRT=0XFD; //定初值 9600
         AUXR=0X11; //使用波特率獨立發生器 12分頻  9600
        // AUXR=0X19; //使用波特率獨立發生器 1分頻  19200
         EA=1;
         IE2=0X01;   //ES2=1;
         S2CON=0X50;//S2REN=1;S2SM1=1;
        }
        void   senddate(unsigned  char  date)
        {
         S2BUF=date;       //判斷是否是一
         if(S2CON&S2TI)      //清零
         S2CON&=~S2TI; 
        }
        void  uart2r()interrupt  8
        {
         if(S2CON&S2RI)    //判斷是否是一
         {
          S2CON&=~S2RI;   //清零
             shuzhi=S2BUF;
          senddate(0x40);
          
          }

         /******************AD轉換*************************/ 
         #include"12c5a60s2.h"
        #include"12c5aad.h"
        #include<intrins.h>
        //寄存器地址聲明 ,有12c5a60s2  頭文件可省略
        //sfr  ADC_CONTR  =0XBC;
        //sfr  ADC_RES  =0XBD;
        //sfr  ADC_ERSL  =0XBE;
        //sfr  P1ASF =0X9D;
        //宏定義
        #define ADC_POWER  0X80    // ad電源控制位 
        #define ADC_FLAG    0x10            //ad轉換結束標志位
        #define ADC_START   0x08            //ad轉換開始控制位
        #define ADC_SPEEDLL 0x00            //540 轉換速率
        #define ADC_SPEEDL  0x20            //360 轉換速率
        #define ADC_SPEEDH  0x40            //180 轉換速率
        #define ADC_SPEEDHH 0x60            //90 轉換速率

        //ad轉換延時函數
        void   delayad(unsigned   int  z)
        {
         unsigned   int   x,y;
         for(x=5000;x>0;x--)
          for(y=z;y>0;y--);
         
        }  
        //ad初始化函數
        void   initad()
        {
         P1ASF=0XFF;//設置P1口為ad轉換模式
         ADC_RES=0;//ad轉換結果寄存器清零
         ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //打開ad轉換電源  ,最慢頻率
         delayad(2);                      //延時待電源穩定提高精確性
        }
        unsigned   char  getAD(unsigned  char  ch)  //ch通道選擇
        {
          ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch ;
          _nop_(); _nop_();_nop_();_nop_();
          while(!(ADC_CONTR&ADC_FLAG));     //ad轉換完成 FALG 為1
          ADC_CONTR&=~ADC_FLAG;    //FALG置置零
          return  ADC_RES;  
        }
         /********************PCA/PWM*****************/
         /////////////////////中斷模式/////////////////////
        #include<12c5a60s2.h>
        #include"pcaint.h"
        unsigned  char miao;
        void   initPCAint(void)
        {
         CCON=0;   
         CL=0;
         CH=0;
         CMOD=0X00; //禁止CF中斷
         CCAPM0=0X11;// (CAPN0 負捕獲,CAPP0 正捕獲)本模塊負捕獲
         CCAPM1=0X21; // 模塊一正捕獲
         CR=1;  //開計數列陣
         EA=1;  //開總中斷
        }
        void   pca()interrupt   7
        {
         if(CCF0==1)
         {
          CCF0=0;  //清零模塊中斷標志位
          miao++;
         }
         if(CCF1==1)
         {
          CCF1=0;  //清零模塊中斷標志位
          miao--;
         }
        }
         //////////////////////////定時器模式////////////////////
        #include<12c5a60s2.h>
        #include"pcatime.h"
        unsigned   int value;    //數組賦值
        unsigned  char  ptime;
        //ptime=0xb402; 50ms定時 0x2400 10ms
        void   initPCATime()
        {
         CCON=0X00;    //標志位清零 
         CL=0;     //pca L列陣清零
         CH=0;     //PCA H列陣清零
         CMOD=0X00;    //選擇時鐘模式
         CCAP1L=value;    //先賦值高位
         CCAP1H=value>>8;  //賦值
         CCAPM1=0X49;  //允許比較器ECOM1,MAT1、ECCF1置位允許CCF1中斷
         CR=1;     //允許列陣
         EA=1;     //開總中斷
        }
        void   pcatime()interrupt  7//兩個PCA模塊都是中斷7
        {
         unsigned   int  i;
          CL=0;     //清零不然是溢出時鐘,定時無效
          CH=0;     //清零不然是溢出時鐘,定時無效
          CCF1=0;
          CCAP1L=value;
          CCAP1H=value>>8;   
          i++;
          if(i>=20)
          {
           i=0;
           ptime++;
          }

        }
        ///////////////////////PWM模式//////////////////////
        #include"12c5a60s2.h"
        #include"12c5apwm.h"
        void   initPWM(void )
        {
         CCON=0;       //關閉PCA計數及標志位清零
         CL=0;      // 清空pca計數低位
         CH=0;      // 清空pca計數高位
         CMOD=0X08;      // 用系統時鐘 不分頻
        // CCAP0H=CCAP0L=0x01; // 模塊0復初值
         CCAPM0=0X42;     //允許模塊0比較器工作,脈寬調制模式
        // CCAP1H=CCAP1L=0X01; //模塊1復初值
         CCAPM1=0X42;  //允許模塊1比較器工作,脈寬調制模式
         CR=1;    //啟動pca計數
        }
        void  tiaoj(unsigned   char pwmH,unsigned  char pwmL)
        {
          CCAP0H=CCAP0L=pwmH;// 模塊0復值
          CCAP1H=CCAP1L=pwmL;// 模塊1復值
        }
         /**********************EEPROM*************************/
        #include<12c5a60s2.h>
        #include<intrins.h>
        #include"eeporm.h"
        #define   Rdeeprom 0x01
        #define   Wreeprom 0x02
        #define   ERSeeprom 0x03
        #define   WTime     0x01  // 0x02  0x03 0x00 
        sfr ISP_DATA=0Xc2;
        sfr ISP_ADDRH=0Xc3;
        sfr ISP_ADDRL=0Xc4;
        sfr ISP_CMD=0Xc5;
        sfr ISP_TRIG=0Xc6;
        sfr ISP_CONTR=0Xc7;
        unsigned  char  miao,miao2,miao3;
        bit  int0flag;
        void  ISP_Open(void)
        {
         EA=0;      //關中斷
         ISP_CONTR=ISP_CONTR&0X18; //清零
         ISP_CONTR=ISP_CONTR|WTime; //等待時間
         ISP_CONTR=ISP_CONTR|0x80; //使能ISP
        }
        void  ISP_Close(void)
        {
         ISP_CONTR=ISP_CONTR&0X7F;  //停止ISP使能
         ISP_TRIG=0X00;      //命令觸發寄存器清零
         EA=1;        //開中斷
        }
        void  ISP_Goon(void)
        {          //打開ISP
         ISP_Open();
         ISP_TRIG=0x5a;     //寫觸發命令
         ISP_TRIG=0xa5;     //寫觸發命令
         _nop_();
        //等待
        }
        void   byte_write(unsigned  int add,unsigned  char dat)  //寫某地址數據
        {
         ISP_ADDRH=(unsigned   char)(add>>8);    //地址高位
         ISP_ADDRL=(unsigned   char)(add&0x00ff);   //地址低位
         ISP_CMD=ISP_CMD&0XF8;        //命令模式復位
         ISP_CMD=ISP_CMD|Wreeprom;       //寫命令
         ISP_DATA=dat;          //讀寫寄存器賦值
         ISP_Goon();           //打開、觸發
         ISP_Close();
         _nop_();          //關閉
        }
        void   sector(unsigned  int add)
        {
         ISP_ADDRH=(unsigned   char)(add>>8);    //地址高位
         ISP_ADDRL=0x00;   //地址低位
         ISP_CMD=ISP_CMD&0XF8;        //命令模式復位
         ISP_CMD=ISP_CMD|ERSeeprom;       //刪命令
         ISP_Goon();           //打開、觸發
         ISP_Close();
         _nop_(); 
        }
        unsigned   char byte_read(unsigned  int  add)
        {
         ISP_ADDRH=(unsigned   char)(add>>8);    //地址高位
         ISP_ADDRL=(unsigned   char)(add&0x00ff);   //地址低位
         ISP_CMD=ISP_CMD&0XF8;        //命令模式復位
         ISP_CMD=ISP_CMD|Rdeeprom;       //讀命令
         ISP_Goon();           //打開、觸發
         ISP_Close();
         _nop_();
         return (ISP_DATA);
        }
        void   initc()
        {
         IT0=1;
         EX0=1;
         EA=1;
        }
        void    int0()interrupt 0
        {  
         if(int0flag==1)
         {      
          EA=0;
          sector(0x00ff);   //0000h-03ffh
          byte_write(0X00ff,miao3);
          EA=1;     
         } 
        }
        /////////////////////////////////////////////////////////
        寫的一般,不足之處還望包涵,均測試通過,歡迎提好的建議。
        關閉窗口

        相關文章

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