新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LCD1602+ADC0832數字電壓表(asm/c51)

        LCD1602+ADC0832數字電壓表(asm/c51)

        作者: 時間:2016-11-10 來源:網絡 收藏
        ..................................LCD1602+ADC0832數字電壓表(已調試通過).................................

        rs bit P2.4

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

        rw bit P2.5
        e bit P2.6

        clk bit P1.3
        do bit P1.4
        di bit P1.5
        cs bit P1.6

        com data 60h
        dat data 61h

        adcb data 62h
        adcs data 63h
        adcg data 64h
        adc data 65h
        chx data 66h

        org 0000h
        sjmp main
        org 0030h
        main:mov sp,#30h
        clr f0
        lcall init
        s1:lcall adcx
        lcall hdc
        lcall top
        lcall bot
        ljmp s1

        init:mov com,#00111000b
        lcall write_com
        mov com,#00001110b
        lcall write_com
        mov com,#00000110b
        lcall write_com
        mov com,#00000001b
        lcall write_com
        ret

        adcx: clr a
        setb cs
        clr clk
        clr cs
        setb di
        setb clk;第一個脈沖
        clr clk
        setb clk;第二個脈沖
        clr clk
        jb p3.0,a1
        cpl f0
        jnb p3.0,$
        a1:mov c,f0
        mov di,c
        setb clk;第三個脈沖
        clr clk
        setb clk
        setb do
        mov r1,#08h
        a2:clr clk
        nop
        mov c,do
        rlc a
        setb clk
        nop
        djnz r1,a2
        mov adc,a
        setb cs
        ret

        hdc: mov a,adc
        mov b,#51
        div ab
        mov adcb,a
        mov a,b
        clr c
        subb a,#26
        mov 00h,c
        mov a,b
        mov b,#10
        mul ab
        mov b,#51
        div ab
        jb 00h,h1
        add a,#5
        h1:mov adcs,a
        mov a,b
        clr c
        subb a,#26
        mov 00h,c
        mov a,b
        mov b,#10
        mul ab
        mov b,#51
        div ab
        jb 00h,h2
        add a,#5
        h2:mov adcg,a
        ret

        write_com:clr rs
        clr rw
        mov p0,com
        lcall delay
        clr e
        setb e
        clr e
        ret

        write_dat:setb rs
        clr rw
        mov p0,dat
        lcall delay
        clr e
        setb e
        clr e
        ret

        top: mov com,#80h
        lcall write_com
        mov dptr,#tab1
        mov r0,#14
        t4:clr a
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        inc dptr
        djnz r0,t4
        mov dptr,#tab4
        mov com,#8eh
        lcall write_com
        jb f0,t2
        mov chx,#00h
        sjmp t3
        t2:mov chx,#01h
        t3:mov a,chx
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        ret

        bot: mov com,#0c0h
        lcall write_com
        mov dptr,#tab2
        mov r0,#10
        b1:clr a
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        inc dptr
        djnz r0,b1
        mov com,#0cah
        lcall write_com
        mov dptr,#tab4
        mov a,adcb
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        mov a,#10
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        mov a,adcs
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        mov a,adcg
        movc a,@a+dptr
        mov dat,a
        lcall write_dat
        ret

        tab1: db "INPUT CHANNEL "
        tab2: db " VOLTAGE: "
        tab4: db "0123456789."

        DELAY: ;誤差 0us
        MOV R6,#13H
        DL0:
        MOV R5,#82H
        DJNZ R5,$
        DJNZ R6,DL0
        RET

        end

        ...................................LCD1602+ADC0832數字電壓表(已調試通過).................................

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int;
        sbit rs=P2^4;
        sbit rw=P2^5;
        sbit e=P2^6; //LCD1602控制端
        sbit cs=P1^6;
        sbit di=P1^5;
        sbit dox=P1^4;
        sbit clk=P1^3;//ADC0832控制端
        sbit key=P3^0;//測量通道選擇按鍵
        uchar code table1[]="INPUT CHANNEL "; //顯示數據表
        uchar code table2[]=" VOLTAGE: ";
        uchar code table3[]="0123456789.";
        uchar ge,shi,bai; //顯示值存儲變量
        uchar adc_data; //A/D轉換值存儲變量

        void delay() //誤差 0us 5ms延時
        {
        uchar a,b;
        for(b=19;b>0;b--)
        for(a=130;a>0;a--);
        }


        void write_dat(uchar dat) //LCD1602寫數據
        {
        rs=1;
        rw=0;
        P0=dat;
        delay();//待數據穩定,待LCD1602響應完畢,否則LCD不顯示.
        e=0;
        e=1;
        e=0;
        }

        void write_com(uchar com)//LCD1602寫指令
        {
        rs=0;
        rw=0;
        P0=com;
        delay();
        e=0;
        e=1;
        e=0;
        }

        void top()//LCD1602顯示第一行
        {
        uchar i;
        write_com(0x80);
        for(i=0;i<14;i++)
        {
        write_dat(table1[i]);
        }
        write_dat(table3[(uchar)(F0)]);
        }

        void bot()//LCD1602顯示第二行
        {
        uchar i;
        write_com(0xc0);
        for(i=0;i<10;i++)
        {
        write_dat(table2[i]);
        }
        write_dat(table3[(uchar)(bai)]);
        write_dat(table3[10]); //顯示小數點
        write_dat(table3[(uchar)(shi)]);
        write_dat(table3[(uchar)(ge)]);
        }

        void init() //LCD1602初始化
        {
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        }

        void adc()//ADC0832轉換
        {
        uchar i;
        cs=1;
        clk=0;
        cs=0;
        di=1;
        clk=1;//第一個脈沖
        clk=0;
        clk=1;//第二個脈沖
        if(key!=1) //測量通道轉換
        {
        F0=!F0;
        while(key!=1);
        }
        clk=0;
        di=F0;
        clk=1;//第三個脈沖
        clk=0;
        clk=1;
        for(i=0;i<8;i++)
        {
        clk=0;
        adc_data<<=1;
        adc_data|=(uchar)(dox);
        clk=1;
        }
        cs=1;
        }

        void adx() //ADC0832數制轉換
        {
        bai=adc_data/51;
        shi=((adc_data%51)*10)/51;
        ge=((((adc_data%51)*10)%51)*10)/51;
        }

        void main()
        {
        F0=0;
        SP=0x30;
        init();
        while(1)
        {
        adc();
        adx();
        top();
        bot();
        delay();
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乐安县| 宁城县| 宜黄县| 安宁市| 寻甸| 诸暨市| 大英县| 文化| 沂源县| 大方县| 中卫市| 东城区| 萝北县| 闵行区| 南京市| 闸北区| 海伦市| 和田县| 长白| 布尔津县| 龙州县| 保康县| 枣强县| 高陵县| 兰考县| 司法| 祁连县| 利川市| 安新县| 鲁山县| 鄂温| 光山县| 疏勒县| 九寨沟县| 通江县| 竹北市| 万荣县| 黄浦区| 弋阳县| 翁源县| 岗巴县|