⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianliuyuan.txt

📁 用89C52制作恒流源
💻 TXT
字号:
#include"reg52.h"
#include"absacc.h"
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define XADDRESS XBYTE[0x0000]
#define key XBYTE[0xe000]
uchar keybuf,tishi,tishi1,queren,i,j,zhuanhuan;
uchar idata t,qiehuan1,qiehuan2;
uchar idata shuzu[5],gewei[5],gewei1[5];//前者显示预置,中者显示实测,后者增减显示
uint idata qz[4]={1,10,100,1000},shuzhi1,shice;
uint shuzhi;
void LCMInit(void);
void cls(void);
void dprintf(uchar x,uchar y,char *ptr);
void shortdelay(uint tt);
void da_0(uint da);
uint ad_0(void);
void scxianshi(uint m);
void zjxianshi(uint m);
sbit da_cs=P1^2;//--DA
sbit da_clk=P1^1;
sbit da_in=P1^0;
sbit ad_clk=P1^4;//--AD
sbit ad_out=P1^5;
sbit ad_cs=P1^6;

void TimeSvr(void) interrupt 1
{
    TH0=0X3C;
    TL0=0XB0;
    T0=~T0;
}

void main()
{ 
  TMOD=0X01;
  TH0=0X3C;
  TL0=0XB0;
  TR0=1;
  ET0=1;
  
  IT1=1;
  EX1=1;
  EA=1;
  tishi=0;
  t=0;
  shuzhi=0;
  qiehuan1=1;//提示界面与预置值界面的切换
  qiehuan2=1;//预置值的增或减
  LCMInit();
  cls();
reset:  
  cls();
  
  for(i=0;i<5;i++)
  {  
     shuzu[i]=0;
  }
  while(1)
  {
       shortdelay(1000);
       while(qiehuan1)
       {
           dprintf(0,0,"请输入预置值");
           dprintf(0,1,"要求:单位mA");
           //dprintf(4,2,"10的整倍");
           dprintf(4,2,"且不大于1000");
           dprintf(0,3,"B递增C递减D返回");
       }  
       cls();
       dprintf(0,0,"预置值:");
       while(tishi1)//tishi标示每次中断,tishi1标示置数完毕
       {   
           if(tishi&&t<4)
           { 
               shuzu[t]=keybuf+48;
               t++;
               dprintf(7,0,shuzu);
           }
       tishi=0;
       shortdelay(100);
       }
       while(zhuanhuan)  
       {
           for(j=0;j<t;j++)//由数组转换成数值
           {
               shuzhi=shuzhi+(shuzu[j]-48)*qz[t-1-j];
           }
           zhuanhuan=0;
       } 
       while(queren==1)  //确认键A     
       {  
           tishi=0;
           if(keybuf==11)//递增
           {
               shuzhi=shuzhi+10;
               qiehuan2=1;
           }
           if(keybuf==12)//递减
           {
                shuzhi=shuzhi-10;
                qiehuan2=1;
                cls();
            }
            shuzhi1=(shuzhi*33)/40;//shuzhi不变以便比较,shuzhi1改变以便补偿
            //while((shuzhi%10==0)&&qiehuan2&&shuzhi<=1000)
            while(qiehuan2&&shuzhi<=1000)
            {
                 zjxianshi(shuzhi);
                 dprintf(0,0,"预置值:");
                 dprintf(7,0,gewei1);
                 da_0(shuzhi1);
                 shortdelay(10);
                 shice=ad_0();//shice由模数直接得到
                 shortdelay(10);
                 shice=shice+ad_0();
                 shortdelay(10);
                 shice=shice+ad_0();
                 shice=shice/3;//求三次的平均值
                 //zjxianshi(shuzhi);
                 //dprintf(0,0,"预置值:");
                 //dprintf(7,0,gewei1);
                 //scxianshi(shice);
                 //dprintf(0,1,"实测值:");
                 //dprintf(7,1,gewei);
                 
                 if(shuzhi>shice)
                 {  
                     shortdelay(10);
                     shuzhi1++;
                     da_0(shuzhi1);
                 }
                 if(shuzhi<shice)
                 {
                    shortdelay(10);
                    shuzhi1--;
                    da_0(shuzhi1);
                 }
                if(shuzhi==shice);
                {   
                    shortdelay(10);
                    da_0(shuzhi1); 
                }
                scxianshi(shice);
                dprintf(0,1,"实测值:");
                dprintf(7,1,gewei);     
                
           }
           //if(shuzhi%10!=0||shuzhi>1000)
           if(shuzhi>1000)
           {
               for(i=0;i<5;i++)
                  shuzu[i]=0;
               t=0;
               shuzhi=0;
               cls();
               dprintf(0,1,"要求不符");
               shortdelay(2000);
               queren=20;
               qiehuan1=1;
            }
           if(keybuf==13)
           {
               
               t=0;
               shuzhi=0;
               goto reset;
            }
            
       }
       
   }
    
}


