标题: 基于51单片机ADC采集,热敏电阻制作温度计程序 [打印本页]

作者: 刚刚好黑科技    时间: 2018-2-25 16:36
标题: 基于51单片机ADC采集,热敏电阻制作温度计程序
1602显示温度计程序.rar (28.2 KB, 下载次数: 105)


单片机源程序如下:
  1. #include<AT89x51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. //******************adc0832****************************//
  6. //AD
  7. sbit CLK=P2^1;
  8. sbit CS=P2^2;
  9. sbit DO=P2^3;
  10. sbit DI=P2^3;

  11.   //继电器

  12. sbit jidian=P3^3;
  13. sbit jidguan=P3^0;

  14. //数码管显示
  15. sbit fist=P2^7;
  16. sbit seconed=P2^6;
  17.   sbit three=P2^5;
  18.   sbit forth=P2^4;
  19. sbit k1=P3^4;
  20. sbit k2=P3^5;
  21. sbit k3=P3^6;
  22. sbit k4=P3^7;


  23. //char CC[]="11001001";
  24. uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  25. uchar temp;
  26. int y,a=-13;
  27. uint vvv,i;


  28. //通道的选择:0x02就是单通道0;0x03就是单通道1;
  29. //0x00就是双通道ch0="+";   ch0="-"
  30. //0x01就是双通道ch0="-";   ch0="+"
  31. //*****************************************************//
  32. void delay(int tt)
  33. {       


  34. while(tt--)
  35.   {for(i=0;i<120;i++);}
  36. }
  37. void startADC()                                          
  38. {
  39. CS=1;
  40. _nop_();
  41. _nop_();
  42. CLK=0;
  43. _nop_();
  44. _nop_();
  45. CS=0;
  46. _nop_();
  47. _nop_();
  48. DI=1;
  49. _nop_();
  50. _nop_();
  51. CLK=1;
  52. _nop_();
  53. _nop_();
  54. DI=0;
  55. _nop_();
  56. _nop_();
  57. CLK=0;
  58. _nop_();                                                 
  59. _nop_();
  60. }
  61. void choiceADC(uint CH)//CH为0选择通道ch0,为1,选择ch1进行AD转换
  62. {
  63. startADC();
  64. if(CH==0)
  65. {
  66. DI=1;
  67. _nop_();
  68. CLK=1;//上升沿DI=1
  69. _nop_();
  70. CLK=0;//1个下降沿DI=1
  71. _nop_();
  72. DI=0;
  73. _nop_();
  74. CLK=1;
  75. _nop_();
  76. CLK=0;//第3个上升沿DI=0
  77. _nop_();
  78. }
  79. else
  80. {
  81. CLK=0;
  82. _nop_();
  83. DI=1;
  84. _nop_();
  85. CLK=1;//上升沿DI=1                               
  86. _nop_();
  87. CLK=0;//1个下降沿DI=1
  88. _nop_();
  89. DI=1;
  90. _nop_();
  91. CLK=1;//第3个上升沿DI=0
  92. _nop_();
  93. }
  94. /********通道选择结束开始读取转换后的二进制数****/
  95. CLK=1;
  96. _nop_();
  97. CLK=0;//下降沿读数,一下进行判断和处理,共8次
  98. for(i=0;i<8;i++)
  99.       {
  100.    DI=1;
  101.    if(DO)
  102.       {
  103.    temp |=0x01;
  104.    }
  105.     else
  106.       {
  107.    temp &=0xfe;                                  
  108.    }
  109.       CLK=0;
  110.    _nop_();
  111.    CLK=1;
  112.    temp=temp<<1;
  113.    }
  114. //         vvv=temp;
  115. //   if(temp<62)          vvv=30;
  116. //    else         if(temp>62&&temp<68)        vvv=50;
  117. //   else         if(temp>68&&temp<70)        vvv=100;
  118. //   else         if(temp>70&&temp<80)        vvv=101;
  119. //    else         if(temp>80)        vvv=102;
  120.                 y=a/6*(temp+16)+434;
  121.   
  122. }



  123. void display(uint dat)
  124. {
  125. //P2=0x80;
  126. fist=0; delay(1); fist=1;       
  127.            seconed=0;         three=0;  forth=0;
  128. P0=tab[dat/1000];
  129. //delay(1);
  130. //P0=0xff;

  131. //P2=0x40;
  132. seconed=0; delay(1);  seconed=1;       
  133.   fist=0;          three=0; forth=0;
  134. P0=tab[dat%1000/100];
  135. //delay(1);
  136. //P0=0xff;

  137. //P2=0x20;
  138. three=0; delay(1);          three=1;
  139.                         fist=0;         seconed=0; forth=0;
  140. P0=tab[dat%100/10];
  141. //delay(1);
  142. //P0=0xff;

  143. //P2=0x10;
  144. forth=0; delay(1); forth=1;
  145.                         fist=0; seconed=0;         three=0;
  146. P0=tab[dat%10];
  147. //delay(1);
  148. //P0=0xff;
  149. }
  150.    
  151. void main()            
  152. {          int i;
  153. jidian=0;jidguan=0;

  154.         P0=0xff;
  155.         while(1){        
  156.          choiceADC(0);
  157.    delay(1);
  158.    display(temp);       
  159.         if(k3==0){i=1;
  160.    while(i)
  161.    {
  162.       choiceADC(0);
  163.    delay(1);
  164.    
  165.        
  166.   
  167.    

  168.                
  169. //                if(k1==0)
  170. //                {
  171. //          delay(50);
  172. //                if(k1==0)
  173. //                {temp++;
  174. //                if(temp>255) {temp=0;}
  175. //                while(!k1);//
  176. //                }
  177. //          }
  178. //               
  179. //                if(k2==0)
  180. //                {
  181. //         delay(500);
  182. //                if(k2==0)
  183. //                {temp--;
  184. //                if(temp<0) {temp=255;}
  185. //                while(!k2);//
  186. //               
  187. //                }
  188. //          }
  189.                

  190.            display(y);
  191.          if(y<30) { jidian=0;jidguan=0;P1=0xfe; }        //慢  1盏绿灯亮
  192.         else if(y>32) {jidian=1;jidguan=1;P1=0xda; }         //快  3盏绿灯亮
  193.                   
  194.                 if(k4==0) {i=0;jidian=0;jidguan=1;P1=0xf7;}//开关停止,红灯亮



  195.    }
  196.    }
  197. }
  198.            }
复制代码





作者: a92031180    时间: 2018-4-3 08:58
好东西,多谢分享
作者: 大米饭    时间: 2018-4-3 10:35
精度做到多少?回头再研究你的代码……
作者: 249449417@qq.co    时间: 2019-3-22 14:17
长知识啦
作者: 249449417@qq.co    时间: 2019-3-22 14:18
非常不错
作者: s3861592    时间: 2020-1-14 21:33
谢谢大神




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1