新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機 液體點滴控制

        單片機 液體點滴控制

        作者: 時間:2016-11-24 來源:網絡 收藏
        //==============================200700821=================//

        //====================從機滴速測量========================//
        #include
        //====================數據類型定義========================//
        #defineUchar unsigned char
        #define Uint unsigned int
        //====================常量定義============================//
        Uchar t;
        Uchar p;
        Uchar m;
        int time; //ms為單位

        本文引用地址:http://www.104case.com/article/201611/320794.htm

        //=====================LCD1602變量定義====================//
        char xdata Lcd1602CmdPort _at_ 0xf9fc;//E=1 RS=0 RW=0 寫命令
        char xdata Lcd1602WdataPort _at_ 0xf9fd; //E=1 RS=1 RW=0 寫
        char xdata Lcd1602StatusPort _at_ 0xf9fe; //E=1 RS=0 RW=1
        #define Busy0x80 // 忙判別位
        static unsigned char ucLcdPosX; //當前顯示指針
        static unsigned char ucLcdPosY;
        //=====================LCD1602函數定義====================//
        extern void LcdWriteData( char dataW ); //LCD寫數據
        extern void LcdWriteCommand( Uchar CMD,Uchar AttribC ); //LCD寫命令
        extern void LcdReset( void );
        extern void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
        void disp_v(void); //顯示速度函數
        //=====================延時函數定義=======================//
        extern void Delay1000Ms(void);
        extern void Delay400Ms(void);
        extern void Delay5Ms(void);
        void delay(Uint m);
        //======================滴速變量定義======================//
        Uchar set_v; //設定的速度
        Uchar real_v; //實際速度
        //======================中斷初始化函數定義================//
        void int_init(void);
        //=======================步進電機變量定義=================//
        Uchar code FFW[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
        Uchar code REV[8]={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80};
        sbit K1 = P1^7; //A
        sbit K2 = P1^6; //B
        sbit K3 = P1^5; //C
        sbit K4 = P1^4; //D
        //=======================步進電機函數定義=================//
        void motor_ffw(void);//正轉
        void motor_rev(void);//反轉
        void control(void); //調節滴速
        //===================LCD1602函數說明======================//

        /*=======================================================
        顯示光標定位4行
        =======================================================*/

        void LocateXY( char posx,char posy) {

        Uchar temp;

        temp = posx & 0xf;
        posy &= 0x03;
        switch ( posy)
        {
        case 0:;
        break;
        case 1:temp |= 0x40;
        break;
        default:;
        }
        temp |= 0x80;
        LcdWriteCommand(temp,0);
        }
        /*=======================================================
        按指定位置顯示數出一個字符
        =======================================================*/
        void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

        LocateXY( x, y );// 定位顯示地址
        LcdWriteData( Wdata );// 寫字符
        }

        /*=======================================================
        初始化程序, 必須按照產品資料介紹的初始化過程進行
        =======================================================*/
        void LcdReset( void ) {

        LcdWriteCommand( 0x38, 0);// 顯示模式設置(不檢測忙信號)
        Delay5Ms();
        LcdWriteCommand( 0x38, 0);// 共三次
        Delay5Ms();
        LcdWriteCommand( 0x38, 0);
        Delay5Ms();

        LcdWriteCommand( 0x38, 1);// 顯示模式設置(以后均檢測忙信號 參數--"1")
        LcdWriteCommand( 0x08, 1);// 顯示關閉
        LcdWriteCommand( 0x01, 1);// 顯示清屏
        LcdWriteCommand( 0x06, 1);// 顯示光標移動設置
        LcdWriteCommand( 0x0c, 1);// 顯示開及光標設置
        }

        /*=======================================================
        寫控制字符子程序: E=1 RS=0 RW=0
        =======================================================*/
        void LcdWriteCommand( Uchar CMD,Uchar AttribC )
        {
        if (AttribC)
        {
        P0=0xff;
        while( Lcd1602StatusPort & Busy );// 檢測忙信號?
        }
        Lcd1602CmdPort = CMD;
        }

        /*=======================================================
        當前位置寫字符子程序: E =1 RS=1 RW=0
        =======================================================*/
        void LcdWriteData( char dataW )
        {
        while( Lcd1602StatusPort & Busy );// 檢測忙信號

        Lcd1602WdataPort = dataW;
        }
        //=====================延時函數說明==========================//
        // 短延時
        void Delay5Ms(void)
        {
        Uint i = 5552;
        while(i--);
        }

        //長延時
        void Delay400Ms(void)
        {
        Uchar i = 5;
        Uint j;
        while(i--)
        {

        j=1817; //100Ms
        while(j--);
        };
        }
        //更長延時
        void Delay1000Ms(void)
        {
        Uchar i = 5;
        Uint j;
        while(i--)
        {
        j=18172;

        while(j--);
        };
        }
        void delay(Uint m)
        {
        Uint k;
        while(m--)
        {
        for(k=0; k<125; k++)
        { }
        }
        }
        //==================中斷初始化函數說明====================//
        void int_init(void)
        {EA=1;
        EX1=1;
        EX0=1;
        ET1=1;

        }
        //===================外部中斷0函數說明====================//
        void high(void) interrupt 0 using 0
        {
        EA=0;
        DispOneChar(8,0,E);
        EA=1;
        }
        //===================外部中斷1函數說明====================//
        void count(void) interrupt 2 using 1
        {
        EX1=0;
        while (INT1==0);


        m++;
        if (p==3)
        {
        TR1=0;
        time=(TH1*256+TL1-5536)/1000+60*t;
        real_v=60000/(time/3);
        t=0;
        p=0;
        time=0;

        }
        if(p<3&&p!=0)
        {
        p++;

        }
        if (p==0)
        {
        t=0;
        TH1=0x15;
        TL1=0x9f;
        TR1=1;
        p++;

        }
        }
        //====================定時器1中斷函數說明=================//
        void get_time(void) interrupt 3 using 3
        {
        TR1=0;
        t++;
        if(t%4==0)
        EX1=1;
        TH1=0x15;
        TL1=0x9f;
        TR1=1;
        }

        //=======================顯示速度函數說明=================//
        void disp_v(void)
        {
        Uchar i;
        Uchar v_real[16]="realspeed: /m";
        v_real[10]=real_v/100+0x30;
        v_real[11]=(real_v%100)/10+0x30;
        v_real[12]=real_v%10+0x30;
        for(i=0;i<15;i++)
        {
        DispOneChar(i,0,v_real[i]);
        }
        }
        //======================步進電機函數說明==================//
        /********************************************************/
        /*
        /*步進電機正轉
        /*
        /********************************************************/
        void motor_ffw()
        {
        Uchar i;


        for (i=0; i<8; i++) //一個周期轉7.2度
        {
        P1 = FFW[ i ]; //取數據
        delay(15); //調節轉速
        }

        }
        /********************************************************/
        /*
        /*步進電機反轉
        /*
        /********************************************************/
        void motor_rev()
        {
        Uchar i;

        for (i=0; i<8; i++) //一個周期轉7.2度
        {
        P1 = REV[ i ]; //取數據
        delay(15); //調節轉速
        }

        }
        //====================調節滴速函數說明====================//
        void control(void)
        {char count;


        count=set_v-real_v;
        if (count>=5)
        {
        motor_rev();
        }
        else if (count<=-5)
        {
        motor_ffw();
        }
        else
        {
        EX1=0;
        ET1=0;
        Delay1000Ms();
        Delay1000Ms();
        EX1=1;
        ET1=1;
        }
        }
        //======================主函數說明========================//
        main()
        {
        TMOD=0x10;
        IT1=0;
        set_v=100;
        p=0;
        t=0;
        m=0;
        time=0;
        real_v=0;
        LcdReset();
        Delay400Ms();
        int_init();
        while(1)
        {
        disp_v();
        DispOneChar(4,1,m/100+48);
        DispOneChar(5,1,m%100/10+48);
        DispOneChar(6,1,m%10+48);
        if(real_v)
        control();
        else
        motor_ffw();

        }

        }

        //========================================================//



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西平县| 新乐市| 营口市| 聂拉木县| 景德镇市| 玉门市| 鄯善县| 黄骅市| 台前县| 阳信县| 富锦市| 灯塔市| 鄯善县| 乐业县| 滨海县| 河北区| 兴仁县| 灵川县| 西丰县| 尼玛县| 甘南县| 天柱县| 方山县| 巴塘县| 娄烦县| 睢宁县| 施甸县| 漾濞| 武清区| 宁波市| 茌平县| 安龙县| 威信县| 宣汉县| 津市市| 万载县| 安图县| 苗栗县| 桓台县| 商都县| 新龙县|