EM78P458电压表的制作
2016-09-05 来源:eefocus
一、功能介绍:
本设计采用台湾的义隆单片机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==CLR P55==CLOCK P56==da
//***********************************
#include 'em78x458_9xx.h'
#define uchar unsigned char
#define uint unsigned int
#define DA
#define CLK R55 //Clock bit of 74HC164
#define DA
#define ENI() _asm{eni}
//****************存储空间分配**************
unsigned short ledm @0x20:bank 1;//short 占用2个存储空间
unsigned short ledtemp @0x22:bank 1;//AD计算时候的中间量
unsigned char AD_da
unsigned char led1 @0x20:bank 0;//第1位数码管显示数
unsigned char led2 @0x21:bank 0;//第2位数码管显示数
unsigned char led3 @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 short i;
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_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; //下拉电阻设置
//ODCR=0x00; //高阻设置
//PHCR=0xff; //上拉电阻设置
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采样进来的数据转换*******
//******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]);
}
}
上一篇:单片机按键去抖