• 基于51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)


    基于51单片机PCF8591数字电压表数码管设计( proteus仿真+程序+设计报告+讲解视频)

    仿真图proteus7.8及以上

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:S0059

    1.主要功能:

    基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用)

    基于51单片机的数字电压表设计

    1.采用PCF8591实现AD采样功能;

    2.采样电压范围0-5V;

    3.用数码管显示转换后的实际电压值

    4.显示保留小数点后两位。

    需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

    以下为本设计资料展示图:

    讲解视频:

    仿真讲解+代码讲解

    51单片机PCF8591数字电压表数码管( proteus仿真+程序+报告+讲解)

    2.仿真

    开始仿真

    打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。数码管显示电压值,精确到小数点后两位。可以调整范围0-5V。

    img

    3. 程序代码

    使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。

    img

    main函数:

    main()
    {  
    
    
    	while(1)
    	{
    	 /********以下AD-DA处理*************/  
    	 PCF8591_SendByte(AddWr,0);	 //启动转换
    	 D[0]=PCF8591_RcvByte(AddWr);  //读转换完的数字信号,ADC0 模数转换 范围是256-0;
    	 vol_value = PCF8591_RcvByte(AddWr); 
    	 vol_value = vol_value*5.0*100/256;//得到范围是500-0,方便显示
    	 
    	 dis[0] = (vol_value%1000)/100; //百
    	 dis[1] = (vol_value%100)/10;  //十
     	 dis[2] = vol_value%10; 
    
     	 C4 = C2 =C1 =0;      //关闭134数码管
    	 C3=1;                //打开第2位数码管
    	 Dp=0;     			  //打开小数点
    	 P1=table[dis[0]];    //显示整数部分及小数点
    	 delay(10);           //延时一定时间	
    	 
         C4 = C3 = C1=0;       //关闭第124位数码管
    	 C2=1;                //打开第3位数码管
    	 Dp=1;               
    	 P1=table[dis[1]];     
     	 delay(10);           
    
     	 C4 = C3 =C2 =0;      //关闭123数码管
    	 C1=1;                //打开第4位数码管
    	 Dp=1;               
    	 P1=table[dis[2]];   
    	 delay(10);           //延时一定时间
     
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    PCF8591相关操作函数

    /************************************************************
    * 函数名        : Pcf8591_SendByte
    * 函数功能		: 写入一个控制命令
    * 输入          : addr(器件地址),channel(转换通道)
    * 输出         	: 无
    ************************************************************/
    bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
    {
       Start_I2c();              //启动总线
       I2C_SendByte(addr);            //发送器件地址
       if(ack==0)return(0);
       I2C_SendByte(0x40|channel);              //发送控制字节
       if(ack==0)return(0);
       Stop_I2c();               //结束总线
       return(1);
    }
    
    /************************************************************
    * 函数名       	: PCF8591_RcvByte
    * 函数功能   	: 读取一个转换值
    * 输入          :
    * 输出          : dat
    ************************************************************/
    unsigned char PCF8591_RcvByte(unsigned char addr)
    {  
       unsigned char dat;
    
       Start_I2c();          //启动总线
       I2C_SendByte(addr+1);      //发送器件地址
       if(ack==0)return(0);
       dat=I2C_RcvByte();          //读取数据0
    
       Ack_I2c(1);           //发送非应答信号
       Stop_I2c();           //结束总线
       return(dat);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    IIC通信函数

    /*******************************************************************
                         起动总线函数               
    函数原型: void  Start_I2c();  
    功能:     启动I2C总线,即发送I2C起始条件.  
    ********************************************************************/
    void Start_I2c()
    {
      sda=1;         /*发送起始条件的数据信号*/
      _nop_();
      scl=1;
      _nop_();        /*起始条件建立时间大于4.7us,延时*/
      _nop_();
      _nop_();
      _nop_();
      _nop_();    
      sda=0;         /*发送起始信号*/
      _nop_();        /* 起始条件锁定时间大于4μs*/
      _nop_();
      _nop_();
      _nop_();
      _nop_();       
      scl=0;       /*钳住I2C总线,准备发送或接收数据 */
      _nop_();
      _nop_();
    }
    
    /*******************************************************************
                          结束总线函数               
    函数原型: void  Stop_I2c();  
    功能:     结束I2C总线,即发送I2C结束条件.  
    ********************************************************************/
    void Stop_I2c()
    {
      sda=0;      /*发送结束条件的数据信号*/
      _nop_();       /*发送结束条件的时钟信号*/
      scl=1;      /*结束条件建立时间大于4μs*/
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      sda=1;      /*发送I2C总线结束信号*/
      _nop_();
      _nop_();
      _nop_();
      _nop_();
    }
    
    /*******************************************************************
                     字节数据发送函数               
    函数原型: void  I2C_SendByte(UCHAR c);
    功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
              此状态位进行操作.(不应答或非应答都使ack=0)     
               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
    ********************************************************************/
    void  I2C_SendByte(unsigned char  c)
    {
     unsigned char  i;
     
     for(i=0;i<8;i++)  /*要传送的数据长度为8位*/
        {
         if((c<<i)&0x80)sda=1;   /*判断发送位*/
           else  sda=0;                
         _nop_();
         scl=1;               /*置时钟线为高,通知被控器开始接收数据位*/
          _nop_(); 
          _nop_();             /*保证时钟高电平周期大于4μs*/
          _nop_();
          _nop_();
          _nop_();         
         scl=0; 
        }
        
        _nop_();
        _nop_();
        sda=1;                /*8位发送完后释放数据线,准备接收应答位*/
        _nop_();
        _nop_();   
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        if(sda==1)ack=0;     
           else ack=1;        /*判断是否接收到应答信号*/
        scl=0;
        _nop_();
        _nop_();
    }
    
    /*******************************************************************
                     字节数据接收函数               
    函数原型: UCHAR  I2C_RcvByte();
    功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
              发完后请用应答函数应答从机。  
    ********************************************************************/    
    unsigned char   I2C_RcvByte()
    {
      unsigned char  retc=0,i; 
      sda=1;                     /*置数据线为输入方式*/
      for(i=0;i<8;i++)
          {
            _nop_();           
            scl=0;                  /*置时钟线为低,准备接收数据位*/
            _nop_();
            _nop_();                 /*时钟低电平周期大于4.7μs*/
            _nop_();
            _nop_();
            _nop_();
            scl=1;                  /*置时钟线为高使数据线上数据有效*/
            _nop_();
            _nop_();
            retc=retc<<1;
            if(sda==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
            _nop_();
            _nop_(); 
          }
      scl=0;    
      _nop_();
      _nop_();
      return(retc);
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123

    4. 设计报告

    5133字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

    img

    5. 设计资料内容清单&&下载链接

    资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

    0、常见使用问题及解决方法–必读!!!!

    1、仿真图

    2、程序源码

    3、功能要求

    4、开题报告

    5、设计报告

    6、软硬件流程框图

    7、讲解视频

    Altium Designer 软件资料

    KEIL软件资料

    Proteus软件资料

    单片机学习资料

    答辩技巧

    设计报告常用描述

    鼠标双击打开查找更多51 STM32单片机课程毕业设计.url

    img

    资料下载链接(可点击):

    https://docs.qq.com/doc/DS21ESENWS3RDdGFH

  • 相关阅读:
    gateway学习
    MyBatis缓存机制
    Flink的状态一致性
    彻底搞懂原生事件流和 React 事件流
    【无标题】LeetCode题解:19. 删除链表的倒数第 N 个结点,JavaScript,详细注释
    Oracle/PLSQL: Translate Function
    面试2:通用能力
    Postman 批量测试接口详细教程
    【Redis】实战篇:分布式锁解决集群环境下的并发问题
    C++:用函数模板排列数组
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/134346914