找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ADC0808/0809以及j基于51单片机数字电压表Proteus仿真程序

[复制链接]
ID:990643 发表于 2021-12-12 20:37 | 显示全部楼层 |阅读模式
单片机电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
N9`KCN3(UVYIH}@CPVR(MG3.png 51hei.gif

ADC0808/0809是8位CMOS逐次逼近型A/D转换器,它们的主要区别是ADC0808的最小误差为±1/2LSB,0809为±1LSB。采用单一+5V电源供电,工作温度范围宽。每片ADC0808有8路模拟量输入通道,带转换起停控.

)XBO4L(O]~]E2(O6AA)G_9O.png

ALE:地址锁存允许信号,输入,高电平有效。

START:A/D转换启动信号,输入,高电平有效。

EOC:A/D转换结束信号,输出。

OE:数据输出允许信号,输入,高电平有效。

CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。

VREF+、VREF-:基准电压输入端。在多数情况下,VREF+接+5V,VREF-接GND。

VCC:电源,接+5V电源。

GND:地。


单片机源程序如下:
  1. #include "reg51.h"
  2. sbit start=P3^0;
  3. sbit eoc=P3^1;
  4. sbit oe=P3^2;
  5. sbit RS=P3^3;
  6. sbit RW=P3^4;
  7. sbit E=P3^5;
  8. unsigned int vol=0;
  9. unsigned char arr[]={"0123456789"};
  10. unsigned char str[]={"VOLTAGE:"};

  11. void delay(unsigned int n)//延时函数
  12. {
  13.   unsigned int i,j;
  14.         for(i=0;i<n;i++)
  15.         {
  16.           for(j=0;j<120;j++);
  17.         }
  18. }

  19. void adc()
  20. {
  21.   start=0; // 关闭A/D转换启动信号
  22.   start=1; // 打开A/D转换启动信号
  23.   delay(5);
  24.   start=0; // 关闭A/D转换启动信号
  25.   while(eoc!=1);//判断A/D转换结束信号是否为1,1则转换完成,输出
  26.         oe=1;   //数据输出允许信号
  27.         vol=P2;//读取数据结果
  28.         oe=0;//数据输出允许信号
  29. }

  30. void writecom(unsigned char com)//写命令函数
  31. {
  32.   RS=0; //  RS:数据/命令选择端
  33.         RW=0;//  R/W :读/写选择端
  34.         E=0; //  使能端:下降沿有效
  35.         delay(5);
  36.         P1=com;
  37.         E=1;
  38.         E=0;
  39. }

  40. void writedat(unsigned char dat)//写数据函数
  41. {
  42.   RS=1; //  RS:数据/命令选择端
  43.         RW=0;//  R/W :读/写选择端
  44.         E=0; //  使能端:下降沿有效
  45.         delay(5);
  46.         P1=dat;
  47.         E=1;
  48.         E=0;
  49. }

  50. void initlcd()//初始化LCD1602
  51. {
  52.   writecom(0x38); //0x38;设置16×2显示
  53.         writecom(0x0c); //0x0C:设置开显示,不显示光标
  54.         writecom(0x06); //0x06:写一个字符后地址指针加1
  55.         writecom(0x01); //0x01:显示清0,数据指针清0
  56. }

  57. void display()//显示函数
  58. {
  59.         unsigned int i=0;
  60.   unsigned char temp0=0,temp1=0,temp2=0;
  61.         vol=(vol*100)/51; //  255/5=51
  62.         temp0=vol/100;
  63.         temp1=(vol%100)/10;
  64.         temp2=vol%10;
  65.         
  66.   writecom(0x80);//0x80:LCD第一行的起始地址
  67.         delay(5);
  68.         for(i=0;i<8;i++)//显示字符串 VOLTAGE:
  69.         {
  70.           writedat(str[i]);
  71.                 delay(5);
  72.         }
  73.         
  74.         writecom(0x80+0x40+8);// 0x80+0x40+8 LCD第二行的起始地址+8个字符
  75.   delay(5);
  76.   writedat(arr[temp0]);
  77.   delay(5);
  78.         writedat('.');
  79.         delay(5);
  80.         writedat(arr[temp1]);
  81.   delay(5);
  82.   writedat(arr[temp2]);
  83.   delay(5);
  84.   writedat('V');
  85.   delay(5);
  86. }

  87. void main()
  88. {
  89.         initlcd();
  90.   while(1)
  91.         {
  92.           adc();
  93.                 display();
  94.         }
  95. }
复制代码

仿真+Keil代码下载: 数字电压表.zip (156.46 KB, 下载次数: 87)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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