新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機加HC—SR04超聲波測距儀用LCD1602顯示

        51單片機加HC—SR04超聲波測距儀用LCD1602顯示

        作者: 時間:2016-12-02 來源:網絡 收藏
        #include

        #include
        #define uchar unsigned char
        #define uint unsigned int
        sbit lcden=P1^2;
        sbit lcdrs=P1^0;
        sbit lcdrw=P1^1;
        sbit RX=P2^1;
        sbit TX=P2^0;

        uint time=0;
        unsignedlongS=0;
        bitflag=0;
        uchar disdat[4]={ 0,0,0,0,};
        void delay(uint z) //延時子程序
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }
        void write_com(uchar com)//定義一個帶參數的寫命令子程序
        {
        lcdrs=0; //1602的rs為0時,接收命令,為1時接收數據
        P0=com;//把void write_com(uchar com)中的COM中的數據給P0口
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
        delay(5);
        }
        void write_shu(uchar shu)//定義一個帶參數的寫數據子程序
        {
        lcdrs=1; //1602的rs為0時,接收命令,為1時接收數據
        P0=shu;//把void write_shu(uchar shu)中的COM中的數據給P0口
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
        delay(5);
        }
        void write_1602(uchar add,uchar dat)
        {
        write_com(0x80+0x40+add);
        write_shu(dat);
        }

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

        void zifuchuan(uchar *ch)
        {
        while(*ch!=0)
        write_shu(*ch++);
        delay(20);
        }
        void init()//定義一個初始化子程序
        {
        lcden=0;
        lcdrw=0;
        write_com(0x38);//調用 write_com子程序并把0x38賦給P0口,顯示模式打開
        delay(2);
        write_com(0x0c);//調用 write_com子程序并把“開顯示,顯示光標,光標不閃爍”指令碼賦給P0口
        write_com(0x06);//調用 write_com子程序并把“地址指針加1,整屏不移動”指令碼賦給P0口
        write_com(0x80);//數據指針初始化,讓指針指向最左端,顯示從第一行開始
        write_com(0x01);//調用 write_com子程序并把"清零指"令碼賦給P0口
        zifuchuan("HHSY Zhoujiaoshi");

        }

        /********************************************************/
        void Conut()
        {
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;

        //S=(time*1.7)/100;
        S=time/58; //算出來是CM
        disdat[0]=S%1000/100;
        disdat[1]=S%1000%100/10;
        disdat[2]=S%1000%10 %10;
        write_1602(1, disdat[0]+0x30);
        write_1602(2, disdat[1]+0x30);
        write_1602(3, disdat[2]+0x30);
        write_1602(4,.);
        write_1602(5, disdat[3]+0x30);
        write_1602(6, C);
        write_1602(7, m);

        }
        /********************************************************/
        void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
        {
        flag=1;//中斷溢出標志
        }
        /********************************************************/
        void StartModule() //啟動模塊
        {
        TX=1; //啟動一次模塊
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_();
        TX=0;
        }
        /*********************************************************/
        void main(void)
        {
        delay(400); //啟動等待,等LCD講入工作狀態
        init(); //LCD初始化
        TMOD=0x01;//設T0為方式1,GATE=1;
        TH0=0;
        TL0=0;
        ET0=1; //允許T0中斷
        EA=1;//開啟總中斷

        while(1)
        {
        StartModule();
        while(!RX); //當RX為零時等待
        TR0=1; //開啟計數
        while(RX); //當RX為1計數并等待
        TR0=0; //關閉計數
        Conut(); //計算
        delay(20);

        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 包头市| 乌兰浩特市| 邹平县| 彰武县| 社旗县| 昆明市| 公安县| 措勤县| 米泉市| 镶黄旗| 福清市| 金阳县| 广元市| 麻江县| 玉门市| 元氏县| 沛县| 凭祥市| 南溪县| 五指山市| 耒阳市| 平顶山市| 平定县| 特克斯县| 商都县| 盐津县| 宁化县| 潞城市| 德庆县| 彩票| 灵山县| 平遥县| 沾化县| 安多县| 娄烦县| 宁安市| 无棣县| 淮阳县| 西安市| 甘孜| 盐池县|