找回密码
 立即注册

QQ登录

只需一步,快速开始

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

原创:我上周弄的温度传感器AD原理图+pcb文件+单片机源程序

  [复制链接]
跳转到指定楼层
楼主
ID:275162 发表于 2018-1-12 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我上周弄的温度传感器课程设计

里面包含单片机代码

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include"reg52.h"
  2. #include "intrins.h"
  3. /*******************宏定义**************************************************/
  4. #define uchar unsigned char
  5. #define uint unsigned int //宏定义
  6. #define IE_value 0x82
  7. #define XIA 20
  8. #define SHANG 90
  9. //#define P0_value 0x3f
  10. /*******************端口定义及开辟相应的存储单元***************************/
  11. sbit DQ = P2^0; //DS18B20单总线接入点
  12. bit flag; //检测芯片是否存在的标志位
  13. bit signal; //温度符号标志位

  14. sbit L1=P2^4; //芯片存在P1.0置0点亮LED灯
  15. sbit L2=P2^3; //芯片不存在P1.1置0点亮LED灯

  16. uchar buf[3] ; //存储转换后温度的高8位与低8位
  17. uchar buf1[3];
  18. uchar temper_value; //存储转化后温度的结果值

  19. sbit lcd_ce=P2^7; //使能端
  20. sbit lcd_rs=P2^5; //数据/命令选择端
  21. sbit lcd_rw=P2^6; //读/写选择端

  22. sbit K1=P1^0;
  23. sbit K2=P1^1;
  24. sbit K3=P1^2;
  25. sbit K4=P1^3;

  26. sbit beep=P2^2;

  27. uchar count,k1num,beepp;
  28. char shi,fen,miao;

  29. uchar code table[]="     00-00-00    ";
  30. uchar code table1[]="T: 00C S:90 X:00";
  31. uchar num,aa,gao,di;
  32. uchar shang,xia;                //上下限温度设置

  33. void chushihua(); //申明初始化子函数
  34. void delay_1(uint z); //申明延时函数
  35. void write_ml(uchar m); //申明写命令子函数
  36. void write_data(uchar s); //申明写数据子函数
  37. void write_sfm(uchar add,uchar da);
  38. void write_fsm2(uchar add,uchar dat);

  39. /********************************************************************
  40. 函 数 名:蜂鸣器控制
  41. 功 能:蜂鸣器箱
  42. 说 明:
  43. 入口参数: 无
  44. 返 回 值:无
  45. 日 期:2018-1-2
  46. ***********************************************************************/
  47. void beepf()
  48. {
  49.         if(temper_value<=xia || temper_value>=shang)
  50.                 {
  51.                         beepp=1;
  52.                 }
  53.                 else
  54.                 {
  55.                         beepp=0;
  56.                 }
  57.         if(beepp==1){
  58.                 ET1=1; //开定时器0中断
  59.                 TR1=1; //启动定时器0
  60.         }
  61.                
  62.         else{
  63.                 ET1=0; //开定时器0中断
  64.                 TR1=0; //启动定时器0
  65.         }
  66. }


  67. /********************************************************************
  68. 函 数 名:按键控制
  69. 功 能:判断按键
  70. 说 明:
  71. 入口参数: 无
  72. 返 回 值:无
  73. 日 期:2018-1-2
  74. ***********************************************************************/
  75. void anjian()
  76. {
  77.         if(K1==0)
  78.         {
  79.                 xia++;
  80.                 while(K1!=1);
  81.         }
  82.         if(K2==0)
  83.         {
  84.                 xia--;
  85.                 while(K2!=1);
  86.         }
  87.         if(K3==0)
  88.         {
  89.                 shang++;
  90.                 while(K3!=1);
  91.         }
  92.         if(K4==0)
  93.         {
  94.                 shang--;
  95.                 while(K4!=1);
  96.         }
  97. }


  98. /********************************************************************
  99. 函 数 名:延时子函数delay
  100. 功 能:延时
  101. 说 明:
  102. 入口参数: i
  103. 返 回 值:无
  104. 日 期:2018-1-2
  105. ***********************************************************************/
  106. void delay(uchar i)
  107. {
  108.         while(--i);
  109. }
  110. /********************************************************************
  111. 函 数 名:初始化子函数 reset_signal
  112. 功 能:信号复位进行初始化
  113. 说 明:
  114. 入口参数:
  115. 返 回 值:无
  116. 设 计: 日 期:2018-1-2
  117. ***********************************************************************/
  118. reset_signal()
  119. {
  120.         DQ = 1;
  121.         _nop_(); //空语句延时1uS
  122.         DQ = 0; //主机发送复位脉冲至少持续480uS
  123.         delay(250); //480uS~960uS之间
  124.         DQ = 1; //复位结束,将单总线拉高
  125.         delay(20); //延时至少16uS
  126.         flag = DQ; //等待16uS后发送存在脉冲(低电平)持续60uS~240uS,DS18B20与MCU达成基本协议
  127.         if(flag==0) //若flag=0则表示存在
  128.         {
  129.                 L1= 0; //P1.4亮
  130.                 delay(90); //延时60uS~240uS之间
  131.         }
  132.         else
  133.                 L2=0;
  134.                 //不存在则P2.3亮
  135.         DQ = 1;
  136. }

  137. /********************************************************************
  138. 函 数 名: w_order
  139. 功 能:写入将要执行操作的命令
  140. 说 明:
  141. 入口参数:cmd
  142. 返 回 值:无
  143. 设 计: 日 期:2018-1-2
  144. ***********************************************************************/
  145. void w_order(uchar cmd)
  146. {
  147.         uchar i;
  148.         for(i=0;i<8;i++)
  149.         {
  150.                 if(cmd&(0x01<<i)) //写1
  151.                 {
  152.                         DQ = 0; //主机将数据线拉至低电平产生写时间片
  153.                         _nop_(); //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
  154.                         _nop_();
  155.                         DQ = 1; //15uS内必须拉至高电平(因为DS18B20在15uS~60uS之间对数据线进行采样)
  156.                         delay(28); //延时60uS(因为一个写周期至少延时60uS)
  157.                 }
  158.                 else //写0
  159.                 {
  160.                         DQ = 0; //主机将数据线拉至低电平产生写时间片
  161.                         delay(40); //延时60uS以上(因为一个写周期至少延时60uS)
  162.                         DQ = 1;
  163.                         _nop_(); //恢复延时(因为个写周期之间至少有1uS的恢复时间)
  164.                         _nop_();
  165.                         _nop_();
  166.                         _nop_();
  167.                 }
  168.         }
  169. }
  170. /********************************************************************
  171. 函 数 名:r_data
  172. 功 能:读出转换后的温度结果存入 buf 1中
  173. 说 明:
  174. 入口参数:
  175. 返 回 值:无
  176. 设 计: 日 期:2018-1-2
  177. ***********************************************************************/
  178. void r_data()
  179. {
  180.         uint i,j;
  181.         for(j=0;j<2;j++)
  182.         {
  183.                 buf[j] = 0;
  184.                 for(i=0;i<8;i++)
  185.                 {
  186.                         DQ = 1;
  187.                         _nop_();
  188.                         DQ = 0; //主机将数据线拉至低电平产生读时间片
  189.                         _nop_(); //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
  190.                         _nop_(); //15uS内必须驱动至高电平(因为DS18B20输出数据在读时间片下降沿后15uS有效)
  191.                         DQ = 1;
  192.                         _nop_();
  193.                         if(DQ) //提高总线后马上读取
  194.                         {
  195.                                 buf[j]|=(1<<i);
  196.                         }
  197.                         else
  198.                         {
  199.                                 buf[j]&=~(1<<i);
  200.                         }
  201.                         delay(28); //每个读周期至少持续60uS
  202.                         DQ = 1;
  203.                         _nop_(); //恢复延时(因为个读周期之间至少有1uS的恢复时间)
  204.                 }
  205.         }
  206. }
  207. /********************************************************************
  208. 函 数 名:get_temper_value
  209. 功 能:获得当前的温度值
  210. 说 明:
  211. 入口参数:
  212. 返 回 值:无
  213. 设 计: 日 期:2018-1-2
  214. ***********************************************************************/
  215. void get_temper_value()
  216. {
  217.         DQ = 1;
  218.         reset_signal(); //初始化 ,检测是否存在 DS18B20
  219.         if(flag==0)
  220.         {
  221.                 w_order(0xcc); //跳过ROM
  222.                 w_order(0x44); //启动温度变换
  223.                 reset_signal(); //复位
  224.                 w_order(0xcc); //跳过ROM
  225.                 w_order(0xbe); //准备读暂存器
  226.                 r_data(); //读暂存器中温度变化的结果
  227.         }
  228. }
  229. /********************************************************************
  230. 函 数 名:二-十进制转换子函数Conversion
  231. 功 能:将二进制数转入十进制中
  232. 说 明:
  233. 入口参数:
  234. 返 回 值:无
  235. 设 计: 日 期:2018-1-2
  236. ***********************************************************************/
  237. void Conversion()
  238. {
  239.         signal = (buf[1]&0xf8); //检温度测是正还是负
  240.         buf1[2] = 0; //温度的符号位
  241.         if(signal)
  242.         {
  243.                 buf[0]=~buf[0];
  244.                 buf[1]=~buf[1];
  245.                 buf1[2]=10;
  246.         }
  247.         buf[0]=(buf[0]>>4); //将温度转换结果的低8位的高4位移入低4位
  248.         //这里我们抛弃了温度转换结果的第四位(小数部分,因为我们不需要那么准确)
  249.         buf[0]=(buf[0]&0x0f); //保留低4位并存入buf[0]中
  250.         buf[1]=(buf[1]<<4); //将温度转换结果的高8位的低4位移入高4位
  251.         buf[1]=(buf[1]&0xf0); //保留高4位并存入buf[1]中
  252.         temper_value=(buf[0]|buf[1]); //将buf[0]与buf[1]相或得温度转换结果存入temper_value中
  253.         if(signal)
  254.         {temper_value++;} //为负时取反加1
  255.         buf1[0]=temper_value%10; //将个位保存在buf1[0]中
  256.         buf1[1]=temper_value/10; //将十位保存在buf1[1]中
  257. }
  258. /********************************************************************
  259. 函 数 名:void timer0() interrupt 1
  260. 功 能:定时对DS18B20的转换温度进行更新
  261. 说 明:定时器0中断
  262. 入口参数:
  263. 返 回 值:无
  264. 设 计: 日 期:2018-1-2
  265. ***********************************************************************/
  266. void timer0() interrupt 1
  267. {
  268.         TH0 =0x3c; //(65536-50000)/256;
  269.         TL0 =0xb0; //(65536-50000)%256;
  270.         get_temper_value();
  271.         Conversion();
  272.         count++;
  273.         aa++;
  274.         if(aa==18) //大约1S
  275.         {
  276.                 aa=0;
  277.                 write_ml(0x80+0x47);
  278.                 /*write_ml(0x80+0x00);
  279.                 for(num=0;num<15;num++)
  280.                 {write_data(table[num]);delay_1(5);}
  281.                 write_ml(0x80+0x40); //重新设置数据指针
  282.                 for(num=0;num<16;num++)
  283.                 {write_data(table1[num]);delay_1(5);} */
  284.                 write_sfm(3,gao);
  285.                 write_sfm(4,di);
  286.                 write_fsm2(14,xia);
  287.                 write_fsm2(9,shang);       
  288.         }
  289. }

  290. void timer1() interrupt 3
  291. {
  292.         TH1 =0xfd; //(65536-50000)/256;
  293.         TL1 =0xfd; //(65536-50000)%256;
  294.         beep=~beep;
  295. }

  296. /********************************************************************
  297. 函 数 名:void chushihua()
  298. 功 能:初始化子函数
  299. 说 明: 见注释
  300. 返 回 值:无
  301. 设 计: 日 期:2018-1-2
  302. ***********************************************************************/
  303. void chushihua() //初始化子函数
  304. {
  305.         TMOD=0x11; //定时器0设为工作方式1
  306.         TH0 =0x3c; //(65536-50000)/256;
  307.         TL0 =0xb0; //(65536-50000)%256;
  308.         TH1 =0x3c; //(65536-50000)/256;
  309.         TL1 =0xb0; //(65536-50000)%256;
  310.         EA=1; //开总中断
  311.         ET0=1; //开定时器0中断
  312.         TR0=1; //启动定时器0
  313.         IE = IE_value;
  314.         shang=SHANG;
  315.         xia=XIA;
  316.         beepp=0;
  317.         beep=0;
  318.         lcd_ce=0;
  319.         lcd_rw=0;
  320.         write_ml(0x38); //显示模式设置
  321.         //write_ml(0x08); //显示关闭
  322.         write_ml(0x0c); //显示开关及光标设置
  323.         write_ml(0x06); //地址加1整屏不移动
  324.         write_ml(0x01); //清零
  325.         //write_ml(0x80); //将数据指针移动
  326.         write_ml(0x80+0x00);
  327.         for(num=0;num<15;num++)
  328.         {
  329.                 write_data(table[num]);delay_1(5);}
  330.                 write_ml(0x80+0x40); //重新设置数据指针
  331.                 for(num=0;num<16;num++)
  332.                 {write_data(table1[num]);delay_1(5);}
  333. }
  334. /********************************************************************
  335. 函 数 名:void write_sfm(uchar add,uchar da)
  336. 功 能:函数
  337. 说 明: 见注释
  338. 返 回 值:无
  339. 设 计: 日 期:2018-1-2
  340. ***********************************************************************/
  341. void write_sfm(uchar add,uchar da)
  342. {
  343.         //uchar shi,ge;
  344.         //shi=da/10;
  345.         //ge=da%10;
  346.         write_ml(0x80+0x40+add);
  347.         write_data(0x30+da);
  348.         //write_data(0x30+da);
  349. }



  350. void write_fsm1(uchar add,uchar date)
  351. {
  352.         uchar shi,ge;
  353.         shi=date/10;
  354.         ge=date%10;
  355.         write_ml(0x80+add);
  356.         write_data(0x30+shi);
  357.         write_data(0x30+ge);
  358. }

  359. void write_fsm2(uchar add,uchar dat)
  360. {
  361.         uchar shi,ge;
  362.         shi=dat/10;
  363.         ge=dat%10;
  364.         write_ml(0x80+0x40+add);
  365.         write_data(0x30+shi);
  366.         write_data(0x30+ge);
  367. }
  368. /********************************************************************
  369. 函 数 名:void write_ml(uchar m)
  370. 功 能:写命令子函数
  371. 说 明: 见注释
  372. 返 回 值:无
  373. 设 计: 日 期:2018-1-2
  374. ***********************************************************************/
  375. void write_ml(uchar m)
  376. {
  377.         lcd_rs=0;
  378.         P0=m;
  379.         delay_1(5);
  380.         lcd_ce=1;
  381.         delay_1(5);
  382.         lcd_ce=0;
  383. }
  384. /********************************************************************
  385. 函 数 名:void write_data(uchar s)
  386. 功 能:写数据子函数
  387. 说 明: 见注释
  388. 返 回 值:无
  389. 设 计: 日 期:2018-1-2
  390. ***********************************************************************/
  391. void write_data(uchar s)
  392. {
  393.         lcd_rs=1;
  394.         P0=s;
  395.         delay_1(5);
  396.         lcd_ce=1;
  397.         delay_1(5);
  398.         lcd_ce=0;
  399. }
  400. /********************************************************************
  401. 函 数 名:void delay_1(uint z)
  402. 功 能:延时ms函数
  403. 说 明:
  404. 入口参数:延时时间
  405. 返 回 值:无
  406. 设 计: 日 期:2018-1-2
  407. ***********************************************************************/
  408. void delay_1(uint z) //延时子函数
  409. {
  410.         uint x,y;
  411.         for(x=z;x>0;x--)
  412.         for(y=110;y>0;y--); //大约1毫秒
  413. }
  414. /********************************************************************
  415. 函 数 名:jianxian()
  416. ……………………

  417. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
程序和图.zip (992.91 KB, 下载次数: 189)


评分

参与人数 1黑币 +5 收起 理由
WEIDADETG + 5 赞一个!感觉调试上有一些需要改善

查看全部评分

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

使用道具 举报

沙发
ID:275162 发表于 2018-1-12 12:18 | 只看该作者
可以实现上下限温度调控
回复

使用道具 举报

板凳
ID:297728 发表于 2018-6-14 16:01 | 只看该作者
用了你的程序,但是温度显示是00
回复

使用道具 举报

地板
ID:419742 发表于 2019-5-19 13:51 | 只看该作者
芯片下面的是什么器件
回复

使用道具 举报

5#
ID:549790 发表于 2019-5-28 23:40 | 只看该作者
有封装库吗
回复

使用道具 举报

6#
ID:262632 发表于 2019-9-3 19:44 | 只看该作者
有软件仿真吗
回复

使用道具 举报

7#
ID:116584 发表于 2019-12-26 10:58 | 只看该作者
学习学习!棒棒的!
回复

使用道具 举报

8#
ID:675190 发表于 2019-12-27 11:39 | 只看该作者
这个帖子很棒  可以学习学习
回复

使用道具 举报

9#
ID:1071032 发表于 2023-4-11 11:35 | 只看该作者
有封装库吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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