找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2692|回复: 0
收起左侧

液晶显示的单片机ADC0832数字电压表

[复制链接]
ID:859742 发表于 2020-12-13 23:26 | 显示全部楼层 |阅读模式
一、实验要求
利用51单片机设计一个数字电压表,实现从模拟信号输入到数字信号输出的基本功能,具体要求如下:
1)通过滑动变阻器改变输入电压;
2)利用AD转换器ADC0832将输入电压转换为数字信号送到单片机;
3)在LCD上显示输入电压值,保留三位小数;
4)在电压测量值后面显示单位“V”

Using C51 MCU to design a digital voltmeter achieve from the analog signal input to the basic functions of digital signal output.
(1) Change the input voltage by sliding the rheostat;
(2) Using the AD converter ADC0832 to convert the input voltage to a digital signal to the MCU;
(3) The input voltage value is displayed on the LCD, leaving three decimal places;
(4) After the voltage measurement value shows the unit "V".



二、实验任务
本系统以51单片机作为控制核心,实现LCD显示的控制、AD转换器的启动与数据读入,并协调和控制各个模块的工作。


The system uses C51 MCU as the control core, to achieve LCD display control, AD converter start and data read, and coordinate and control the work of each module


四、硬件电路


五、实验程序
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<string.h>

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. sbit CS=P1^0; //片选线
  7. sbit CLK=P1^1; //时钟线
  8. sbit DIO=P1^2; //数据线


  9. sbit RS = P2^0; //寄存器选择
  10. sbit RW = P2^1; //读写控制
  11. sbit E = P2^2; //使能控制

  12. #define LCD P0

  13. u8 BUFF[] = " VOLTAGE:
  14. 0.00V";


  15. void delay_4us();
  16. void delay_ms(u16 i);
  17. bit Read_LCD_Busy_Flag();
  18. void Write_LCD_Command(u8
  19. cmd);
  20. void Write_LCD_Data(u8 dat);
  21. void LCD_Show_String(u8 r,u8
  22. c,char *s);
  23. void LCD_Init();
  24. u8 Get_AD_Result1();

  25. void delay_4us()
  26. {
  27.         _nop_();
  28.         _nop_();
  29.         _nop_();
  30.         _nop_();
  31. }


  32. void delay_ms(u16 i)
  33. {
  34.         u16 t;
  35.         while(i--)
  36.         {
  37.                 for(t=0;t<120;t++)
  38.                 {
  39.                         ;
  40.                 }
  41.         }
  42. }
  43. //读液晶屏是否繁忙
  44. bit Read_LCD_Busy_Flag()
  45. {
  46.         u8 result;
  47.         LCD = 0xFF;
  48.         RS = 0;
  49.         RW = 1;
  50.         E = 1;
  51.         delay_4us();
  52.         result = P0;
  53.         E = 0;
  54.         return(result & 0x80)?1:0;
  55. }
  56. //写液晶屏命令
  57. void Write_LCD_Command(u8
  58. cmd)
  59. {
  60.         while(Read_LCD_Busy_Flag());
  61.         RS = 0;
  62.         RW = 0;
  63.         E = 0;
  64.         _nop_();
  65.         _nop_();
  66.         LCD = cmd;
  67.         delay_4us();
  68.         E = 1;
  69.         delay_4us();
  70.         E = 0;
  71. }
  72. //写液晶屏数据
  73. void Write_LCD_Data(u8 dat)
  74. {
  75.         while(Read_LCD_Busy_Flag());
  76.         RS = 1;
  77.         RW = 0;
  78.         E = 0;
  79.         LCD = dat;
  80.         delay_4us();
  81.         E = 1;
  82.         delay_4us();
  83.         E = 0;
  84. }
  85. //液晶屏显示函数
  86. void LCD_Show_String(u8 r,u8
  87. c,char *s)
  88. {
  89.         u8 i=0;
  90.         u8 code DDRAM[] =
  91. {0x80,0xC0};
  92.         Write_LCD_Command(DDRA
  93. M[r] | c);
  94.         while(s[ i] && i < 16)
  95.         {
  96.                 Write_LCD_Data(s[i++]);
  97.         }
  98. }
  99. //液晶屏初始化
  100. void LCD_Init()
  101. {
  102.         Write_LCD_Command(0x38);
  103.         delay_ms(1);
  104.         Write_LCD_Command(0x0C);
  105.         delay_ms(1);
  106.         Write_LCD_Command(0x06);
  107.         delay_ms(1);
  108.         Write_LCD_Command(0x01);
  109.         delay_ms(1);
  110. }
  111. //获取AD转换结果
  112. u8 Get_AD_Result1()
  113. {
  114.         u8 i,dat1=0,dat2=0;
  115.         CS=0;
  116.         CLK=0;
  117.         DIO=1;
  118.         _nop_();
  119.         _nop_();
  120.         CLK=1;
  121.         _nop_();
  122.         _nop_();
  123.         CLK=0;
  124.         DIO=1;
  125.         _nop_();
  126.         _nop_();
  127.         CLK=1;
  128.         _nop_();
  129.         _nop_();
  130.         CLK=0;
  131.         DIO=0;
  132.         _nop_();
  133.         _nop_();
  134.         CLK=1;
  135.         _nop_();
  136.         _nop_();
  137.         CLK=0;
  138.         DIO=1;
  139.         _nop_();
  140.         _nop_();
  141.         for(i=0;i<8;i++)
  142.         {
  143.                 CLK=1;
  144.                 _nop_();
  145.                 _nop_();
  146.                 CLK=0;
  147.                 _nop_();
  148.                 _nop_();
  149.                 dat1=(dat1<<1)|DIO;
  150.         }
  151.         for(i=0;i<8;i++)
  152.         {
  153.                 dat2=dat2|((u8)DIO<<i);
  154.                 CLK=1;
  155.                 _nop_();
  156.                 _nop_();
  157.                 CLK=0;
  158.                 _nop_();
  159.                 _nop_();
  160.         }
  161.         CS=1;
  162.         return(dat1==dat2)?dat1:0x00;
  163. }



  164. void main()
  165. {
  166.         u8 AD;
  167.         u16 d;
  168.         LCD_Init();

  169.         while(1)
  170.         {
  171.                 AD=Get_AD_Result1();//获取AD转换值
  172.                 d=AD*500.0*2/511;
  173.                 BUFF[11]=(d/100) + '0';
  174.                 BUFF[13]=((d/10)%10) +
  175. '0';
  176.                 BUFF[14]=(d%10) + '0';

  177.                 LCD_Show_String(1,0,BUFF);//在第1行显示
  178.         }
  179. }
复制代码


六、思考题回答
1A/DD/A中的DA是什么意思,A/DD/A分别有什么作用?
What is the meaning of D and A in A/D or D/Awhat are the functions of A/D and D/A

Answer:A is analog , D is digital . A/D can change analog signals into digital signals . D/A can change digital signals into analog signals.


2C51程序中为什么要包含头文件reg51.h
Why does the C51 program include the header file reg51.h

Answer:Because reg51.h has function declarations , variable declarations , if you want to use these functions or variables you have to include them.


51hei图片20201213232517.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表