单片机
返回首页

EM78P458电压表的制作

2016-09-05 来源:eefocus

以前的学习笔记——在学习74HC164的应用,用义隆单片机调试。用了汇编调试成功后又用C调试了下。练习着就打算用C语言来编写AD的读写,顺便结合74HC164写了个电压表的程序。又花了半天时间把C代码优化了下,提高了代码效率。晚上回家就把此例子记录下来,以供参考。

一、功能介绍:

本设计采用台湾的义隆单片机EM78P458,此单片机内部有4K*13bit一次性ROM(OTPROM)此单片机内带8位多路AD,精度达到13位。结合3片74HC164来对三个数码管进行数据传输,实现数据的串转并,节省了单片机的I/O口资源;本设计只是个举例应用,为了学习74HC164的应用和义隆单片机C语言的应用。实际应用中三个数码管显示可以用一个74HC164来赋数据,三个I/O口来扫描,动态扫描来显示。具体不做详细介绍。A/D端口输入电压范围:0~5V。显示精确到小数点后2位。

二、具体电路如下:

EM78P458电压表的制作 - 小文 - 小文电子设计

 

三、       完整程序

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

//Use IC: EMC78P458                **

//Author: zhengwen                 **

//Date  : 2007.1.22                **

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

//P57==CLR  P55==CLOCK P56==data   **

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

#include 'em78x458_9xx.h'

#define  uchar unsigned char

#define  uint unsigned int

#define  DATA R56         //Data  bit of 74HC164

#define  CLK  R55         //Clock bit of 74HC164

#define  DATA_CLR  R57    //Clr   bit of 74HC164

#define  ENI()   _asm{eni}

 

//****************存储空间分配**************

unsigned short ledm    @0x20:bank 1;//short 占用2个存储空间

unsigned short ledtemp @0x22:bank 1;//AD计算时候的中间量

unsigned char  AD_data @0x24:bank 1;//AD采集数据存储地址

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_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]); 

 }

      

}  

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章