新聞中心

EM78P458電壓表的制作

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
以前的學(xué)習(xí)筆記——在學(xué)習(xí)74HC164的應(yīng)用,用義隆單片機(jī)調(diào)試。用了匯編調(diào)試成功后又用C調(diào)試了下。練習(xí)著就打算用C語(yǔ)言來(lái)編寫(xiě)AD的讀寫(xiě),順便結(jié)合74HC164寫(xiě)了個(gè)電壓表的程序。又花了半天時(shí)間把C代碼優(yōu)化了下,提高了代碼效率。晚上回家就把此例子記錄下來(lái),以供參考。

一、功能介紹:

本文引用地址:http://2s4d.com/article/201611/316078.htm

本設(shè)計(jì)采用臺(tái)灣的義隆單片機(jī)EM78P458,此單片機(jī)內(nèi)部有4K*13bit一次性ROM(OTPROM)此單片機(jī)內(nèi)帶8位多路AD,精度達(dá)到13位。結(jié)合3片74HC164來(lái)對(duì)三個(gè)數(shù)碼管進(jìn)行數(shù)據(jù)傳輸,實(shí)現(xiàn)數(shù)據(jù)的串轉(zhuǎn)并,節(jié)省了單片機(jī)的I/O口資源;本設(shè)計(jì)只是個(gè)舉例應(yīng)用,為了學(xué)習(xí)74HC164的應(yīng)用和義隆單片機(jī)C語(yǔ)言的應(yīng)用。實(shí)際應(yīng)用中三個(gè)數(shù)碼管顯示可以用一個(gè)74HC164來(lái)賦數(shù)據(jù),三個(gè)I/O口來(lái)掃描,動(dòng)態(tài)掃描來(lái)顯示。具體不做詳細(xì)介紹。A/D端口輸入電壓范圍:0~5V。顯示精確到小數(shù)點(diǎn)后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}

//****************存儲(chǔ)空間分配**************

unsigned short ledm@0x20:bank 1;//short占用2個(gè)存儲(chǔ)空間

unsigned short ledtemp @0x22:bank 1;//AD計(jì)算時(shí)候的中間量

unsigned charAD_data @0x24:bank 1;//AD采集數(shù)據(jù)存儲(chǔ)地址

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

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

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

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

//************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里的數(shù)據(jù)就存放在ROM里,不然是存在RAM里

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

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

void delay(void)

{unsigned shorti;

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

{;}

}

//***********AD參數(shù)設(shè)置子程序***************

void DO_AD(void)

{

ADCON=0x08;//選擇AD0

ADCOM=0x01;//模擬信號(hào)進(jìn)行轉(zhuǎn)換并設(shè)置轉(zhuǎn)換

P6CR=1;

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

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

ENI();//開(kāi)中斷

ADRUN=1;//啟動(dòng)ADC

while(ADRUN==1);//等待AD轉(zhuǎn)換結(jié)束

AD_data=ADDATA; //AD數(shù)據(jù)存儲(chǔ)到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;//下拉電阻設(shè)置

//ODCR=0x00;//高阻設(shè)置

//PHCR=0xff;//上拉電阻設(shè)置

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采樣進(jìn)來(lái)的數(shù)據(jù)轉(zhuǎn)換*******

//******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]);

}

}



關(guān)鍵詞: EM78P458電壓

評(píng)論


技術(shù)專區(qū)

關(guān)閉