基于pic16f877a的电压输出并显示

2019-11-09来源: 51hei关键字:pic16f877a  电压输出  显示

 

程序源码如下

#include


//引脚定义

#define din RC7           //显示串行数据输入端

#define load RC6          //显示数据锁存端

#define clk RC5           //显示时钟输入端


#define DecodeMode 0x09     //译码模式

#define Intensity 0x0a      //亮度

#define ScanLimit 0x0b      //扫描界限

#define ShutDown 0x0c       //掉电模式

#define DisplayTest 0x0f    //显示测试

#define ShutdownMode 0x00      //掉电方式

#define NormalOperation 0x01   //正常操作方式

#define DecodeDigit 0xff       //译码位数设置

#define IntensityGrade 0x08    //显示亮度级别设置

#define ScanDigit 0x07         //扫描位数设置

#define TestMode 0x01          //显示测试方式

#define TextEnd 0x00           //显示测试结束,正常工作


unsigned char votAJU = 0x00;    //是否使用CVRR位置,由RD7控制

unsigned char votCounter =0;    //电压输出计数器


//4MHz下以ms为单位的延时

void delayMS(unsigned int ms)

{

  int i,j;

  for(i=0;i

  {

    for(j=0;j<70;j++);

  }

}


//向max7219写入一个字节

void Write_Max7219_byte(unsigned char DATA)           //LED写数据函数

{

       unsigned char i,k;

       load=0;

       for(i=8;i>=1;i--)

          {

            clk=0;

            k=DATA&0x80;

                        if(k==0x80)din=1;

                        else din=0;

            DATA<<=1;

            clk=1;

           }                                             

}

//向max7219写入指定位置的数据,address为位置,dat为数据

void Write_Max7219(unsigned char address,unsigned char dat)

{

  load=0;

  Write_Max7219_byte(address);

  Write_Max7219_byte(dat);

  load=1;               

}


//初始化max7219

void init_max7219(void)

{

    Write_Max7219(DecodeMode,DecodeDigit);      //设置译码模式

    Write_Max7219(Intensity,IntensityGrade);    //设置亮度

        Write_Max7219(ScanLimit,ScanDigit);         //设置扫描界限

    Write_Max7219(ShutDown,NormalOperation);    //设置电源工作模式

        Write_Max7219(DisplayTest,TextEnd);              //显示测试寄存器,写入00H,实现正常工作

}



//显示函数

void displayVoltage(unsigned char temp[4])

{

    Write_Max7219(0x01,0x0E);

    Write_Max7219(0x02,0x0A);

    if(RD7 == 1)

    {

      Write_Max7219(0x03,1);

    }

    else if(RD7 == 0)

    {

      Write_Max7219(0x03,0);

    }

    else

    {

    }

    Write_Max7219(0x04,0x0F);

    Write_Max7219(0x05,(temp[0]|0x80));

    Write_Max7219(0x06,temp[1]);

    Write_Max7219(0x07,temp[2]);

    Write_Max7219(0x08,temp[3]);        

}


void initINT(void)

{

        OPTION = 0x00;        //设置端口B为弱上拉电阻,RB为下降沿触发中断

    GIE = 1;

    INTE = 1;

    //允许RB0/INT中断

}


void initPORT(void)  //初始化端口D

{

  TRISB0 = 1;     //RB0为输入

  TRISC = 0x00;   //设置为输出

  PORTC = 0x00;   //输出都为0

  TRISD7 = 0;     //RD7为输入

}



void interrupt INTISR(void)

{

        if(INTF == 1)    //如果是外部中断

        {

                INTF = 0;                  //清除标志

        votCounter++;

        if(votCounter > 0x0F)  //只有16X2种可能

        {

          votCounter = 0;

        }

        }

}


void initVotOut(void)

{

  CVRR = 1;

  CVR3 = 0;

  CVR2 = 0;

  CVR1 = 0;

  CVR0 = 0;     //输出1.25V

  CVROE = 1;    //输出AN2引脚

  CVREN = 1;   //开启电压输出

}



void main(void)

{

    unsigned char vtemp[4];

    initPORT();             //端口初始化

    initINT();

    initVotOut();

    init_max7219();          //MAX7219初始化

    vtemp[0] = 0;

    vtemp[1] = 0;

    vtemp[2] = 0;

    vtemp[3] = 0;            //输出0V

    while (1)

    {  

      delayMS(20);

      CVRR = RD7;;

      if(votCounter == 0x00)     //1.25V或者0V

      {

        CVR3 = 0;

        CVR2 = 0;

        CVR1 = 0;

        CVR0 = 0;   

        if(RD7 == 1)             //CVRR = 1

        {

          vtemp[0] = 0;

          vtemp[1] = 0;

          vtemp[2] = 0;

          vtemp[3] = 0;            //输出0V      

        }

        else if(RD7 == 0)

        {

          vtemp[0] = 1;

          vtemp[1] = 2;

          vtemp[2] = 5;

          vtemp[3] = 0;            //输出1.25V   

        }

      }

      else if(votCounter == 0x01)     //0.21或1.41V

      {

        CVR3 = 0;

        CVR2 = 0;

        CVR1 = 0;

        CVR0 = 1;   



关键字:pic16f877a  电压输出  显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479501.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:LCD+PIC单片机12864串行显示程序
下一篇:PIC 16f877a PORTB State Change Interrupt仿真与源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC16F873A单片机的照度测量项目原理图与源代码
基于PIC16F873A的照度测量C语言代码。可以使用Labview以RS232接口和PC通信,并获取实时数据 单片机源程序如下:#include <pic.h>           //调用PIC16F87XA单片机的头文件__CONFIG(HS&WDTDIS&LVPDIS);#define U5A  RC0           //4位数码管单元的U5(74HC138)的A脚接在RB0口上#define U5B  RC1      
发表于 2019-11-12
PIC16F873A单片机的照度测量项目原理图与源代码
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
软件:MPLAB X IDE v4.15编译    proteus 8.6仿真.1、仿真电路图;2、发送和接收源程序加注释。请看注释。原理:1)ADC读取并用led显示ADC读数,并通过usart进行输出。2)通过PPM原理进行通讯传输到另外一个单片机,LED显示接收的值。具体请看附件希望大家顶一下。仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 1、发送模块:读取ADC数值,LED显示10位ADC值。并通过PPM发送。2、接收模块:PPM接收到的数据。LED显示接收的ADC值(10bits)基于PIC单片机的PPM调制激光通信收发器PPM (pulse position
发表于 2019-11-09
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
PIC 16f877a PORTB State Change Interrupt仿真与源码
PORT Change Interrupt PIC 16f877A单片机源程序如下:#define      LED_1     PORTd.b0#define      LED_2     PORTd.b1void interrupt(){if(INTCON.RBIF)  {  INTCON.RBIF = 0;  if(!PORTB.B4)   {    LED_1 = 0;    LED_2 = 1;   } 
发表于 2019-11-09
PIC 16f877a PORTB State Change Interrupt仿真与源码
PIC16F877A编程PID+PWM+1602液晶显示
;          CHS1=0;  CHS0=0;//系统时钟f/16,选择RA0通道,允许ADC工作  ADON=1;  delay1(); //保证采样延时  ADGO=1; //开启转换过程  while(ADGO); //等待转换完成  resultsc=resultsc+ADRESL+ADRESH*256; //累计转换结果 }resultsc=resultsc/5; //求5次结果的平均值}//PID基准电压采样void jzcy(){resultjz=0;  for(int i=5;i>
发表于 2019-10-24
PIC16F877A单片机led的动态显示
list p=16F877A,R=DECinclude "p16F877A.inc";;;;;user variables;;;;;;;;Count2 equ 23HCount3 equ 24Hdata_out1 equ 25Hdata_out2 equ 26H;;;;;;;reset vector;;;;;;;;;org 0x00goto mainline;;;;;;delay program;;;;;;;delay_2msmovlw 0x05movwf Count2lp0 movlw 0xffmovwf Count3lp1 decfsz Count3,Fgoto lp1decfsz Count2,Fgoto
发表于 2019-10-19
STM32CubeMX学习笔记5:ADC模数转换电压至串口输出
MCU:STM32F103ZET6IDE:  MDK-ARM V5 +STM32CubeMX5.0.0串口调试助手:SSCOM3.2功能描述:通过ADC1通道1采样外部电压值,将采样的AD值和转换后的电压值通过串口打印出来。需要配置的有USART1和ADC。一. 在 Pinout&Configuration---System Core中:1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator2. 设置系统SYS的Debug为Serial Wire:二. 在 Pinout&Configuration---Analog和Connectivity中:1.
发表于 2019-07-18
STM32CubeMX学习笔记5:ADC模数转换电压至串口输出
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved