找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ADC0832数字电压表仿真图+单片机C程序

[复制链接]
跳转到指定楼层
楼主
使用单片机AT89C52和ADC0832芯片设计数字电压表,通过测量0-5V之间的直流电压值,并将测得的电压数值信息显示在LED数码管(SH3461BS),从而达到测量电压的目的。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #include <intrins.h>


  5. //数码管段选定义      0     1    2    3    4    5        6         7          8           9       
  6. uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
  7.                                            0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //段码
  8. //数码管位选定义
  9. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  10. uchar dis_smg[8]  = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};       
  11. uchar smg_i = 3;    //显示数码管的个位数

  12. sbit SCL=P2^2;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
  13. sbit DO=P2^3;                //DO定义为P1口的第4位脚,连接ADC0832DO脚
  14. sbit CS=P2^0;                //CS定义为P1口的第4位脚,连接ADC0832CS脚

  15. uint p1[9];


  16. /***********************1ms延时函数*****************************/
  17. void delay_1ms(uint q)
  18. {
  19.         uint i,j;
  20.         for(i=0;i<q;i++)
  21.                 for(j=0;j<120;j++);
  22. }

  23. /***********读数模转换数据********************************************************/       
  24. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
  25.                                                 //  1  1  0 通道
  26.                                                 //  1  1  1 通道
  27. unsigned char ad0832read(bit SGL,bit ODD)
  28. {
  29.         unsigned char i=0,value=0,value1=0;               
  30.                 SCL=0;
  31.                 DO=1;
  32.                 CS=0;                //开始
  33.                 SCL=1;                //第一个上升沿       
  34.                 SCL=0;
  35.                 DO=SGL;
  36.                 SCL=1;          //第二个上升沿
  37.                 SCL=0;
  38.                 DO=ODD;
  39.                 SCL=1;           //第三个上升沿
  40.                 SCL=0;           //第三个下降沿
  41.                 DO=1;
  42.                 for(i=0;i<8;i++)
  43.                 {
  44.                         SCL=1;
  45.                         SCL=0; //开始从第四个下降沿接收数据
  46.                         value<<=1;
  47.                         if(DO)
  48.                                 value++;                                               
  49.                 }
  50.                 for(i=0;i<8;i++)
  51.                 {                        //接收校验数据
  52.                         value1>>=1;
  53.                         if(DO)
  54.                                 value1+=0x80;
  55.                         SCL=1;
  56.                         SCL=0;
  57.                 }
  58.                 CS=1;
  59.                 SCL=1;       
  60.                 if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0       
  61.                         return value;
  62.         return 0;
  63. }


  64. /***********************数码显示函数*****************************/
  65. void display()
  66. {
  67.         uchar i;
  68.         for(i=0;i<smg_i;i++)
  69.         {       
  70.                 P1 = 0xff;                         //消隐                                           
  71.                 P3 = smg_we[i];                          //位选
  72.                 P1 = dis_smg[i];                 //段选             
  73.                 delay_1ms(1);                         
  74.         }       
  75. }

  76.        
  77. /************ 排序***************/
  78. void pingjun_zhi(uint *p)
  79. {
  80.         static uint value;
  81.         static uchar i,j;
  82.         for(j=1;j<9;j++)                   //先对整个数组的9个值进行从小到大的排列
  83.                 for(i=0;i<9 - j;i++)
  84.                 {
  85.                         if(p[i] > p[i+1])
  86.                         {
  87.                                 value = p[i];
  88.                                 p[i] = p[i+1];
  89.                                 p[i+1] = value;               
  90.                         }       
  91.                 }
  92. }





  93. /*****************主函数********************/
  94. void main()
  95. {
  96.         static uchar i,j;
  97.         uint temp;
  98.         while(1)
  99.         {
  100.                 display();                  //数码管显示函数
  101.                 if(i % 3 == 0)          //循环10次
  102.                 {       
  103.                         pingjun_zhi(p1);         //把数从小到大排序
  104.                        
  105.                         p1[j++] = ad0832read(1,0);        //循环255个周期读取一次0832,因CPU运行比较快,没必要每次循环都去读取,选择通过CH0输入               
  106.                         if(j >= 9)
  107.                         {
  108.                                 j = 0;
  109.                                 temp = p1[3] ;    //取个中间值
  110.                                 temp = temp * 100 / 255 * 4.5 * 2;
  111.                         dis_smg[2]=smg_du[temp/100%10] & 0xdf;        //得到百位                               
  112.                         dis_smg[1]=smg_du[temp/10%10];        //十位
  113.                         dis_smg[0]=smg_du[temp%10];            //个位        ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示
  114.                         }

  115.                 }
  116.                 i++;
  117.         }
  118. }
复制代码

所有资料51hei提供下载:
ADC0832数字电压表仿真图+C程序.rar (43.6 KB, 下载次数: 63)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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