找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3118|回复: 1
收起左侧

单片机+DAC0832数模转化芯片使用例程与仿真

[复制链接]
ID:268717 发表于 2018-7-27 07:19 | 显示全部楼层 |阅读模式
DAC0832数模转化芯片使用例程 程序+仿真 注释非常详细

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

单片机源程序如下:

  1. /***********************************************************
  2. **程序功能:通过DAC0832芯片显示电压值
  3. **程序说明:通过增加电阻值来改变某个值 即显示可变电阻的值
  4. **通信格式:无
  5. *************************************************************/

  6. #include <reg52.h>
  7. #define uchar unsigned char
  8. #define uint unsigned  int
  9. sbit CS=P1^0;       //片选信号      
  10. sbit CLK=P1^1;      //时钟接口
  11. sbit DI=P1^2;       //数据接口

  12. sbit CS1=P2^5;            //片选信号1
  13. sbit CLK1=P2^6;     //时钟接口1
  14. sbit DI1=P2^7;      //数据接口1
  15.   
  16. sbit RS = P2^0;            //LCD数据/命令选择端(H/L)位声明
  17. sbit RW = P2^1;            //LCD读写控制,写为0,读为1
  18. sbit EN = P2^2;            //LCD使能信号端位声明

  19. uchar code table[2]={0xDF,0x43};  //显示温度符号的函数

  20. uchar data disdata[7];           //定义两个用于储存数据的数组
  21. uchar data  data1[7];

  22. void delay(uint i)         //延时子程序
  23. {
  24.         uint j;
  25.         while(i--)
  26.         for(j=0;j<110;j++);  
  27. }

  28. /*************************lcd1602程序**************************/


  29. void wr_com(uchar com)     //写指令
  30. {
  31.    delay(1);
  32.    RS=0;
  33.    RW=0;
  34.    EN=0;
  35.    P0=com;
  36.    delay(1);
  37.    EN=1;
  38.    delay(1);
  39.    EN=0;
  40. }

  41. void wr_dat(uchar dat)     //写数据
  42. {  
  43.    delay(1);
  44.    RS=1;
  45.    RW=0;
  46.    EN=0;
  47.    P0=dat;
  48.    delay(1);
  49.    EN=1;
  50.    delay(1);
  51.    EN=0;
  52. }

  53. void wr_new()              //写新字符
  54. {
  55.         uchar i;
  56.         for(i=0;i<2;i++)
  57.         {
  58.                 wr_dat(table[i]);
  59.                 }
  60. }

  61. void lcd_init()           //初始化设置
  62. {      
  63.         delay(15);
  64.         wr_com(0x38);delay(5);
  65.         wr_com(0x08);delay(5);
  66.         wr_com(0x06);delay(5);
  67.         wr_com(0x0c);delay(5);      
  68.         
  69. }

  70. uchar GetAD0832(uint Channel)
  71. {
  72.         uchar i=0, Data1 =0, Data2 = 0;
  73.         CLK=0;             //时钟置低平
  74.         DI=1;              //开始信号为高电平
  75.         CS=0;              //片选信号置低,启动AD转换芯片
  76.     CLK=1;             //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
  77.         CLK=0;             //时钟下降沿
  78.                            
  79.         DI=1;                            //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
  80.         CLK=1;             //时钟上升沿,输入开始信号
  81.         CLK=0;             //时钟下降沿
  82.        
  83.         DI=Channel ;       //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
  84.         CLK=1;             //时钟上升沿,输入开始信号
  85.         CLK=0;             //时钟下降沿
  86.        
  87.         DI=1 ;             //数据线置高,准备接收数据
  88.     for(i=0;i<8;i++)   //从高位移入数据
  89.   {
  90.     CLK=1;
  91.     CLK=0;             //时钟下降沿,AD0832输出数据,高位(MSB)先
  92.     Data1=Data1<<1;
  93.     if(DI==1)
  94.     {Data1=Data1 | 0x01;}     //数据左移位,补0 ,如果数据为“1”,移入1, 如果数据为“0”,移入0,
  95.    }

  96. for(i=0;i<8;i++)              //从低位移入数据
  97.    {
  98.         Data2=Data2>>1;
  99.         if(DI==1)
  100.         {  Data2=Data2 | 0x80;}   //数据右移位,补0,如果数据为“1”,移入1如果数据为“0”,移入0,
  101.            CLK=1 ;
  102.            CLK=0;                 //时钟下降沿,AD0832输出数据,高位(MSB)先
  103.    }                                    

  104.                 CLK=1;                           //数据线置高,释放总线,完成一次转换
  105.                 DI=1;
  106.                 CS=1;
  107.                
  108. return (Data1==Data2)?Data1:0;  //   如果相等输出data1  or  0
  109.    }

  110. uchar GetAD08321(uint Channel)
  111. {
  112.         uchar i=0, Data1 =0, Data2 = 0;
  113.         CLK1=0;             //时钟置低平
  114.         DI1=1;              //开始信号为高电平
  115.         CS1=0;              //片选信号置低,启动AD转换芯片
  116.         CLK1=1;             //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
  117.         CLK1=0;             //时钟下降沿
  118.                            
  119.         DI1=1;                             //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
  120.         CLK1=1;             //时钟上升沿,输入开始信号
  121.         CLK1=0;             //时钟下降沿
  122.        
  123.         DI1=Channel ;       //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
  124.         CLK1=1;             //时钟上升沿,输入开始信号
  125.         CLK1=0;             //时钟下降沿
  126.        
  127.         DI1=1;              //数据线置高,准备接收数据
  128.     for(i=0;i<8;i++)    //从高位移入数据
  129.   {
  130.     CLK1=1;
  131.     CLK1=0;             //时钟下降沿,AD0832输出数据,高位(MSB)先
  132.     Data1=Data1<<1;
  133.     if(DI1==1)
  134.         {Data1 = Data1 | 0x01;}  //数据左移位,补0 ,如果数据为“1”,移入1, 如果数据为“0”,移入0,
  135.    }

  136. for(i=0;i<8;i++)                 //从低位移入数据
  137.    {
  138.         Data2=Data2>>1;
  139.         if(DI1==1)
  140.         {  Data2=Data2 | 0x80;}      //数据右移位,补0;如果数据为“1”,移入1;如果数据为“0”,移入0,
  141.            CLK1=1 ;
  142.            CLK1=0 ;                  //时钟下降沿,AD0832输出数据,高位(MSB)先
  143.                      }                                    

  144.                 CLK1=1;                          //数据线置高,释放总线,完成一次转换
  145.                 DI1=1;
  146.                 CS1=1;
  147.                
  148. return (Data1==Data2)?Data1:0;  //   如果相等输出data1  or  0
  149.    }


  150.      void main()
  151. {

  152.         uchar AD_val1;               //储存A/D转换后的值
  153.         uchar AD_val2;
  154.         uchar AD_val3;               
  155.         uchar AD_val4;
  156.         delay(1);
  157.         lcd_init();                  //初始化LCD
  158.         delay(1);         

  159.          
  160.       while(1)
  161.       {
  162.                
  163.          
  164.                    AD_val1= GetAD0832(0);            //进行A/D转换
  165.            if(AD_val1!=0)
  166.                         {
  167.                        
  168.                     disdata[1]=AD_val1/100+0x30;     //?位数                                        
  169.                     disdata[2]=AD_val1%100/10+0x30;  //?位数               
  170.                     disdata[3]=AD_val1%10/1+0x30;    //?数位
  171.                        
  172.                         delay(5);
  173.                         wr_com(0x83);
  174.             wr_dat(disdata[1]);              
  175.                         delay(5);
  176.                         wr_dat(disdata[2]);
  177.                         delay(5);                        //延时1ms
  178.                         wr_dat(disdata[3]);
  179.                         wr_new();
  180.                          }


  181.                         AD_val2= GetAD0832(1);           //进行A/D转换
  182.            if(AD_val2!=0)
  183.                         {
  184.                        
  185.                     disdata[4]=AD_val2/100+0x30;     //?位数                                        
  186.                     disdata[5]=AD_val2%100/10+0x30;  //?位数                                        
  187.                     disdata[6]=AD_val2%10/1+0x30;    //?数位

  188.                         delay(5);
  189.                         wr_com(0x89);
  190.             wr_dat(disdata[4]);              
  191.                         delay(5);
  192.                         wr_dat(disdata[5]);                                                                          
  193.                         delay(5);                        //延时5ms
  194.                         wr_dat(disdata[6]);
  195.                         wr_new();
  196.                           }


  197.                          AD_val3= GetAD08321(0);         //进行A/D转换
  198.                         if(AD_val3!=0)
  199.                         {
  200.                        
  201.                     disdata[1]=AD_val3/100+0x30;     //?位数                                        
  202.                     disdata[2]=AD_val3%100/10+0x30;  //?位数               
  203.                     disdata[3]=AD_val3%10/1+0x30;    //?数位

  204.                         delay(5);
  205.                         wr_com(0xc3);
  206.             wr_dat(disdata[1]);            
  207.                         delay(5);
  208.                         wr_dat(disdata[2]);
  209.                         delay(5);                        //延时5ms
  210.                         wr_dat(disdata[3]);
  211.                         wr_new();
  212.                          }


  213.                          AD_val4= GetAD08321(1);         //进行A/D转换
  214.                          if(AD_val4!=0)
  215.                         {
  216.                        
  217.                     disdata[4]=AD_val4/100+0x30;     //?位数                                        
  218.                     disdata[5]=AD_val4%100/10+0x30;  //?位数               
  219.                     disdata[6]=AD_val4%10/1+0x30;    //?数位

  220.                         delay(5);
  221.                         wr_com(0xc9);
  222.             wr_dat(disdata[4]);              
  223.                         delay(5);
  224.                         wr_dat(disdata[5]);
  225.                         delay(5);                        //延时5ms
  226.                         wr_dat(disdata[6]);
  227.                         wr_new();
  228.                          }
  229.        }
  230. }
复制代码

所有资料51hei提供下载:
20161111144-李作鑫-DAC0832.rar (110.17 KB, 下载次数: 25)

评分

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

查看全部评分

回复

使用道具 举报

ID:212262 发表于 2018-7-29 10:47 | 显示全部楼层
你这是adc0832吧,不是dac0832
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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