• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    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 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 隆尧县| 正安县| 通化市| 泰来县| 芜湖县| 锡林浩特市| 山东| 台安县| 衡阳市| 浮山县| 日土县| 清镇市| 鱼台县| 诸城市| 德安县| 海伦市| 永丰县| 盐城市| 仙桃市| 蒙阴县| 永靖县| 台安县| 博客| 依安县| 洛宁县| 剑河县| 红河县| 保德县| 远安县| 麟游县| 通州区| 华安县| 晋宁县| 迭部县| 麦盖提县| 罗田县| 佳木斯市| 西和县| 吴川市| 会泽县| 乌鲁木齐市|