EM78P458電壓表的制作
一、功能介紹:
本文引用地址:http://www.ex-cimer.com/article/201611/316078.htm本設(shè)計采用臺灣的義隆單片機EM78P458,此單片機內(nèi)部有4K*13bit一次性ROM(OTPROM)此單片機內(nèi)帶8位多路AD,精度達(dá)到13位。結(jié)合3片74HC164來對三個數(shù)碼管進行數(shù)據(jù)傳輸,實現(xiàn)數(shù)據(jù)的串轉(zhuǎn)并,節(jié)省了單片機的I/O口資源;本設(shè)計只是個舉例應(yīng)用,為了學(xué)習(xí)74HC164的應(yīng)用和義隆單片機C語言的應(yīng)用。實際應(yīng)用中三個數(shù)碼管顯示可以用一個74HC164來賦數(shù)據(jù),三個I/O口來掃描,動態(tài)掃描來顯示。具體不做詳細(xì)介紹。A/D端口輸入電壓范圍:0~5V。顯示精確到小數(shù)點后2位。
二、具體電路如下:
三、完整程序
//**************Voltage**************
//Use IC: EMC78P458**
//Author: zhengwen**
//Date: 2007.1.22**
//74HC164_PIN Q0~Q7 =LED_PIN a~h**
//P57==CLRP55==CLOCK P56==da
//***********************************
#include "em78x458_9xx.h"
#defineuchar unsigned char
#defineuint unsigned int
#defineDA
#defineCLKR55//Clock bit of 74HC164
#defineDA
#defineENI()_asm{eni}
//****************存儲空間分配**************
unsigned short ledm@0x20:bank 1;//short占用2個存儲空間
unsigned short ledtemp @0x22:bank 1;//AD計算時候的中間量
unsigned charAD_da
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;//模擬信號進行轉(zhuǎn)換并設(shè)置轉(zhuǎn)換
P6CR=1;
GCON=0;//選擇ADC增益和工作電壓
ADPD=1;//禁止ADC的低功耗模式
ENI();//開中斷
ADRUN=1;//啟動ADC
while(ADRUN==1);//等待AD轉(zhuǎn)換結(jié)束
AD_da
}
//******Send Da
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;
DA
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()
{
DA
init();// I/O init
while(1)
{
DO_AD();
AD_da
//******AD采樣進來的數(shù)據(jù)轉(zhuǎn)換*******
//******Vin=(Dx/256)*5 (V)*********
ledm=AD_da
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]);
}
}
評論