void service_int1() interrupt 2 using 2 //--------  键盘中断1--------
{  
      
      tishi=1;tishi1=1;qiehuan1=0;
      keybuf=key;
      switch(keybuf)
      {
        case 253  :keybuf=0; break;
        case 254  :keybuf=1; break;
        case 255  :keybuf=2; break;
        case 240  :keybuf=3; break;
        case 243  :keybuf=4; break;
        case 246  :keybuf=5; break;
        case 249  :keybuf=6; break;
        case 252  :keybuf=7; break;
        case 242  :keybuf=8; break;
        case 245  :keybuf=9; break;
        case 248:keybuf=10;break;
        case 250:keybuf=11;break; 
        case 241:keybuf=12;break;
        case 244:keybuf=13;break;
        case 247:keybuf=14;break;
        case 251:keybuf=15;break;
       }
      if(keybuf==10)//确认键A
       { 
          tishi1=0;//跳出输入预置值循环
          queren=1;
          zhuanhuan=1;
          qiehuan2=1;
       }
       if(keybuf==11)//加10mA键
       {
          queren=1;
          qiehuan2=0;
       }
       if(keybuf==12)//减10mA键
       {
          queren=1;
          qiehuan2=0;
       }
       if(keybuf==13)//复位键
       {
         
         qiehuan2=0;
        
         qiehuan1=1;
         
         
       }
        
       //while(INT1==0);
       //EA=1;
       do{}while(INT1==1);
       
}
void scxianshi(uint m)//实测显示
{
    uchar n;
    for(n=0;n<4;n++)
       gewei[n]=0;
    if(m>=1000)
    {
       gewei[0]=m/1000+48;
        gewei[1]=m%1000/100+48;
        gewei[2]=m%1000%100/10+48;
        gewei[3]=m%1000%100%10+48;
    }
    if(m<1000&&m>=100)
    {
       gewei[0]=m/100+48;
       gewei[1]=m%100/10+48;
       gewei[2]=m%100%10+48;
       gewei[3]=0;
    }
    if(m<100&&m>=10)
    { 
       gewei[0]=m/10+48;
       gewei[1]=m%10+48;
       gewei[3]=0;
       gewei[4]=0;
    }
    if(m<10)
    {
      gewei[0]=m+48;
      gewei[1]=0;
      gewei[2]=0;
      gewei[3]=0;
    }
  
  
}

void zjxianshi(uint m)//增减显示
{
     uchar n;
     for(n=0;n<4;n++)
     { 
        shortdelay(10);
        gewei1[n]=0;
     }  
     if(m>=1000)
     {
        gewei1[0]=m/1000+48;
        gewei1[1]=m%1000/100+48;
        gewei1[2]=m%1000%100/10+48;
        gewei1[3]=m%1000%100%10+48;
     }
     if(m<1000&&m>=100)
     {
        gewei1[0]=m/100+48;
        gewei1[1]=m%100/10+48;
        gewei1[2]=m%100%10+48;
        gewei1[3]=0;
     }
     if(m<100&&m>=10)
     { 
        gewei1[0]=m/10+48;
        gewei1[1]=m%10+48;
        gewei1[2]=0;
        gewei1[3]=0;
    }
    if(m<10)
    {
       gewei1[0]=m+48;
       gewei1[1]=0;
       gewei1[2]=0;
       gewei1[3]=0;
    }
  
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -