找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds18b20温度检测程序带电路图和pcb文件

[复制链接]
跳转到指定楼层
楼主
ds18b20电路图和pcb文件:

温度检测的所有资料:

全部资料(压缩包)下载:
温度检测程序带电路图仿真.rar (741.23 KB, 下载次数: 99)

  1. #include <STC15F2K60S2.H>
  2. #include "intrins.h"

  3. #define FOSC    18432000L
  4. #define BAUD    9600

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. #define     URMD    0           //0:使用定时器2作为波特率发生器
  8.                                 //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
  9.                                 //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器

  10. sfr ADC_LOW2    =   0xBE;           //ADC低2位结果

  11. #define SDAT                 P00                         //595数据口
  12. #define SHCP                 P01                                //595时钟口
  13. #define STCP                 P02                                //595数据输出脉冲口
  14. #define K1                   P33
  15. #define K2                   P34
  16. #define K3                   P35
  17. #define K4                   P36
  18. #define delay1                 P07                                //继电器1
  19. #define delay2                 P06                                //继电器2
  20. #define DPL                 14                                //显示L时数据下标
  21. #define DPH                 12                                //显示H时数据下标
  22. #define DPt                 15                                //显示t时数据下标

  23. #define ADC_POWER   0x80            //ADC电源控制位
  24. #define ADC_FLAG    0x10            //ADC完成标志
  25. #define ADC_START   0x08            //ADC起始控制位
  26. #define ADC_SPEEDLL 0x00            //540个时钟
  27. #define ADC_SPEEDL  0x20            //360个时钟
  28. #define ADC_SPEEDH  0x40            //180个时钟
  29. #define ADC_SPEEDHH 0x60            //90个时钟

  30. unsigned char code dispTab[]={
  31. //0   1    2        3         4          5           6        7         8          9           -    灭         H          h           L        t
  32. 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0x89,0x8b,0xc7,0x87};
  33. unsigned int ad_value[11]={0};
  34. unsigned char testflag=0,testnumber=0;
  35. //按键检测标志位
  36. bit flag1,flag2,flag3,flag4;
  37. //按键值  0 1 2 3 4
  38. unsigned char key_value=0;
  39. BYTE ch= 7;                                                         //ADC通道号
  40. unsigned char data dispBuf[4]={1,2,3,4};
  41. //  0:等待运行状态   1:设定下限报警   2:设定工作温度   3:设定上限报警   4:工作状态
  42. unsigned char system_status=0;
  43. //定义变量      下限报警         上限报警           工作温度                   当前温度
  44. unsigned int l_limit_alarm=0,h_limit_alarm=3000,working_temperature=2200,current_temperature=0;
  45. //下限报警标志   上限报警标志
  46. bit LL_flag,HH_flag;

  47. void InitUart();
  48. void SendData(BYTE dat);
  49. void Delay(WORD n);
  50. void InitADC();
  51. void disp(unsigned char data * dispBuf,unsigned char n);


  52. void key_processing()
  53. {
  54.         static unsigned int set_value=0;
  55.          if(system_status==0)
  56.          {
  57.                  if(key_value==1){system_status=1;set_value=l_limit_alarm/10;}
  58.                  if(key_value==4){system_status=4;}
  59.                  key_value=0;
  60.                  disp(dispBuf, 4);
  61.          }
  62.          if(system_status==1)
  63.          {
  64.                  if(key_value==1)
  65.                 {
  66.                         system_status=2;
  67.                         l_limit_alarm=set_value*10;
  68.                         set_value=working_temperature/10;
  69.                 }
  70.                 if(key_value==2){if(set_value<300)set_value++;}
  71.                 if(key_value==3){if(set_value>0)  set_value--;}
  72. //                if(system_status!=2)
  73. //                {
  74.                         dispBuf[0]=DPL;
  75.                         dispBuf[1]=set_value/100;
  76.                         dispBuf[2]=set_value%100/10;
  77.                         dispBuf[3]=set_value%10;
  78. //                }
  79.                 key_value=0;
  80.         }
  81.         if(system_status==2)
  82.         {
  83.                 if(key_value==1)
  84.                         {
  85.                                 system_status=3;
  86.                                 working_temperature=set_value*10;
  87.                                 set_value=h_limit_alarm/10;
  88.                         }
  89.                 if(key_value==2){if(set_value<300)set_value++;}
  90.                 if(key_value==3){if(set_value>0)  set_value--;}
  91. //                if(system_status!=3)
  92. //                {
  93.                         dispBuf[0]=DPt;
  94.                         dispBuf[1]=set_value/100;
  95.                         dispBuf[2]=set_value%100/10;
  96.                         dispBuf[3]=set_value%10;
  97. //                }
  98.                 key_value=0;
  99.         }
  100.         if(system_status==3)
  101.         {
  102.                 if(key_value==1)
  103.                         {
  104.                         system_status=0;
  105.                         h_limit_alarm=set_value*10;
  106.                         }
  107.                 if(key_value==2){if(set_value<300)set_value++;}
  108.                 if(key_value==3){if(set_value>0)  set_value--;}
  109. //                if(system_status!=0)
  110. //                {
  111.                         dispBuf[0]=DPH;
  112.                         dispBuf[1]=set_value/100;
  113.                         dispBuf[2]=set_value%100/10;
  114.                         dispBuf[3]=set_value%10;
  115. //                }
  116.                 key_value=0;
  117.         }
  118.         if(system_status==4)
  119.         {
  120.                 if(key_value==4)system_status=0;
  121.         }                                                               
  122.         key_value=0;
  123. }
  124. void key_test()
  125. {
  126.          if(K1==0)flag1=1;
  127.          if(K2==0)flag2=1;
  128.          if(K3==0)flag3=1;
  129.          if(K4==0)flag4=1;
  130.          if((K1==1)&&(flag1==1)){key_value=1;flag1=0;}
  131.          if((K2==1)&&(flag2==1)){key_value=2;flag1=0;}
  132.          if((K3==1)&&(flag3==1)){key_value=3;flag1=0;}
  133.          if((K4==1)&&(flag4==1)){key_value=4;flag1=0;}
  134. }
  135. void calculate_temperature()
  136. {
  137.         unsigned char i=0;
  138.         ad_value[10]=0;
  139.         for(i=0;i<10;i++)ad_value[10]+=ad_value[i];
  140.         ad_value[10]/=10;
  141.         current_temperature=ad_value[10]=ad_value[10]*3.0435;
  142.         if(system_status==0||system_status==4)
  143.         {
  144.                 dispBuf[0]=ad_value[10]/100;
  145.                 dispBuf[1]=ad_value[10]%1000/100;
  146.                 dispBuf[2]=ad_value[10]%100/10;
  147.                 dispBuf[3]=ad_value[10]%10;
  148.         }
  149. }


  150. void Timer0Init(void)
  151. {
  152.         AUXR |= 0x80;
  153.         TMOD &= 0xF0;
  154.         TL0 = 0x00;
  155.         TH0 = 0x28;
  156.         TF0 = 0;
  157.         TR0 = 1;
  158.         ET0=1;
  159. }
  160. void tm0_isr() interrupt 1 using 1
  161. {
  162.         static unsigned char f=0;
  163.         f++;
  164.         if(f%10==0)ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  165.         if(f==200)
  166.         {
  167.         if(LL_flag)P25^=1;
  168.         else P25=1;
  169.         if(HH_flag)P26^=1;
  170.         else P26=1;
  171.         f=0;
  172.         }
  173. }

  174. void sendData_595(unsigned char sendDat)
  175. {        unsigned char i;
  176.          for(i=0;i<8;i++)
  177.         {        if((sendDat&0x01)==0) SDAT=0;
  178.                  else  SDAT=1;
  179.                 _nop_();
  180.                 SHCP=0;
  181.                 _nop_();
  182.                 SHCP=1;
  183.                 sendDat=sendDat>>1;
  184.         }
  185. }
  186. void disp(unsigned char data * dispBuf,unsigned char n)
  187. {        unsigned char c,i;
  188.          for(i=0;i<n;i++)
  189.         {c=dispBuf[i];
  190.          if(i!=2)
  191.          sendData_595(dispTab[c]);
  192.          else sendData_595(dispTab[c]&0x7f);
  193.         }
  194.         STCP=0;
  195.         STCP=1;
  196. }

  197. /*----------------------------
  198. ADC中断服务程序
  199. ----------------------------*/
  200. void adc_isr() interrupt 5 using 2
  201. {
  202.     ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志

  203.     SendData(ch);                   //显示通道号
  204.     SendData(ADC_RES);              //读取高8位结果并发送到串口

  205.     SendData(ADC_LOW2);           //显示低2位结果

  206.     ad_value[testnumber]=ADC_RES;
  207.         ad_value[testnumber]<<=2;
  208.         ad_value[testnumber]+=ADC_LOW2;
  209.         testnumber++;
  210.         if(testnumber>=10) testnumber=0;
  211.         testflag=1;
  212. }

  213. /*----------------------------
  214. 初始化ADC
  215. ----------------------------*/
  216. void InitADC()
  217. {
  218.     P1ASF = 0xff;                   //设置P1口为AD口
  219.     ADC_RES = 0;                    //清除结果寄存器
  220.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  221.     Delay(2);                       //ADC上电并延时
  222. }

  223. /*----------------------------
  224. 初始化串口
  225. ----------------------------*/
  226. void InitUart()
  227. {
  228.     SCON = 0x5a;                //设置串口为8位可变波特率
  229. #if URMD == 0
  230.     T2L = 0xd8;                 //设置波特率重装值
  231.     T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
  232.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  233.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  234. #elif URMD == 1
  235.     AUXR = 0x40;                //定时器1为1T模式
  236.     TMOD = 0x00;                //定时器1为模式0(16位自动重载)
  237.     TL1 = 0xd8;                 //设置波特率重装值
  238.     TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
  239.     TR1 = 1;                    //定时器1开始启动
  240. #else
  241.     TMOD = 0x20;                //设置定时器1为8位自动重装载模式
  242.     AUXR = 0x40;                //定时器1为1T模式
  243.     TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
  244.     TR1 = 1;
  245. #endif
  246. }

  247. /*----------------------------
  248. 发送串口数据
  249. ----------------------------*/
  250. void SendData(BYTE dat)
  251. {
  252.     while (!TI);                    //等待前一个数据发送完成
  253.     TI = 0;                         //清除发送标志
  254.     SBUF = dat;                     //发送当前数据
  255. }

  256. /*----------------------------
  257. 软件延时
  258. ----------------------------*/
  259. void Delay(WORD n)
  260. {
  261.     WORD x;

  262.     while (n--)
  263.     {
  264.         x = 5000;
  265.         while (x--);
  266.     }
  267. }

  268. /*-----------------------------------------
  269. 主函数
  270. ------------------------------------------*/
  271. void main()
  272. {
  273.         unsigned char i=0;
  274.         InitUart();                                  //初始化串口
  275.         InitADC();                                  //初始化ADC
  276.         Timer0Init();                          
  277.         IE |=0xa0;                                  //使能ADC中断   开始AD转换
  278.         disp(dispBuf,4);
  279.         while(1)
  280.         {
  281.                 key_test();
  282.                 if(key_value!=0){key_processing();}
  283.                 if(testflag==1)
  284.                         {
  285.                                         testflag=0;
  286.                                         calculate_temperature();
  287.                                         disp(dispBuf, 4);
  288.                                         if(system_status==4)
  289.                                         {
  290.                                                 if(current_temperature<l_limit_alarm)
  291.                                                         {LL_flag=1;delay1=1;}                                //下限报警标志位   下限报警继电器吸合
  292.                                                 else {LL_flag=0;delay1=0;}                                //清除报警标志位   释放继电器
  293.                                                 if(current_temperature>h_limit_alarm)        
  294.                                                         {HH_flag=1;delay2=1;}                                //上限报警标志位   上限报警继电器吸合
  295.                                                 else {HH_flag=0;delay2=0;}                                //清除报警标志位   释放继电器
  296.                                         }
  297.                         }
  298.         }
  299. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:102702 发表于 2017-5-17 11:38 | 只看该作者
楼主有制作过实物吗?带继电器开关的吗?
回复

使用道具 举报

板凳
ID:309882 发表于 2018-4-17 11:03 | 只看该作者
学习学习
回复

使用道具 举报

地板
ID:322933 发表于 2018-10-18 16:47 | 只看该作者
感谢楼主分享
回复

使用道具 举报

5#
ID:412814 发表于 2018-11-3 19:56 | 只看该作者
挺好的资料,下载看看,感谢楼主
回复

使用道具 举报

6#
ID:432346 发表于 2018-11-24 14:08 | 只看该作者

感谢楼主分享!!
回复

使用道具 举报

7#
ID:432346 发表于 2018-11-24 14:09 | 只看该作者
谢谢楼主的分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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