• 基于AT89C51单片机的直流数字电压表设计


    目 录
    摘 要 1
    Abstract 2
    1 引言 4
    2 基于单片机的数字直流电压表设计 6
    2.1 主要芯片选择 6
    2.1.1 AT89C51单片机简介 6
    2.1.2 AT89C51单片机的结构特点 7
    2.1.3 AT89C51单片机的外部引脚 8
    2.2 A/D转换芯片ADC0832 11
    2.2.1 ADC0832特点 11
    2.2.2 ADC0832 与单片机的接口电路: 12
    2.2.3 单片机对ADC0832 的控制原理: 12
    2.3 LCD液晶显示器 14
    2.3.1液晶显示器LCD1602简介 14
    2.3.2 LCD的基本指令 15
    2.4 地址锁存器74LS373 17
    2.4.1 74LS373简介 17
    2.4.2 74LS373在单片机中的应用 18
    3数字电压表硬件电路设计 19
    3.1 单片机系统 19
    3.2 A/D转换芯片与单片机的连接 19
    3.3 时钟电路 20
    3.4 复位电路 20
    用AT89C51的复位电路如图3-4所示。当单片机一上电,立即复位。电容C3和电阻R1实现上电自动复位。复位也是使单片机退出低功耗工作方式而进入正常状态的一种操作。 20
    21
    图3-4 复位电路 21
    3.5 显示电路 21
    3.6 输入电路 22
    4系统的软件设计 24
    4.1 ADC0832选通设计 24
    4.2 LCD显示模块部分 24
    4.2.1基本操作程序 24
    4.2.2 RAM地址映射图 24
    表4-1 对应关系 24
    4.2.3状态字说明 24
    4.2.4数据指针设置 25
    4.2.5显示模式设置 25
    4.2.6初始化设置 25
    4.2.7其他设置 26
    4.3 LCD显示设计 26
    4.3.1 地址锁存器74LS373的设计 26
    4.3.2 LCD显示程序设计 26
    5系统调试 27
    5.1软件调试 27
    5.1.1 Proteus 简介 27
    5.1.2 Keil 简介 27
    5.1.3 Proteus与Keil连接调试 28
    致谢 32
    参考文献 33
    附录 34
    附录1:总体电路图 34
    附录2:源程序 35
    4系统的软件设计
    4.1 ADC0832选通设计
    由于本次的设计是两路的数字电压表,所以要使用2个ADC0832的通道,然而在正常的情况下,A/D转换是不能同时进行的,所以要一个个进行选通,再A/D转换,根据ADC0832的时序图,一个转换周期开始,CS=1,CLK=0,为第一个脉冲做准备,CS置0,片选有效。DIO置1,这个是规定的起始信号,CLK=1,这是第一个脉冲,然后第一个脉冲的下降沿,此前的DIO必须是高电平,然后DIO置1,开始通道选择,CLK=1,在第二个脉冲,第二,三个脉冲下沉之前,DI必须分别输入两位数据用于选择通道,第二个脉冲下降沿,CLK=0,然后DI置0,选择通道0,CLK=1第三个脉冲,CLK=0第三个脉冲下降沿,然后再第三个脉冲下沉之后,输入端DIO失去作用,DIO置1,CLK=1第四个脉冲。然后利用C语言中的For语句for(i=0;i<8;i++)高位在前,CLK=1第四个脉冲,CLK=0第四个脉冲下降沿,dat<<=1;将下面储存的低位数据向右移,dat|=(unsigned char)DIO; 将输出数据DIO通过或运算储存在dat最低位,CS=1片选无效,最后return dat将读输的数据返回。同样的,下次选择通道1,只要在第二个脉冲下降沿之后,DIO置1,就可以了。这样就能完成通道的选通和数据的传输。
    4.2 LCD显示模块部分
    4.2.1基本操作程序
    读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
    读数据:输入:RS=H,RW=H,E=H 输出:无
    写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据
    写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无
    4.2.2 RAM地址映射图
    控制器内部带有80字节的RAM缓冲区,对应关系如表4-1所示。

    表4-1 对应关系
    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E …… 27
    40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E …… 67
    4.2.3状态字说明
    1602的状态字说明如下表4-2所示。
    其中,STA0~STA6为当前地址指针的数值,STA7读写操作使能,1是禁止,0是允许,每次对控制器进行读写操作之前,必须进行读写检测,本文转载自http://www.biyezuopin.vip/onews.asp?id=12939确保STA7为0。

    STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0
    D7 D6 D5 D4 D3 D2 D1 D0
    表4-2 1602状态字说明
    4.2.4数据指针设置
    控制器内部设有一个数据地址指针,用户可以通过它们访问内部的全部80字节的RAM。数据指针的设置见下表4-3所示。

    #include
    #include
    #include
    #include 
    
    #define WR_COM XBYTE[0x7ff0]
    #define WR_DAT XBYTE[0x7ff1]
    
    extern void delay();
    extern void lcdprintf(char x,char y,char *s);
    extern void init_LCD();
    
    sbit CS=P3^0;       //将CS位定义为P3.0引脚
    sbit CLK=P3^1;      //将CLK位定义为P3.1引脚
    sbit DIO=P3^2;       //将DIO位定义为P3.2引脚
    char buff[30];
    code char *name="200xxxxx";
    
    
    unsigned char  A_D1()
    {
      unsigned char i,dat;
       CS=1;   //一个转换周期开始
       CLK=0;  //为第一个脉冲作准备
       CS=0;  //CS置0,片选有效
    
       DIO=1;    //DIO置1,规定的起始信号  
       CLK=1;   //第一个脉冲
       CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
       DIO=1;   //DIO置1, 通道选择信号  
       CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0 
       CLK=0;   //第二个脉冲下降沿 
       DIO=0;   //DI置0,选择通道0
       CLK=1;    //第三个脉冲
       CLK=0;    //第三个脉冲下降沿 
       DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
       CLK=1;    //第四个脉冲
       for(i=0;i<8;i++)  //高位在前
        {
          CLK=1;         //第四个脉冲
          CLK=0; 
          dat<<=1;       //将下面储存的低位数据向右移
    		dat|=(unsigned char)DIO; 	 //将输出数据DIO通过或运算储存在dat最低位 
        }	  		        
        CS=1;          //片选无效 
    	 return dat;	 //将读书的数据返回     
      }
    unsigned char  A_D2()
    {
      unsigned char i,dat;
       CS=1;   //一个转换周期开始
       CLK=0;  //为第一个脉冲作准备
       CS=0;  //CS置0,片选有效
    
       DIO=1;    //DIO置1,规定的起始信号  
       CLK=1;   //第一个脉冲
       CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
       DIO=1;   //DIO置1, 通道选择信号  
       CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH1 
       CLK=0;   //第二个脉冲下降沿 
       DIO=1;   //DI置1,选择通道1
       CLK=1;    //第三个脉冲
       CLK=0;    //第三个脉冲下降沿 
       DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
       CLK=1;    //第四个脉冲
       for(i=0;i<8;i++)  //高位在前
        {
          CLK=1;         //第四个脉冲
          CLK=0; 
          dat<<=1;       //将下面储存的低位数据向右移
    		dat|=(unsigned char)DIO; 	 //将输出数据DIO通过或运算储存在dat最低位 
        }	  		        
        CS=1;          //片选无效 
    	 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
    • 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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    USER_TABLE中的num_rows与 count(1)不一致的问题
    通信领域~软件版本发布/交付过程中 常见术语
    接口调用三种方式
    基于FPGA的SD卡的数据读写实现(SD NAND FLASH)
    BabelEdit 5.0.1 Crack
    Bellman-Ford算法与SPFA算法详解
    运动耳机哪种佩戴方式好?佩戴稳固舒适的运动耳机
    Windows server 2012远程桌面会话主机和远程桌面授权
    【统计学习|书籍阅读】第一章 统计学习方法概论 p1-p24
    搜题公众号搭建
  • 原文地址:https://blog.csdn.net/newlw/article/details/127441096