新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機紅外遙控+步進電機+1602液晶顯示c語言源程序

        單片機紅外遙控+步進電機+1602液晶顯示c語言源程序

        作者: 時間:2012-12-05 來源:網絡 收藏

        這是我做的控制的1602顯示轉速和轉向的c語言原程序,已經調試成功!有些模塊是以前做其他實驗時做的,現在是直接調用的,包括顯示技術,TC9012紅外解碼,然后就是四相的控制程序了,我是把這些東西結合起來。對這個東西有興趣的或者要做畢業設計的可以看看啊,不懂的請上論壇http://www.51hei.com/bbs/ 公開討論,我會給大家做出詳細的解答。

        #include AT89X51.h>

        #includestdio.h>
        #includeintrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        static unsigned int count; //計數
        unsigned int hour,minute,second,count;

        sbit RS = P2^3;//Pin4
        sbit RW = P2^2; //Pin5
        sbit E = P2^4;//Pin6

        #define Data P0 //數據端口
        static int step_index; //步進索引數,值為0-7
        bit k=0; //紅外解碼判斷標志位,為0則為有效信號,為1則為無效
        uchar n=0; //用來控制外部中斷
        static bit turn; //轉動方向
        static bit stop_flag; //步進電機停止標志
        static int speedlevel; //步進電機轉速參數,數值越大速度越慢,最小值為1,速度最快
        static int spcount; //步進電機轉速參數計數
        void delay(unsigned int endcount); //延時函數,延時為endcount*0.5毫秒
        void gorun(); //步進電機控制步進函數
        uchar data date[4]; //date數組為存放地址原碼,反碼,數據原碼,反碼
        char data Test1[]=" ";
        #define IR_RE P3_2
        void DelayUs(unsigned char us)//delay us
        {
        unsigned char uscnt;
        uscnt=us>>1;/* Crystal frequency in 12MHz*/
        while(--uscnt);
        }
        /*****************************************************/
        void DelayMs(unsigned char ms)//delay Ms
        {
        while(--ms)
        {
        DelayUs(250);
        DelayUs(250);
        DelayUs(250);
        DelayUs(250);
        }
        }
        void WriteCommand(unsigned char c)
        {
        DelayMs(5);//short delay before operation
        E=0;
        RS=0;
        RW=0;
        _nop_();
        E=1;
        Data=c;
        E=0;
        }
        /******************************************************/
        void WriteData(unsigned char c)
        {
        DelayMs(5); //short delay before operation
        E=0;
        RS=1;
        RW=0;
        _nop_();
        E=1;
        Data=c;
        E=0;
        RS=0;
        }
        /***********http://www.51hei.com原創作品******************/
        void ShowChar(unsigned char pos,unsigned char c)
        {
        unsigned char p;
        if (pos>=0x10)
        p=pos+0xb0; //是第二行則命令代碼高4位為0xc
        else
        p=pos+0x80; //是第二行則命令代碼高4位為0x8
        WriteCommand (p);//write command
        WriteData (c); //write data
        }
        /********************************************************/
        void ShowString (unsigned char line,char *ptr)
        {
        unsigned char l,i;
        l=line4;
        for (i=0;i16;i++)
        ShowChar (l++,*(ptr+i));//循環顯示16個字符
        }
        /*******************************************************/
        void InitLcd()
        {
        DelayMs(15);
        WriteCommand(0x38); //display mode
        WriteCommand(0x38); //display mode
        WriteCommand(0x38); //display mode
        WriteCommand(0x06); //顯示光標移動位置
        WriteCommand(0x0c); //顯示開及光標設置
        WriteCommand(0x01); //顯示清屏

        }

        /*--------------------------延時1ms程子程序-----------------------*/
        delay1000()
        {
        uint i,j;
        for(i=0;i1;i++)
        for(j=0;j124;j++)
        ;
        }

        /*---------------------------延時882us子程序-----------------------*/

        delay882()
        {
        uint i,j;
        for(i=0;i1;i++)
        for(j=0;j109;j++)
        ;
        }

        /*--------------------------延時2400ms程子程序-----------------------*/

        delay2400()
        {
        uint i,j;
        for(i=0;i3;i++)
        for(j=0;j99;j++)
        ;
        }
        void IR_decode()
        {
        uchar i,j;
        while(IR_RE==0);
        delay2400();
        if(IR_RE==1) //延時2.4ms后如果是高電平則是新碼
        {
        delay2400(); //延時4.8ms避開4.5ms的高電平
        for(i=0;i4;i++)
        {
        for(j=0;j8;j++)
        {
        while(IR_RE==0); //等待地址碼第1位高電平到來
        delay882(); //延時882ms判斷此時引腳電平
        ///CY=IR_RE;
        if(IR_RE==0)
        {
        date[i]>>=1;
        date[i]=date[i]0x7f;
        }
        else if(IR_RE==1)
        {
        delay1000();
        date[i]>>=1;
        date[i]=date[i]|0x80;
        }
        } //1位數據接收結束
        } //32位二進制碼接收結束

        }
        if (date[2]==0x16)
        TR0 = 0;
        else if(date[2]==0x14)
        {TR0 = 1;
        }
        else if(date[2]==0x10)
        {if (speedlevel>1)
        speedlevel--;
        else
        speedlevel=1;
        }
        else if(date[2]==0x1A)
        {if(speedlevel5)
        speedlevel++;
        else
        speedlevel=5;
        }
        else if(date[2]==0x11)
        turn=~turn;

        紅外遙控器相關文章:紅外遙控器原理

        51單片機相關文章:51單片機教程


        c語言相關文章:c語言教程



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 太谷县| 郧西县| 四会市| 江西省| 天水市| 喜德县| 丰宁| 建水县| 凤台县| 平舆县| 叙永县| 东乡族自治县| 商河县| 海晏县| 兰西县| 安丘市| 旌德县| 遂昌县| 宿迁市| 清苑县| 秀山| 乐昌市| 烟台市| 旬阳县| 徐闻县| 北川| 西华县| 桃园县| 尤溪县| 弥渡县| 巴彦淖尔市| 祁连县| 宁安市| 南雄市| 浪卡子县| 建湖县| 桃江县| 射洪县| 九寨沟县| 鸡泽县| 合肥市|