找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1802|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的ADC0832数字电压表程序Proteus仿真,可调

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit CS=P3^5;
  4. sbit CLK=P3^3;
  5. sbit DI=P3^4;
  6. sbit DO=P3^4;
  7. sbit dot=P0^5;                //小数点

  8. unsigned char dat=0x00;
  9. unsigned char nums[]={0x00,0x00,0x00,0x00};
  10. unsigned char channel;                //转换通道
  11. unsigned char LEDS[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28};                //共阳4位数码管段码,字符显示从'0'到'9'

  12. unsigned char ADC0832(unsigned char channel)                //模数转换
  13. {
  14.         unsigned char i;
  15.         unsigned char x=0x00;
  16.         unsigned char y=0x00;
  17.        
  18.         CLK=0;                //初始化
  19.         DI=1;
  20.         _nop_();
  21.         CS=0;
  22.         _nop_();
  23.         CLK=1;
  24.         _nop_();
  25.        
  26.         if(channel==0x00)                //通道选择
  27.         {                //通道0
  28.                 CLK=0;
  29.                 DI=1;
  30.                 _nop_();
  31.                 CLK=1;
  32.                 _nop_();
  33.                 CLK=0;
  34.                 DI=0;
  35.                 _nop_();
  36.                 CLK=1;
  37.                 _nop_();
  38.         }
  39.         else                //通道1
  40.         {
  41.                 CLK=0;
  42.                 DI=1;
  43.                 _nop_();
  44.                 CLK=1;
  45.                 _nop_();
  46.                 CLK=0;
  47.                 DI=1;
  48.                 _nop_();
  49.                 CLK=1;
  50.                 _nop_();
  51.         }
  52.        
  53.         CLK=0;
  54.         DI=1;
  55.         for(i=0;i<8;i++)                //读取ADC0832输出的前8位数据
  56.         {
  57.                 x<<=1;
  58.                 _nop_();
  59.                 CLK=1;
  60.                 _nop_();
  61.                 CLK=0;
  62.                 if(DO==1)
  63.                 {
  64.                         x|=0x01;
  65.                 }
  66.                 else
  67.                 {
  68.                         x|=0x00;
  69.                 }
  70.         }
  71.         for(i=0;i<8;i++)                //读取ADC0832输出的后8位数据
  72.         {
  73.                 y>>=1;
  74.                 if(DO==1)
  75.                 {
  76.                         y|=0x80;
  77.                 }
  78.                 else
  79.                 {
  80.                         y|=0x00;
  81.                 }
  82.                 _nop_();
  83.                 CLK=1;
  84.                 _nop_();
  85.                 CLK=0;
  86.         }
  87.         if(x==y)                //校验,比较前8位与后8位的值
  88.         {
  89.                 dat=x;
  90.         }
  91.         _nop_();
  92.         CS=1;                //释放ADC0832
  93.         DO=1;
  94.         CLK=1;
  95.         return dat;
  96. }

  97. void Convert(unsigned char dat0)                //数据处理
  98. {
  99.         unsigned int x;
  100.         x=dat0*0.0196*100*5;
  101.         nums[0]=x/1000;
  102.         nums[1]=x%1000/100;
  103.         nums[2]=x%1000%100/10;
  104.         nums[3]=x%1000%100%10;
  105. }

  106. void Delay()                //数码管显示
  107. {
  108.         unsigned char i,j;
  109.         for(i=0;i<1;i++)
  110.         {
  111.                 for(j=0;j<121;j++);
  112.         }
  113. }

  114. void Display()
  115. {
  116.         P0=LEDS[nums[0]];
  117.         P2=0xFE;
  118.         Delay();
  119.         P2=0xFF;
  120.        
  121.         P0=LEDS[nums[1]];
  122.         dot=0;
  123.         P2=0xFD;
  124.         Delay();
  125.         P2=0xFF;
  126.        
  127.         P0=LEDS[nums[2]];
  128.         P2=0xFB;
  129.         Delay();
  130.         P2=0xFF;
  131.        
  132.         P0=LEDS[nums[3]];
  133.         P2=0xF7;
  134.         Delay();
  135.         P2=0xFF;
  136. }

  137. void main()
  138. {
  139.         while(1)
  140.         {
  141.                 dat=ADC0832(channel);
  142.                 Convert(dat);
  143.                 Display();
  144.         }
  145. }
复制代码

Proteus8.8仿真下载:
51数字电压表.7z (25.35 KB, 下载次数: 76)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1025148 发表于 2022-5-9 18:02 | 只看该作者
可以做基于tlc1549的吗
回复

使用道具 举报

板凳
ID:1025148 发表于 2022-5-9 18:03 | 只看该作者
基于tlc1549可以吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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