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

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

相關文章

主站蜘蛛池模板: 国产一区三区视频 | 日本在线视频一区二区 | 亚洲3级| 日韩在线视频免费观看 | 亚洲毛片在线观看 | 亚洲精品电影在线观看 | 99亚洲国产精品 | 在线观看国产 | 一级黄色毛片 | 日本久久一区二区三区 | 国产成人在线免费 | 欧美一级片免费看 | 亚洲综合成人网 | 伊人操| 精品免费 | 97免费在线观看视频 | 久久久青草婷婷精品综合日韩 | 羞羞视频在线观免费观看 | 国产精品久久久久久久一区二区 | 国产精品 亚洲一区 | 国产精品久久久久久婷婷天堂 | 桃花av在线 | 日韩精品一区二区三区第95 | 超碰在线久 | 99精彩视频 | 日韩精品久久久久 | 国产视频久久 | 久久久久久综合 | 在线一区| 国产精品91视频 | www.一级片| 午夜免费小视频 | 2022国产精品 | 久久久久久久久91 | 九九国产在线观看 | 欧美精品成人 | 成人免费视频观看 | 新91视频网| 国产精品国产三级国产aⅴ原创 | 国产综合视频 | 久草网站 |