新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > EM78P458電壓表的制作

        EM78P458電壓表的制作

        作者: 時間:2016-11-13 來源:網絡 收藏
        以前的學習筆記——在學習74HC164的應用,用義隆單片機調試。用了匯編調試成功后又用C調試了下。練習著就打算用C語言來編寫AD的讀寫,順便結合74HC164寫了個電壓表的程序。又花了半天時間把C代碼優化了下,提高了代碼效率。晚上回家就把此例子記錄下來,以供參考。

        一、功能介紹:

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

        本設計采用臺灣的義隆單片機EM78P458,此單片機內部有4K*13bit一次性ROM(OTPROM)此單片機內帶8位多路AD,精度達到13位。結合3片74HC164來對三個數碼管進行數據傳輸,實現數據的串轉并,節省了單片機的I/O口資源;本設計只是個舉例應用,為了學習74HC164的應用和義隆單片機C語言的應用。實際應用中三個數碼管顯示可以用一個74HC164來賦數據,三個I/O口來掃描,動態掃描來顯示。具體不做詳細介紹。A/D端口輸入電壓范圍:0~5V。顯示精確到小數點后2位。

        二、具體電路如下:

        三、完整程序

        //**************Voltage**************

        //Use IC: EMC78P458**

        //Author: zhengwen**

        //Date: 2007.1.22**

        //74HC164_PIN Q0~Q7 =LED_PIN a~h**

        //P57==CLRP55==CLOCK P56==data**

        //***********************************

        #include "em78x458_9xx.h"

        #defineuchar unsigned char

        #defineuint unsigned int

        #defineDATA R56//Databit of 74HC164

        #defineCLKR55//Clock bit of 74HC164

        #defineDATA_CLRR57//Clrbit of 74HC164

        #defineENI()_asm{eni}

        //****************存儲空間分配**************

        unsigned short ledm@0x20:bank 1;//short占用2個存儲空間

        unsigned short ledtemp @0x22:bank 1;//AD計算時候的中間量

        unsigned charAD_data @0x24:bank 1;//AD采集數據存儲地址

        unsigned charled1@0x20:bank 0;//第1位數碼管顯示數

        unsigned charled2@0x21:bank 0;//第2位數碼管顯示數

        unsigned charled3@0x22:bank 0;//第3位數碼管顯示數

        //******************************************

        //************Table of LED******************

        const unsigned char table[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

        const unsigned char table1[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x88,0x00,0x10,0x08,0x03,0xC6,0xA1,0x86,0x8E};

        //用const以后table里的數據就存放在ROM里,不然是存在RAM里

        //******************************************

        //*******Subprogram of Delay****************

        void delay(void)

        {unsigned shorti;

        for(i=0;i<60000;i++)

        {;}

        }

        //***********AD參數設置子程序***************

        void DO_AD(void)

        {

        ADCON=0x08;//選擇AD0

        ADCOM=0x01;//模擬信號進行轉換并設置轉換

        P6CR=1;

        GCON=0;//選擇ADC增益和工作電壓

        ADPD=1;//禁止ADC的低功耗模式

        ENI();//開中斷

        ADRUN=1;//啟動ADC

        while(ADRUN==1);//等待AD轉換結束

        AD_data=ADDATA; //AD數據存儲到AD_data地址中

        }

        //******Send Data Subprogram***********

        void sendData(uchar c)

        {

        unsigned char i;

        bit temp;

        for(i=0;i<8;i++)

        {

        if (c&0x80) temp=1;

        else temp=0;

        CLK=0;

        DATA=temp;

        CLK=1;

        c<<=1;

        }

        }

        //****************************************

        //*******Initialization of Program***************

        void init(void)

        {

        P5CR=0x00;//P5 as Output

        P6CR=0x03;//PORT6的,1.2口為輸入,其他口為輸出

        //PDCR=0xff;//下拉電阻設置

        //ODCR=0x00;//高阻設置

        //PHCR=0xff;//上拉電阻設置

        WDTCR&=0xef;//"1" enable R-option ,"0" disable R-option

        }

        //*********Main Program********************

        void main()

        {

        DATA_CLR=1;//unable clr bit of 74HC164

        init();// I/O init

        while(1)

        {

        DO_AD();

        AD_data=ADDATA;

        //******AD采樣進來的數據轉換*******

        //******Vin=(Dx/256)*5 (V)*********

        ledm=AD_data;

        ledm=ledm*125;

        ledtemp=ledm>>6;

        led1=ledtemp/100;

        led2=(ledtemp%100)/10;

        led3=(ledtemp%100)%10;

        //*********************************

        delay();

        sendData(table1[led1]);//輸出顯示

        sendData(table[led2]);

        sendData(table[led3]);

        }

        }



        關鍵詞: EM78P458電壓

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 上思县| 唐山市| 介休市| 奎屯市| 山阴县| 浠水县| 鹤岗市| 石棉县| 错那县| 鄂托克前旗| 伊金霍洛旗| 七台河市| 鄂托克旗| 南阳市| 赤壁市| 西充县| 张家港市| 石城县| 本溪| 丰台区| 曲阳县| 屯门区| 嘉兴市| 永年县| 金坛市| 镶黄旗| 慈利县| 杭州市| 安徽省| 大关县| 垦利县| 黄龙县| 福清市| 乐山市| 怀安县| 徐汇区| 罗田县| 青岛市| 华池县| 洪洞县| 嵊州市|