历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | 基于pic16f877a的电压输出并显示

2019-11-09 来源:51hei

 

程序源码如下

#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;   



推荐阅读

史海拾趣

东晶(ECEC)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,东晶电子开始将目光投向国际市场。公司积极参与国际展会,与全球知名电子企业建立合作关系,产品出口到欧洲、北美、东南亚等多个国家和地区。同时,东晶电子还与国际知名厂商进行技术交流和合作研发,不断提升自身技术水平,以适应全球市场的竞争需求。

D1 International Inc公司的发展小趣事

随着技术的不断成熟,D1 International Inc公司开始积极拓展市场。公司不仅在国内市场取得了显著的成果,还成功打入国际市场。与此同时,D1 International Inc公司也注重与其他企业的战略合作。通过与知名电子制造商的合作,D1 International Inc公司的产品线得到了极大的丰富,同时也提升了公司的品牌影响力。

Condor公司的发展小趣事

作为一家有社会责任感的企业,D1 International Inc公司始终关注环境保护和可持续发展。公司在生产过程中采取环保措施,减少废弃物排放,同时积极推广绿色电子产品。此外,D1 International Inc公司还积极参与社会公益活动,回馈社会,为构建和谐社会贡献自己的力量。

国盛科技(BOCHEN)公司的发展小趣事

国盛科技在技术创新方面取得了显著成果。截至目前,公司已累计取得8项发明专利、30项新型实用型专利,并成功转化了19项高新技术产品和知识产权成果。这些专利和成果的取得,不仅展示了国盛科技在电子元器件领域的研发实力,也为公司的持续发展提供了有力支撑。

Amphenol Aerospace公司的发展小趣事

国盛科技(BOCHEN)的前身是成都国正电子有限责任公司,由周正军先生于1999年创立,初期便致力于电子元器件的制造。面对当时行业内的技术壁垒和专利限制,国盛科技坚持以创新驱动,不断加大研发投入,逐渐在电子元器件领域站稳脚跟。这一时期,公司通过引进和培养核心技术人员,逐步建立起一支具备国内一流研发水平的团队,为后续的快速发展奠定了坚实基础。

ATO SOLUTION公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。ATO SOLUTION公司始终坚持以质量为核心,建立了严格的质量管理体系。公司从原材料采购到产品生产的每一个环节都进行严格把控,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使公司赢得了客户的信任和口碑,为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

硬件工程师必杀技

1 、充分了解各方的设计需求,确定合适的解决方案 启动一个硬件开发项目,原始的推动力会来自于很多方面,比如市场的需要,基于整个系统架构的需要,应用软件部门的功能实现需要,提高系统某方面能力的需要等等,所以作为一个硬件系统的设计 ...…

查看全部问答>

用RFM12收发模块的请进

本人最近正在调试RFM12收发模块,一直没调试成功,数据不能发射出去,请各位大侠指教…

查看全部问答>

单片机系统常用电子元器件知识简析

电阻种类及特点简介 电阻,英文名resistance,通常缩写为R,它是导体的一种基本性质,与导体的尺寸、材料、温度有关。欧姆定律说,I=U/R,那么R=U/I,电阻的基本单位是欧姆,用希腊字母“Ω”表示,有这样的定义:导体上加上一伏特电压时,产生一 ...…

查看全部问答>

请教~初学者什么时候买开发板?

我刚刚开始接触FPGA,资料也才看了一点,Verilog HDL也只是大致了解. 我在想要不要买块开发板,一边看资料一边在开发板上试试 以前学C的时候上课也觉得很枯燥,但是会经常自己编些小算术题之类的~呵呵 望有经验的兄弟姐妹给些建议 不慎感谢…

查看全部问答>

掉电保持数据 20字节左右

想实现 运行状态 掉电保持,以便重新上电时恢复, 需要保持的数据大约  20字节, 该状态每秒更新一次。 请问有什么比较好的方法?掉电检测如何实现? //目前使用的方法是:Dallas SDRAM, 当作RAM一部分。 掉电检测没有,上电时检查状 ...…

查看全部问答>

WinCE6.0中应用中使用物理地址

做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。 我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚 ...…

查看全部问答>

[求助]DPF播放一個半小時的幻燈圖片後就不再播放了。爲什麽?

在板子上做测试,从服务器上读图片,在板子上以幻灯片的形式播放,几乎每次一个半小时后就停止播放。系统是winCE的,网上查了好久,知道是订阅时间的问题,但不知道该改哪部分的代码,请达人们指教,小弟刚接触嵌入式开发。…

查看全部问答>

AT89S51单片机控制GSM模块(M22)发送短信程序!~!~!~!

AT89S51单片机控制GSM模块(M22)发送短信程序!~!~!~! 自己改的AT89S51单片机控制GSM模块(M22)发送短信程序,在Keil上编译没错,但还未试过烧入片内运行。。 大家看看,这个程序可行否? 还有什么错误的地方? 希望搞过GSM的朋友多提点 ...…

查看全部问答>

为什么我在debug的时候会出现F437.txt格式错误呀

@8000 30 40 04 80 FF 3F 31 40 00 06 3C 40 0C 02 3E 40 F8 00 B0 12 EE A7 3C 40 00 02 3E 40 0C A8 30 12 0B 00 B0 12 00 A8 21 53 B0 12 44 A0 B0 12 12 A4 0A 12 0B 12 08 12 09 12 06 12 07 12 04 12 05 12 D2 93 E5 02 C5 20 C2 43 E5 ...…

查看全部问答>

STM32 微库使用方法

stm32 裸板 怎么样使用微库 malloc strlen..这些函数 怎样掉微库的函数哦  微库的函数怎么看…

查看全部问答>