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

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

        電賽—簡易直流穩壓電源(源代碼)

        作者:肖邦   來源:本站原創   點擊數:  更新時間:2014年03月08日   【字體:
        小弟學藝不精!請多多包涵。!分享下源代碼有很多可以調用的函數,,,,謝謝     ADC0832與DAC0832處理數據。
        /*****************************************************************
        *************作者:張通  *****************************************
        *************信息工程學院*****************************************
        *************簡易直流穩壓代碼*************************************
        ******************************************************************/
        #include"reg52.h"
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        #define WR WR2
        #define DAT P0
        sbit K1=P3^1;
        sbit K2=P3^2;
        sbit K3=P3^3;
        sbit CS=P2^5;     //片選信號
        sbit SID=P2^2;  //數據信號
        sbit SCLK=P2^1;  //時鐘信號
        sbit RST=P2^2;  //復位信號
        sbit CH = P2^0;  //并行、串行選擇信號
        sbit clk0832=P3^6;
        sbit DI0832=P3^4;
        sbit DO0832=P3^5;
        sbit ADCS=P3^7;
        sbit WR=P2^6;
        bit _Int=0;
        bit state;
        bit k=0;
        bit m=0;
        bit q=0;
        bit fushu=0;
        uint Ch0value,Ch1value;
        uint x;
        uchar ADdat;
        uchar result;
        uchar kyreg;
        uchar go;
        uint DAdat;
        uchar hh;
        uchar temp;     //存放功能狀態 
        void hzkdis(unsigned char code *s);
        void delayms(int z)
        {
         int x,y;
         for(x=z;x>0;x--)
         for(y=115;y>0;y--);
        }
        void delay(uint t)
        {
         uint i,j;
         for(i=0; i<t;  i++)
            for(j=0; j<10; j++);
        }
        /**********
        *讀數值
        ***********/
        uchar keyread()
        {
         uchar kysta=1;//按鍵標志,kysta=1無按鍵
         while(kysta)//鎖定P3口低三位
         {
          P3=0X0e;
          kyreg=P3;
          if(kyreg!=0x0e)
          {
          delay(20);
          kyreg=P3;
          if(kyreg!=0x0e)
          {
          if(kyreg==0x0c)return 11;     //第一個鍵
          if(kyreg==0x0a)return 12;     //第二個鍵
          if(kyreg==0x06)return 13;     //第三個鍵
           }
          }
            while(kyreg!=0x0c)//鍵復位
            {
              P3=0X0e;
           kyreg=P3;
            }
         }
        }
        uchar keyread2()
        {
         if(K2==0)           //KEY鍵實現數據增加
         {
        //  WR2=1;
        //  delay(50);
        //  WR2=0;
          if(K2==0)      //第二個鍵按下
          delay(50);     //P1口數值加1
          P0=go;
          go++;
          while(!K2);
         }
        }
        uchar keyread3()
        {
         if(K3==0)//KEY3鍵實現數據減少
         {
        //  WR2=1;
        //  delay(50);
        //  WR2=0;
          if(K3==0);//第三個鍵按下
          delay(50);
          P0=go;
          go--;//P1口數值減1
          while(!K3);
         }
        }
        /***********************
        *ADC0832數據處理函數
        ***********************/
         uchar ADC0832(uchar channel)
        {uchar i=0;
        uchar j;
         uint dat=0;
         uchar ndat=0;
         if(channel==0)channel=2;
         if(channel==1)channel=3;
        DI0832=1;        //DI為1  
         _nop_();    //延時兩個指令周期  
         _nop_();    
         ADCS=0;    //拉低cs,選通;確定數據輸入開始  
         
            clk0832=1;     //時鐘信號為高 
          _nop_();
            _nop_(); 
            clk0832=0;     //時鐘信號為低,此處為第一個下降沿 
          _nop_();    
        _nop_(); 
            clk0832=1;     //時鐘信號為高  
        DI0832=channel&0x1;// 這句? 
          _nop_();     _nop_();   
          clk0832=0;     //時鐘信號為低,此處為第二個下降沿 
          _nop_();
            _nop_();   
          clk0832=1;      //時鐘信號為高  
         DI0832=(channel>>1)&0x1; //   ?
           _nop_();  
          _nop_();
         clk0832=0;       //時鐘信號為低,此處為第三個下降沿
           DI0832=1;        //DI為1  
         _nop_();  
          _nop_();
            dat=0; 
           for(i=0;i<8;i++) 
           {      
          dat|=DO0832;//這句?      
           clk0832=1;     
           _nop_();
        _nop_();     
            clk0832=0;//形成一次時鐘脈沖  
              _nop_(); 
               _nop_();  
              dat<<=1;
                if(i==7) dat|=DO0832;
            }      
        for(i=0;i<8;i++)  
          {         j=0;   
             j=j|DO0832;  
               clk0832=1;     
           _nop_();        
        _nop_();   
              clk0832=0;//形成一次時鐘脈沖  
              _nop_();     
           _nop_();    
            j=j<<7;    
            ndat=ndat|j;  
              if(i<7)ndat>>=1; 
           }   
        ADCS=1;  //拉高CS端  
          clk0832=0;//拉低CLK端 
          DO0832=1;//拉高數據端回到初始狀態 
          dat<<=8;    
        dat|=ndat;
            return(dat);            //return ad k      
           }
        /**********
        *DAC送數
        **********/
        void seDAC(uchar DAdat)
        {
         WR=1;
         _nop_();
         _nop_();
         DAT=DAdat;
         WR=0;
          _nop_();
         _nop_();
         WR=1;
        }
        /********************************************************************
        * 名稱 : sendbyte()
        * 功能 : 按照液晶的串口通信協議,發送數據
        * 輸入 : zdata
        * 輸出 : 無
        ***********************************************************************/
        void sendbyte(unsigned char zdata)
        {
         unsigned int h;
         for(h=0; h<8; h++)
         {
          if((zdata << h) & 0x80)
          {
           SID = 1;
          }
          else
          {
           SID = 0;
          }
          SCLK = 0;
          SCLK = 1;
         }
        }
        /********************************************************************
        * 名稱 : write_com()
        * 功能 : 寫串口指令
        * 輸入 : cmdcode
        * 輸出 : 無
        ***********************************************************************/
        void write_com(unsigned char cmdcode)
        {
         CS = 1;
         sendbyte(0xf8);
         sendbyte(cmdcode & 0xf0);
         sendbyte((cmdcode << 4) & 0xf0);
         delay(2);
        }
        /********************************************************************
        * 名稱 : write_data()
        * 功能 : 寫串口指令
        * 輸入 : cmdcode
        * 輸出 : 無
        ***********************************************************************/
        void write_data(unsigned char Dispdata)
        {
         CS = 1;
         sendbyte(0xfa);
         sendbyte(Dispdata & 0xf0);
         sendbyte((Dispdata << 4) & 0xf0);
         delay(2);
        }
        /********************************************************************
        * 名稱 : lcdinit()
        * 功能 : 初始化函數
        * 輸入 : cmdcode
        * 輸出 : 無
        ***********************************************************************/
        void lcdinit()

         RST = 0;
         delay(100);
         RST = 1;
         delay(20000);
         write_com(0x30);
         delay(50);
         write_com(0x0c);
         delay(50);
         write_com(0x03);
         delay(50);   
         
        }
        /********************************************************************
        * 名稱 : hzkdis()
        * 功能 : 顯示字符串
        * 輸入 : *s
        * 輸出 : 無
        ***********************************************************************/
        void hzkdis(unsigned char code *s)

         while(*s > 0)
            {
          write_data(*s);
          s++;
          delay(50);
            }
        }
        void Test()

         write_com(0x03);
         delay(50);   
         write_com(0x80);
         hzkdis("簡易直流穩壓電源");
        // write_com(0x90);
        // hzkdis("V=00.0v  A=00.0a ");
         write_com(0x98);
         hzkdis("張通  干順  顏煒");;
        //    write_com(0x98);
        // hzkdis("  12級電子18班  ");
        }
        void writeNumber(uchar row,uchar rank,uint s)

          uchar addr;
          switch(row)
          {
            case 0:addr=0x80;break;
            case 1:addr=0x90;break;
            case 2:addr=0x88;break;
            case 3:addr=0x98;break;
          }
          write_com(0x80);
          hzkdis("簡易直流穩壓電源");  
          write_com(addr+rank);
          write_data('V');
          write_data('=');
          write_data(s/10000+'0');
          write_data(s%10000/1000+'0');
          write_data(s%1000/100+'0');
          write_data(s%100/10+'0');
           write_data(s%10+'0');
          write_data('m');
           write_data('v');
        //  write_data(' ');
        //  write_data(' ');
        //  write_data('A');
        //  write_data('=');
        //  write_data(y/100+'0');
        //  write_data(y%100/10+'0');
        //  write_data('.');
        //  write_data(y%10+'0');
        //  write_data('a');
         }
         void writeNumber1(uchar row,uchar rank,uint s)

          uchar addr;
          switch(row)
          {
            case 0:addr=0x80;break;
            case 1:addr=0x90;break;
            case 2:addr=0x88;break;
            case 3:addr=0x98;break;
          }
          write_com(0x80);
          hzkdis("簡易直流穩壓電源");  
          write_com(addr+rank);
          write_data('A');
          write_data('=');
          write_data(s/10000+'0');
          write_data(s%10000/1000+'0');
          write_data(s%1000/100+'0');
          write_data(s%100/10+'0');
           write_data(s%10+'0');
          write_data('m');
           write_data('a');
          }
        //void display()
        //{
        //writeNumber(1,1,Ch0value);
        //
        //}
        ///*********輸出電壓自增自減程序***********/
        //void volchange()
        //{
        // uchar i,a,b,c,y,z;
        //    if(temp==1&&(DAdat<511))
        // {
        //  if(q)
        //  {
        //   if(z==9)
        //   {
        //    DAdat+=3;z=0;
        //   }              //進位
        //   else DAdat+=2;
        //  }
        //  else DAdat+=3;
        //  z++;
        //  if(DAdat>=129)
        //  {
        //   Ch0value=Ch0value+1;
        ////   lcdcmd(0x80);
        ////   lcddata("V=0000mvA=0000ma");
        ////   c=x/100,a=x%100/10;
        ////   b=x%10;                                                //一位小數,個位,十位的運算
        ////   lcdcmd(0x90);
        ////   for(i=0;i<8;i++)
        ////   lcddata("V");                                    //電壓顯示
        ////   lcddata(Disp[c]);
        ////   lcddata(Disp[a]);
        ////   lcddata(".");
        ////   lcddata(Disp[b]);
        ////   lcddata("mv");
        //         writeNumber(1,0, Ch0value*0.742); 
        //   }
        //   else if(temp==2&&(DAdat>1))
        //   {
        //   if(q)
        //   {
        //    if(y==9){DAdat-=3;y=0;}//借位
        //    else DAdat-=2;
        //   }
        //   else
        //   DAdat-=3;
        //   y++;
        //   if(DAdat>127)
        //   {
        //    Ch0value=Ch0value-1;
        ////    c=x/100,a=x%100/10;b=x%10;//一位小數,個位,十位的運算
        ////    lcdcmd(0x90);
        ////    for(i=0;i<8;i++)
        ////    lcdcmd("V=");//電壓顯示
        ////    lcdcmd(Disp[c]);
        ////    lcdcmd(Disp[a]);
        ////    lcdcmd('.');
        ////    lcdcmd(Disp[b]);
        //                writeNumber(1,0, Ch0value*0.742);   
        //   }
        //
        //  }
        // hh=0;
        // }
        // }
        /********************************************************************
        * 名稱 : Main()
        * 功能 : 主函數
        * 輸入 : 無
        * 輸出 : 無
        ***********************************************************************/
        void main()
        {     uchar A=0;
        //  WR=1;
         EA=1;
         EX0=1;
        // PX0=1;
         IT0=1;
            EX1=1;
            IT1=1;
        // unsigned int vol;
        // uchar i,j,l=0,a=0,b=0,e=0;
        // bit dian=0; 
        // bit o=0,p=0;   //負數標志位,確認標志位
        // pp: a=b=0;dian=0;o=p=0,x=0;
        //  P1=0;
         P0=0xff;
         CH = 0;
         delay(1);
         lcdinit();
         delay(10);
         Test();
          while(1)
          {
          //if((P3^1==0)&&(A==0))
         // {
           
         
         // }
            Ch0value=ADC0832(0);
          
         Ch1value=ADC0832(1);
         
          
        //  if(!K)
        //  {
        //  for(i=0;i<10;i++)
        //  {
        //     Ch0value=ADC0832(0);
        //  delayms(50);
        //  n=n+Ch0value;
        //  K=1;
        // 
        //  }
        //  }
        // 
        //  m=n/10;
        //  Ch0value=m;
        // 
         if(DAT>Ch0value)//輸出值大于顯示值
         {
          result=DAT-Ch0value;//輸出值減顯示值
          state=0;
         }
            else
            {
             result=Ch0value-DAT;//顯示值減輸出值
             state=1;
            }
            if (result>=2)
            {
             result/=2;
             if(state)result=Ch0value-result;
             else result=Ch0value+result;
            }
            else result=Ch0value;
            _Int=1;
        // Ch1value=ADC0832(1);
        // delayms(50);
        // Ch1value=read0832(1);
        // delayms(50);
        //Ch0value=Ch0value*3.922;
         writeNumber(1,0, Ch0value*79);
         writeNumber1(2,0, Ch1value/4.5);
                 
        // while(!k)
        //   {
        //    delay(200);
        //    i=keyread();
           /* if(!m)
            {
             //lcdcmd(0x1);
             for(j=0;j<7;j++)
             //lcddata(0x90);
             m=1;
        //       }*/
        //    if(i==11){m=0;goto pp;}//復位
        //    else if(i==12){temp=1;k=1;q=!q;hh=1;;}//加1
        //     else if(i==13){temp=2;k=1;q=!q;hh=1;;}//減1
        //
        //  }
        //  if(vol>100)
        //  {
        //   lcdcmd(0x01);//顯示清0,數據指針清0
        //   delay(2);
        //   write_cmd(0x80);//從第一個位寫數據
        //      lcdcmd("V=0000mvA=0000ma");
        //   p=1;//溢出標志,P=1溢出
        //  }
        //  if(!fushu&&!hh)//送入DAC的數字量
        //  {
        //   DAdat=256*vol/150+128;
        //   if(DAdat==512)
        //   DAdat=511;hh=0; 
        //  }
        //  else if(fushu&&!hh)
        //  {
        //   DAdat=256-256*vol/150;
        //   fushu=0;
        //   hh=0;
        //  }
        //  if((temp==0)&&(!p))
        //  seDAC(DAdat);   //函數調用
        //  else if(temp==1)
        //  {
        //   volchange();
        //   seDAC(DAdat);
        //   keyread2();
        //   temp=0;
        //  }
        //  else if(temp==2)
        //  {
        //   volchange();
        //   seDAC(DAdat);
        //   keyread3();
        //   temp=0;
        //  }
        //  p=0;
        //  k=0;
        //  }
          }
        // delay(5000);
        //    while(!k)
        //    {
        //     delay(200);
        //   i=keyread();
        //   if(!m) ;
         }  
           
        //
        void reADC() interrupt 2
        {
         uchar result;
         bit state;
         DAT=0x80;
         ADdat=DAT;
         _nop_();
         _nop_();
         if(ADdat>DAdat)//輸出值大于顯示值
         {
          result=ADdat-DAdat;//輸出值減顯示值
          state=0;
         }
            else
            {
             result=DAdat-ADdat;//顯示值減輸出值
             state=1;
            }
            if (result>=2)
            {
             result/=2;
             if(state)result=DAdat-result;
             else result=DAdat+result;
            }
            else result=DAdat;
            _Int=1;
        }
        /******************
        *反饋比較
        *******************/
        uchar cmp(uchar x,uchar y)
        {
        uchar result;
        bit state;
        if(x>=y)
        {
         result=x-y;
         state=0;
        }
        else
        {
        result=y-x;
        state=1;
        }
        if(result>=2)
        {
         result/=2;
         if(state)result=y-result;
         else result=y+result;
        }
        else result=y;
        return (result);
        }
        void keyzj()interrupt 2
        {
         DAT-=0.7;
         delay(200);
        }
        void keyjs()interrupt 1
        {
         DAT+=1;
          delay(200);
        }
        關閉窗口

        相關文章

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