<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > c51寫的測轉速源程序

          c51寫的測轉速源程序

          作者: 時間:2016-11-18 來源:網絡 收藏
          以前寫的c51單片機測轉速源程序,比較久了,當時電路板有數碼顯示,代碼不是最優(yōu)化的,不過朋友可以看看其中的測速代碼,當時費了點心思寫的,24c02的讀寫代碼,貼出來給朋友看看,寫的很差勁,高手就不要見笑了。

          #include
          #include
          #include

          本文引用地址:http://www.ex-cimer.com/article/201611/315930.htm

          #define ucharunsignedchar
          #defineuintunsignedint
          #defineulongunsignedlong

          sbitkey0=P3^0;//按鍵0
          sbitkey1=P3^1;//按鍵1
          sbitkey2=P3^3;//按鍵2
          sbitkey3=P3^4;//按鍵3
          sbitled0=P1^0;//數碼管0
          sbitled1=P1^1;//數碼管1
          sbitled2=P1^2;//數碼管2
          sbitled3=P1^3;//數碼管3
          sbitscl=P1^6;//24c02scl端
          sbitsda=P1^5;//24c02scd端
          sbitout=P1^7;//輸出端
          sbitin=P3^2;//輸入

          codeucharascled[12]={
          0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4
          0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9
          0x71,0x00};//F,''

          /*****************函數列表**********************/
          ucharx24c02_read(ucharaddr);//從24c02的地址addr中讀取一個字節(jié)數據
          voidx24c02_write(ucharaddr,ucharinfo);//向24c02的addr地址中寫入一字節(jié)數據info
          voidx24c02_init();//24c02初始化子程序
          voiddelay(ucharx);//延時子程序ms
          voidflash();//24c02延時子程序nop
          voidstart();//24c02ic開始
          voidstop();//24c02ic停止
          voidack();//24c02ic應答
          voidnack();//24c02ic不應答
          voidwritex(ucharj);//24c02ic寫1byte數據
          voiddsp();//顯示子程序
          voiddelay(uchari);//us延時
          voiddelay1(uchari);//us延時
          ucharreadx();//24c02ic讀1byte數據
          /****************全局變量定義*******************/
          ucharktemp;
          uchardisp[4];

          uintcount;//預設報警值
          uintzs;//轉速值
          uinttime0;//
          uinttime1;//記時器
          bitbegin1;//T1開始啟動標志
          ucharltj=1;//高低速
          uintjs;//脈沖計數器
          ulongt0;
          ulongt1;

          bitkey_set;//設置標志
          uchardisp_i[4];//顯示閃動標志
          uintdisp_c;//閃動顯示計數器//借用time0
          uintdisp_j;//閃動顯示定時//借用time1
          bitss=0;//閃動標志
          uintbj;//報警輸出信號定時
          biten_bj=0;//允許報警標志
          bitbjing=0;//報警中

          //m:菜單級數mi:參數標號bh:檢測保護時間1-10
          ucharbh=0;
          ucharm=0,mi=0;//借用zs,js
          ucharbhtm=0;//保護檢測
          //bitcmi=0;//參數設置改變標志//借用bjing
          /**********************************************/

          voidint_ex0()interrupt0using0
          {
          /*外部中斷0*/
          delay1(20);
          if(key_set==0){///0非設置狀態(tài)
          if(in==0){
          if(ltj==1)
          {
          js++;
          EA=0;
          TR0=0;
          TL0=0xaf;//50ms
          TH0=0x3c;/*計數初值重裝*/
          if(begin1==0)
          {//開始記數
          begin1=1;
          js=0;
          TR1=0;
          TL1=0xaf;//50ms
          TH1=0x3c;/*計數初值重裝*/
          TR1=1;/*啟動T1*/
          }
          /*啟動T0*/
          TR0=1;
          time0=0;
          EA=1;
          }
          else
          {
          if(begin1==0)
          {
          begin1=1;
          EA=0;
          TR0=0;
          zs=0;
          /*啟動T0*/
          TL0=0xaf;//50ms
          TH0=0x3c;/*計數初值重裝*/
          TR0=1;
          time0=0;
          EA=1;
          }
          else
          {
          EA=0;
          TR0=0;
          begin1=0;
          if(time0==0)
          {
          zs=0;
          }
          else
          {//計算轉速
          t0=(time0*50000+(TH0*256+TL0)-0x3caf);
          if(t0>0){zs=60000000/t0;}
          }
          if(zs{
          if(en_bj==1)
          {
          out=1;
          bjing=1;//報警
          }
          }
          disp[3]=(zs%10000)/1000;//顯示轉速
          disp[2]=(zs%1000)/100;
          disp[1]=(zs%100)/10;
          disp[0]=zs%10;
          TL0=0xaf;//50ms
          TH0=0x3c;/*計數初值重裝*/
          TR0=1;
          time0=0;
          EA=1;
          }
          }
          }
          //
          }///0
          }
          voidtimer0(void)interrupt1using0//記時定時中斷
          {uchart;
          //////
          if(key_set==0){///0非設置狀態(tài)
          time0++;
          TL0=0xaf;//50ms
          TH0=0x3c;/*計數初值重裝*/
          TR0=1;
          /*啟動T1*/
          t=time0%20;
          if(t==0){en_bj=0;}
          if(time0>1200)//超時
          {
          time0=0;
          disp[3]=0;
          disp[2]=0;
          disp[1]=0;
          disp[0]=0;
          zs=0;
          if(en_bj==1)
          {
          out=1;
          bjing=1;//報警
          }
          }
          }///0
          }
          voidtimer1(void)interrupt3using0//1s記時定時中斷
          {
          /*T1中斷服務程序入口*/
          //////
          if(key_set==0){///0非設置狀態(tài)
          time1++;
          if(time1==20)//1s
          {EA=0;
          TR1=0;
          //計算轉速
          ///////////////////
          t0=time0*50000+(TH0*256+TL0)-0x3caf;
          t1=1000000-t0;
          t0=60*js*t0;
          zs=60*js+t0/t1;
          if(zs>6000){zs=0;}
          if(zs{
          if(en_bj==1)
          {
          if(bhtm>=bh)
          {
          out=1;
          bjing=1;//報警
          }
          bhtm++;
          }
          }
          else
          {
          bhtm=0;
          }
          if(zs==0)
          {///////
          ///////
          disp[3]=0;
          disp[2]=0;
          disp[1]=0;
          disp[0]=0;
          }
          else
          {
          disp[3]=zs/1000;//顯示轉速
          disp[2]=(zs%1000)/100;
          disp[1]=(zs%100)/10;
          disp[0]=zs%10;
          }
          begin1=0;
          js=0;
          time0=0;
          time1=0;
          en_bj=0;//非保護狀態(tài)
          }
          //////
          TL1=0xaf;//50ms
          TH1=0x3c;/*計數初值重裝*/
          TR1=1;/*啟動T1*/
          EA=1;
          }///0
          }
          voiddelay(uchari)
          {ucharj;
          for(j=0;j<=i;j++);
          }

          voiddelay1(uchari)
          {ucharj;
          for(j=0;j<=i;j++);
          }

          voidflash()
          {
          _nop_();
          _nop_();
          _nop_();
          //_nop_();
          //_nop_();
          }
          voidx24c02_init()
          {
          scl=1;
          flash();
          sda=1;
          flash();
          }
          voidstart()
          {
          sda=1;
          flash();
          scl=1;
          flash();
          sda=0;
          flash();
          scl=0;
          flash();
          }
          voidstop()
          {
          sda=0;
          flash();
          scl=1;
          flash();
          sda=1;
          flash();
          }
          voidack()
          {
          sda=0;
          flash();
          scl=1;
          flash();
          scl=0;
          flash();
          }
          voidnack()
          {
          sda=1;
          flash();
          scl=1;
          flash();
          scl=0;
          flash();
          }
          voidwritex(ucharj)
          {
          uchari,temp;
          temp=j;
          for(i=0;i<8;i++){
          temp=temp<<1;
          scl=0;
          flash();
          sda=CY;
          flash();
          scl=1;
          flash();
          }
          scl=0;
          flash();
          sda=1;
          flash();
          }
          ucharreadx()
          {
          uchari,j,k=0;
          scl=0;
          flash();
          sda=1;
          for(i=0;i<8;i++){
          flash();
          scl=1;
          flash();
          if(sda==1)j=1;
          elsej=0;
          k=(k<<1)│j;
          scl=0;
          flash();
          }
          return(k);
          }

          ucharx24c02_read(ucharaddr)
          {
          uchari;
          start();
          writex(0xa0);
          ack();
          writex(addr);
          ack();
          start();
          writex(0xa1);
          ack();
          i=readx();
          nack();
          stop();
          delay(10);
          return(i);
          }
          voidx24c02_write(ucharaddr,ucharinfo)
          {
          //EA=0;//中斷總禁止
          start();
          writex(0xa0);
          ack();
          writex(addr);
          ack();
          writex(info);
          ack();
          stop();
          //EA=1;//中斷開//設置狀態(tài)禁止所有外部中斷
          }
          voidgetdate(void)
          {ucharda5,da4,da3,da2,da1,da0;
          x24c02_init();
          da0=(x24c02_read(0x00)%10);
          da1=(x24c02_read(0x01)%10);
          da2=(x24c02_read(0x02)%10);
          da3=(x24c02_read(0x03)%10);
          da4=(x24c02_read(0x04)%10);
          da5=(x24c02_read(0x05)%10);
          ltj=(x24c02_read(0x06)%10);
          count=da3*1000+da2*100+da1*10+da0;
          bh=da5*10+da4;
          if(bh>99){bh=0;}
          if(count>6000){count=6000;}
          if(ltj>1){ltj=1;}

          }
          voidsavedate(void)
          {ucharda5,da4,da3,da2,da1,da0;
          da5=bh/10;
          da4=bh%10;
          da3=count/1000;
          da2=(count%1000)/100;
          da1=(count%100)/10;
          da0=count%10;
          dsp();
          x24c02_init();
          x24c02_write(0x00,da0);
          x24c02_write(0x00,da0);
          dsp();
          x24c02_write(0x01,da1);
          x24c02_write(0x01,da1);
          dsp();
          x24c02_write(0x02,da2);
          x24c02_write(0x02,da2);
          dsp();
          x24c02_write(0x03,da3);
          x24c02_write(0x03,da3);
          dsp();
          x24c02_write(0x04,da4);
          x24c02_write(0x04,da4);
          dsp();
          x24c02_write(0x05,da5);
          x24c02_write(0x05,da5);
          dsp();
          x24c02_write(0x06,ltj);
          x24c02_write(0x06,ltj);
          dsp();
          }
          //動態(tài)顯示
          voiddsp(void)
          {
          P2=ascled[disp[0]];led0=0;delay(50);led0=1;//led0=0顯示,=1不顯示
          P2=ascled[disp[1]];led1=0;delay(50);led1=1;
          P2=ascled[disp[2]];led2=0;delay(50);led2=1;
          P2=ascled[disp[3]];led3=0;delay(50);led3=1;
          }

          //閃爍動態(tài)顯示有效
          voiden_dsp(void)
          {disp_j=0;
          disp_i[0]=0x0;//顯示閃動標志0顯示
          disp_i[1]=0x0;
          disp_i[2]=0x0;
          disp_i[3]=0x0;
          }
          //閃爍動態(tài)顯示
          voiddsp_flash(void)
          {
          disp_j++;
          if(disp_j>240)
          {disp_j=0;
          disp_i[disp_c]=!(disp_i[disp_c]&0x01);
          }
          P2=ascled[disp[0]];led0=disp_i[0];delay(50);led0=1;//led0=0顯示,=1不顯示
          P2=ascled[disp[1]];led1=disp_i[1];delay(50);led1=1;
          P2=ascled[disp[2]];led2=disp_i[2];delay(50);led2=1;
          P2=ascled[disp[3]];led3=disp_i[3];delay(50);led3=1;
          }

          voiddisplay(void)
          {
          //設定狀態(tài)時如果有鍵按下就不閃爍
          if((ss==0)││(ktemp!=0x1b))
          {
          dsp();
          }
          else
          {
          dsp_flash();
          }
          }

          voidkbscan(void)//鍵盤掃描
          {uchartemp,i;//0
          temp=P3;
          ktemp=temp&0x1b;//檢查key0,key1,key2,key300011011
          if(ktemp!=0x1b)
          {//1
          for(i=0;i<250;i++){display();}
          temp=P3;
          if(ktemp==(temp&ktemp))
          {//2
          //keyval=ktemp;//記錄鍵值
          if(key_set==1)
          {//3
          switch(ktemp){
          case0x1a://key0
          {
          /////////////////
          m++;
          if(m>2){m=1;}
          switch(m){
          case1:////顯示參數名稱
          ss=0;disp_c=0;en_dsp();
          switch(mi){
          case0:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=1;
          dsp();
          break;
          case1:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=2;
          dsp();
          break;
          case2:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間,2顯示高低轉速測量
          disp[2]=11;
          disp[1]=10;
          disp[0]=3;
          dsp();
          break;
          }
          break;
          case2:////顯示參數
          ss=1;en_dsp();
          switch(mi){//顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          case0:
          disp[3]=count/1000;
          disp[2]=(count%1000)/100;
          disp[1]=(count%100)/10;
          disp[0]=count%10;
          for(i=0;i<150;i++){dsp();}
          break;
          case1:
          disp[3]=11;
          disp[2]=11;
          disp[1]=bh/10;
          disp[0]=bh%10;
          for(i=0;i<150;i++){dsp();}
          break;
          case2:
          disp[3]=11;
          disp[2]=11;
          disp[1]=11;
          disp[0]=ltj;
          for(i=0;i<150;i++){dsp();}
          break;
          }
          break;
          }
          /////////////////
          }
          case0x19://key1
          {
          break;
          }
          case0x13://key2
          {
          //閃動位移
          if(ss==1)
          {
          switch(mi){
          case0:
          en_dsp();////預設轉速4位顯示
          disp_c++;
          if(disp_c>3){disp_c=0;}
          break;
          case1:
          en_dsp();////輸出保護時間2位顯示
          disp_c++;
          if(disp_c>1){disp_c=0;}
          break;
          case2:
          break;
          }
          }
          if(m==1)
          {//保存數據退出設置狀態(tài)
          savedate();
          //借用后恢復
          //bjing=0;
          m=0;
          mi=0;
          key_set=0;
          ss=0;
          en_dsp();
          disp[0]=0;
          disp[1]=0;
          disp[2]=0;
          disp[3]=0;
          for(i=0;i<150;i++){dsp();}
          if(ltj==1)
          {
          TMOD=0x11;TL0=0xaf;TH0=0x3c;TL1=0xaf;TH1=0x3c;ET0=1;ET1=1;TR0=1;TR1=1;
          }
          EA=1;//數據保存允許中斷
          }
          break;
          }
          case0x0b://key3
          {
          /////////////////
          if(m==1)
          {disp_c=0;
          mi++;if(mi>2){mi=0;}
          switch(mi){
          case0:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=1;
          dsp();
          break;
          case1:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=2;
          dsp();
          break;
          case2:
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=3;
          dsp();
          break;
          }
          }
          else
          {
          m=0;
          switch(mi){
          case0:
          disp[disp_c]++;
          if(disp[disp_c]>9){disp[disp_c]=0;}
          if((disp[3]*1000+disp[2]*100+disp[1]*10+disp[0])>6000)
          {//如果超出設定范圍
          disp[3]=0;disp[2]=0;disp[1]=0;disp[0]=0;
          }
          count=disp[3]*1000+disp[2]*100+disp[1]*10+disp[0];
          dsp_flash();
          break;
          case1:
          disp[disp_c]++;
          if(disp[disp_c]>9){disp[disp_c]=0;}
          bh=disp[1]*10+disp[0];
          dsp_flash();
          break;
          case2:
          disp[disp_c]++;
          if(disp[disp_c]>1){disp[disp_c]=0;}
          ltj=disp[0];
          dsp_flash();
          break;
          }
          }
          break;
          }
          }
          }//3
          else
          {//4
          switch(ktemp){
          case0x1a://key0
          {
          ////////////////
          //禁止測轉速
          EA=0;
          key_set=1;
          en_bj=0;//如果設定狀態(tài)允許報警標志0
          out=0;//
          /////
          //bjing=0;
          ///disp_c=0;//time0
          /////
          m=1;
          disp[3]=11;////顯示設定參數mi=0顯示預設報警值,1顯示保護檢測時間
          disp[2]=11;
          disp[1]=10;
          disp[0]=1;
          for(i=0;i<150;i++){dsp();}

          break;
          }
          case0x19://key1
          {
          //允許報警
          en_bj=1;
          break;
          }
          }
          }//4
          }//2
          }//1
          }//0

          main()
          {uchari;
          out=0;
          key_set=0;
          disp[0]=0;
          disp[1]=0;
          disp[2]=0;
          disp[3]=0;
          for(i=0;i<250;i++)display();

          getdate();
          en_dsp();
          //////
          time0=0;time1=0;zs=0;bj=0;js=0;begin1=0;bjing=0;
          EA=0;EX0=1;IT0=1;PT1=1;//CPU關中斷,INT0請求中斷,設定INT0觸發(fā)方式
          if(ltj==1)
          {
          TMOD=0x11;TL0=0xaf;TH0=0x3c;TL1=0xaf;TH1=0x3c;ET0=1;ET1=1;TR0=1;TR1=1;/*50ms,T1T0工作在定時器方式1,T1開中斷,啟動T1*/
          }
          else
          {
          TMOD=0x11;TL0=0xaf;TH0=0x3c;ET0=1;TR0=1;
          }
          EA=1;
          //////
          begin:
          if(bjing==1)
          {
          bj++;
          if(bj>500)
          {
          bjing=0;out=0;//清除報警
          bj=0;bhtm=0;
          }

          }
          else
          {
          bj=0;
          }
          display();
          kbscan();
          gotobegin;
          }



          關鍵詞: c51測轉

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();