新聞中心

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

        c51寫的測轉速源程序

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

        #include
        #include
        #include

        本文引用地址:http://www.104case.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中讀取一個字節數據
        voidx24c02_write(ucharaddr,ucharinfo);//向24c02的addr地址中寫入一字節數據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非設置狀態
        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非設置狀態
        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非設置狀態
        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;//非保護狀態
        }
        //////
        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;//中斷開//設置狀態禁止所有外部中斷
        }
        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();
        }
        //動態顯示
        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;
        }

        //閃爍動態顯示有效
        voiden_dsp(void)
        {disp_j=0;
        disp_i[0]=0x0;//顯示閃動標志0顯示
        disp_i[1]=0x0;
        disp_i[2]=0x0;
        disp_i[3]=0x0;
        }
        //閃爍動態顯示
        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)
        {
        //設定狀態時如果有鍵按下就不閃爍
        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)
        {//保存數據退出設置狀態
        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;//如果設定狀態允許報警標志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觸發方式
        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測轉

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 外汇| 南和县| 瑞金市| 五台县| 青河县| 宁晋县| 监利县| 汶川县| 纳雍县| 恭城| 安阳县| 永宁县| 乐东| 旬阳县| 锦屏县| 四川省| 德州市| 淄博市| 郑州市| 兴隆县| 北辰区| 温宿县| 夹江县| 长丰县| 龙口市| 长白| 海安县| 呈贡县| 嘉善县| 贞丰县| 抚松县| 隆安县| 南宫市| 湘潭县| 略阳县| 汽车| 伊金霍洛旗| 蓝山县| 拉孜县| 宜良县| 甘德县|