[DemoCode下载] DS18B20和ADC0832共同使用

[复制链接]
1174|1
 楼主| dentsgot 发表于 2016-3-26 23:14 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define  uchar  unsigned char
  3. sbit DQ=P1^4;
  4. uchar data    temp_data[2]={0x00,0x00};
  5. uchar data    display[5]={0x00,0x00,0x00,0x00,0x00};
  6. unsigned char code  ditab[16] ={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  7.                                                           0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
  8. //共阴数码管
  9. uchar code table[11] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 0,1,2,3,4,5 ,6,7,8,9,百位或当最高位十位为0时不显示
  10. uchar code table1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位带有小数点的显示

  11.     //以下为水位显示区域
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. #define ulong unsigned long
  15. #define _rrca_()          CY   = ACC & 0x01           //产生RRC A指令
  16. #define _rlca_()          CY   = ACC & 0x80           //产生RLC A指令
  17. sbit bADcs=P1^7;
  18. sbit bADcl=P1^6;
  19. sbit bADda=P1^5;
  20. sbit flag=P1^3;
  21. //sbit str=P2^7;
  22. //sbit d=P2^6;
  23. //sbit clk=P2^5;
  24. bit choose=0;
  25. unsigned char data1;
  26. unsigned char count;
  27. unsigned char cycle;
  28. uint ge,xiao1,xiao2;
  29. unsigned long data2;
  30. unsigned char  code tablewe[]=
  31. {
  32. 0xFE,0xFD,0xFB,0xF7,
  33. 0xEF,0xDF,0xBF,0x7F
  34. };//自己写的
  35. void delay_18b20(unsigned int i)
  36. {
  37. while(i--);
  38. }
  39. //函数区域水位
  40. void Delayus(uchar i)
  41. {
  42.   while(--i);
  43. }
  44. void ad(void)
  45. {    uchar i;
  46.      //data1=0;
  47.      bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
  48.   bADcl=0;
  49.   bADda=1;
  50.   bADcl=1;
  51.   bADcl=0;//i down
  52.   bADda=1;
  53.   bADcl=1;
  54.   bADcl=0; //   2 down
  55.   bADda=0;
  56.   bADcl=1;
  57.   bADcl=0; //   3 down
  58.   bADda=1;
  59.   bADcl=1;
  60.   bADcl=0; //   4 down

  61.   for(i=8;i>0;i--)
  62.    {
  63.   
  64.    data1<<=1;
  65.    bADcl=0;
  66.   bADcl=1;
  67.   if(bADda==1) data1|=0x01;
  68.       bADda=1;
  69.    }
  70.    bADcs=1;

  71. }
  72. void cal()
  73. {
  74. data2=((ulong)data1*493)/252.5;
  75. ge=data2/100;
  76. xiao1=(data2%100)/10;
  77. xiao2=data2%10;

  78. }

  79. display2()
  80. {
  81.       P2=tablewe[4];                     //P2口低四位位选
  82.       P0=0x00;        //P0口数码管段选第五个数码管不用
  83.    delay_18b20(50);

  84.            P2=tablewe[5];
  85.       P0=table1[ge];
  86.    delay_18b20(50);
  87.            P2=tablewe[6];
  88.       P0=table[xiao1];
  89.       delay_18b20(50);
  90.            P2=tablewe[7];
  91.      P0=table[xiao2];



  92. }

  93. //以上为水位函数




  94. //初始化函数
  95. Init_DS18B20(void)
  96. {
  97. unsigned char x=0;
  98. DQ=1;     //DQ复位
  99. delay_18b20(8);   //稍做延时
  100. DQ=0;     //单片机将DQ拉低
  101. delay_18b20(80);  //精确延时 大于 480us
  102. DQ=1;     //拉高总线
  103. delay_18b20(14);
  104. x=DQ;       //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  105. delay_18b20(20);
  106. }




  107. ReadOneChar(void)
  108. {
  109. unsigned char i=0;
  110. unsigned char dat=0;

  111. for(i=8;i>0;i--)
  112.     {
  113.       DQ=0; // 给脉冲信号
  114.       dat>>=1;
  115.       DQ=1; // 给脉冲信号

  116.       if(DQ)
  117.        dat|=0x80 ;
  118.       delay_18b20(4) ;
  119.     }

  120.       return (dat) ;
  121. }



  122. WriteOneChar(unsigned char dat)
  123. {
  124.     unsigned char i=0;
  125.     for(i=8;i>0;i--)
  126.     {
  127.       DQ=0;
  128.       DQ=dat&0x01;
  129.       delay_18b20(5);

  130.       DQ=1;
  131.       dat>>=1;
  132.     }
  133. }



  134. Read_Temperature(void)
  135. {
  136.        Init_DS18B20() ;

  137.        WriteOneChar(0xCC) ;    // 跳过读序号列号的操作
  138.        WriteOneChar(0x44) ;    // 启动温度转换

  139.        Init_DS18B20() ;
  140.        WriteOneChar(0xCC) ;    //跳过读序号列号的操作
  141.        WriteOneChar(0xBE) ;    //读取温度寄存器
  142.        temp_data[0] = ReadOneChar();     //温度低8位
  143.        temp_data[1] = ReadOneChar();     //温度高8位
  144. }




  145. Disp_Temperature()
  146. {
  147.     display[4]=temp_data[0]&0x0f;
  148.     display[0]=ditab[display[4]];       //查表得小数位的值

  149.     display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  150.     display[3]=display[4]/100 ;
  151.     display[1]=display[4]%100 ;
  152.     display[2]=display[1]/10;
  153.     display[1]=display[1]%10;

  154.      if(display[3]==0)          //高位为0,不显示
  155.      {
  156.        display[3]=10 ;            
  157.        if(display[2]==0)        //次高位为0,不显示
  158.        display[2]=10 ;
  159.      }
  160. }

  161. display1()
  162. {

  163.       P2=tablewe[0];                     //P2口低四位位选
  164.       P0=table[display[3]];        //P0口数码管段选
  165.    delay_18b20(50);

  166.            P2=tablewe[1];
  167.       P0=table[display[2]];
  168.    delay_18b20(50);
  169.            P2=tablewe[2];
  170.       P0=table1[display[1]];
  171.       delay_18b20(50);
  172.            P2=tablewe[3];
  173.      P0=table[display[0]];

  174. }

  175. void main()
  176. {
  177.    while(1)
  178.     { Read_Temperature();
  179.    Disp_Temperature();
  180. display1();
  181.        ad();
  182.           cal();
  183.   display2();
  184.    
  185.     }
  186. }


ideafor 发表于 2016-3-26 23:22 | 显示全部楼层
一个是并口,一个是i2c,这个程序不难写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

164

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部