找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数字温度计加万年历(程序,仿真,原理图,PCB,元件清单)

  [复制链接]
跳转到指定楼层
楼主
学校的实训做的~~程序不是自己写的,但是可以用!!~

电路原理图pcb:


所有资料下载: 数字温湿度计.rar (8.73 MB, 下载次数: 230)


1、该程序经过电脑软件Proteus7.4sp3仿真通过。

2、该程序通过实验板仿真芯片通过。

3、该程序烧写STC89C51RC,单独在实验板上运行通过(晶振11.0592MHZ)

4、该程序用洞洞板制作实物运行成功!并在DS1302时钟芯片第8脚上加上了3.6V的

   镍氢充电电池,断电后时间、日历都正常走。

5、程序中使用的头文件DS18B20_3.H,来源于网上,写的非常好,十进制温度最后返回到函数

   ReadTemperature()中,使用时主函数用flag=ReadTemperature();/
   
    就可将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示。
-----------------------------------------------------------------------------
主要器件:

STC89C51+DS1302时钟芯片+DS18b20温度芯片。

-----------------------------------------------------------------------------

主要功能:

1、万年历,

2、时间,

3、星期,

4、温度显示,

(以上四项内容同时显示)

5、三键调时(设置键,上调键,下调键),

6、断电走时,

7、上电蜂鸣器提示(长鸣);

8、按键蜂鸣器提示(第一次按动设置键长鸣一响;后面按动设置键或上调键、下调键都是短鸣一响)。


元件清单:
物理与机电工程学院器材   领用    单
领(借)用人    吴育培、林伏忠    单位
(班级)    12级电本(2)    用途    电子系统设计
领用
时间    2015.4.20    使用时间        人数    2人
序号    器材名称及型号规格    单位    领用数量    备注
1    AT89C51单片机    个    2   
2    DS1302    个    2   
3                  轻触开关    个    10   
4    103蓝白电位器    个    4   
5    5.1K电阻    个    10   
6          2K 220 电阻    个    4   
7    瓷片电容(22pf,10pf)    个    6   
8    电解电容 10uf    个    4   
9    IC座(8P)    个    2   
10    IC座(40P)    个    2   
11    单排针    排    5   
12    覆铜板    块    1   
13    DS18B20    个    2   
14    32.768KHZ晶振    个    2   
15    11.0592MHZ晶振    个    2   
               
领用人签字:    毕业论文指导教师签字:
实验室意见:    分管副院长意见:
分管院领导意见:   

仓管员签字:                             时间:



部分程序预览:

DS18B20_3.H:

  1. sbit DQ = P2^0;                // 定义DQ引脚为P2.7

  2. /*******************************  延时函数 ********************************
  3. *  功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μ
  4. **************************************************************************/
  5. void DS18_delay(int useconds) {
  6. int s;
  7. for (s=0; s<useconds;s++);
  8. }


  9. /*******************************  复位函数 *******************************
  10. * 功能:完成单总线的复位操作。
  11. * 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs
  12. * 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs
  13. **************************************************************************/
  14. unsigned char ow_reset(void) {
  15. unsigned char presence;
  16. DQ = 0;                          // 将 DQ 线拉低
  17. DS18_delay(29);                         // 保持 480μs
  18. DQ = 1;                         // DQ返回高电平
  19. DS18_delay(3);                         // 等待存在脉冲
  20. presence = DQ;                 // 获得存在信号
  21. DS18_delay(25);                         // 等待时间隙结束
  22. return(presence);         // 返回存在信号,0 = 器件存在, 1 = 无器件
  23. }


  24. /****************************** 位写入函数 *******************************
  25. * 功能:向单总线写入1位值:bitval
  26. *************************************************************************/
  27. void write_bit(char bitval) {
  28. DQ = 0;                                 // 将DQ 拉低开始写时间隙
  29. if(bitval==1) DQ =1;         // 如果写1,DQ 返回高电平
  30. DS18_delay(5);                                 // 在时间隙内保持电平值,
  31. DQ = 1;         // DS18_delay函数每次循环延时16μs,因此DS18_delay(5) = 104μs
  32. }        


  33. /**************************** 字节写入函数 *******************************
  34. * 功能:向单总线写入一个字节值:val
  35. *************************************************************************/
  36. void ds18write_byte(char val) {
  37. unsigned char i;
  38. unsigned char temp;
  39. for (i=0; i<8; i++) {        // 写入字节, 每次写入一位
  40. temp = val>>i;                 
  41. temp &= 0x01;                 
  42. write_bit(temp);
  43. }
  44. DS18_delay(5);
  45. }

  46. /**************************** 位读取函数 ********************************
  47. * 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
  48. * 的DS18_delay()函数,而采用一个for()循环来实现延时。
  49. * ***********************************************************************/
  50. unsigned char read_bit(void) {
  51. unsigned char i;
  52. DQ = 0;                      //将DQ 拉低开始读时间隙
  53. DQ = 1;                         // then return high
  54. for (i=0; i<3; i++);         // 延时15μs
  55. return(DQ);                         // 返回 DQ 线上的电平值
  56. }

  57. /**************************** 字节读取函数 *******************************
  58. * 功能:从单总线读取一个字节的值
  59. *************************************************************************/
  60. unsigned char DSread_byte(void) {
  61. unsigned char i;
  62. unsigned char value = 0;
  63. for (i=0;i<8;i++) {                                  // 读取字节,每次读取一个字节
  64. if(read_bit()) value|=0x01<<i;         // 然后将其左移
  65. DS18_delay(6);                                         
  66. }
  67. return(value);
  68. }


  69. /******************************* 读取温度函数 *****************************
  70. * 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器
  71. *      件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。
  72. * 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据
  73. *      DS18B20的温度数据格式作适当修改。
  74. **************************************************************************/unsigned
  75. int ReadTemperature(void) {
  76. unsigned char get[10];
  77. unsigned char temp_lsb,temp_msb;
  78. unsigned int t;
  79. unsigned char k;
  80. ow_reset();
  81. ds18write_byte(0xCC);                                         // 跳过 ROM
  82. ds18write_byte(0x44);                                         // 启动温度转换
  83. DS18_delay(5);
  84. ow_reset();
  85. ds18write_byte(0xCC);                                         // 跳过 ROM
  86. ds18write_byte(0xBE);                                         // 读暂存器
  87. for (k=0;k<2;k++){get[k]=DSread_byte();}

  88. temp_msb = get[1]; // Sign byte + lsbit
  89. temp_lsb = get[0]; // Temp data plus lsb

  90. t=temp_msb*256+temp_lsb;
  91. t=t&0x0ff0;
  92. if(t<0xff&&t>0xf0)
  93. t=(-1)*t;
  94. return t>>4;
  95. //temp_f = (((int)temp_c)* 9)/5 + 32;
  96.                  // 输出华氏温度值

  97. }

复制代码



  1. /*******************DS18B20测温程序******************************************

  2. 运行结果会在函数ReadTemperature()保存两位十进制数字的温度值

  3. 调用时,要这样:

  4.          uchar temp;  设定一个无符号变量temp
  5.          temp=ReadTemperature();  变量temp=函数值=二位数的温度值

  6.          然后可以用temp参与显示工作。
  7. ***************************************************************************/

  8. /*********************************端口定义**********************************/
  9. sbit DQ=P3^3;                                   //数据传输线接单片机的相应的引脚

  10. /*********************************定义全局变量******************************/
  11. unsigned char tempL=0;                         //临时变量低位(无符号字符变量)
  12. unsigned char tempH=0;                        //临时变量高位
  13. unsigned char tempa;                           //温度值(整型变量)

  14. /****************************************************************************
  15. 函数功能:延时子程序
  16. 入口参数:k
  17. 出口参数:
  18. ****************************************************************************/
  19. void DS18_delay(int useconds)
  20. {
  21. int s;
  22. for (s=0; s<useconds;s++);
  23. }

  24. /***************************************************************************
  25. 函数功能:DS18B20初始化子程序
  26. 入口参数:
  27. 出口参数:
  28. ****************************************************************************/
  29. unsigned char Init_DS18B20(void)
  30. {
  31.         unsigned char x=0;

  32.           DQ=0;                             //发送复位脉冲
  33.           DS18_delay(29);                         //延时(>480ms)
  34.           DQ=1;                                  //拉高数据线
  35.           DS18_delay(3);                       //等待(15~60ms) 等待存在脉冲
  36.     x=DQ;  //获得存在信号(用于判断是否有器件)
  37.     DS18_delay(25);  // 等待时间隙结束
  38.     return(x);  //返回存在信号,0 = 器件存在, 1 = 无器件
  39. }

  40. /****************************************************************************
  41. 函数功能:向DS18B20读一字节数据
  42. 入口参数:
  43. 出口参数:dat
  44. ****************************************************************************/
  45. ReadOneChar(void)                          
  46. {
  47.         unsigned char i=0;                 
  48.         unsigned char dat=0;
  49.     for (i=8;i>0;i--)                  
  50.                 {
  51.                         DQ=1;
  52.                     DS18_delay(1);
  53.                     DQ=0;      
  54.                     dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
  55.                            DQ=1;
  56.                     if(DQ)
  57.                            dat|=0x80;
  58.                     DS18_delay(4);
  59.                 }
  60.     return(dat);
  61. }

  62. /****************************************************************************
  63. 函数功能:向DS18B20写一字节数据
  64. 入口参数:dat
  65. 出口参数:
  66. ****************************************************************************/
  67. WriteOneChar(unsigned char dat)//有参函数,功能是"写",而写的内容就是括号内的参数
  68. {
  69.         unsigned char i=0;                 
  70.         for(i=8;i>0;i--)         
  71.         {
  72.                 DQ=0;            
  73.                 DQ=dat&0x01;
  74.                 DS18_delay(5);
  75.                 DQ=1;
  76.                 dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
  77.         }
  78.         DS18_delay(4);
  79. }

  80. /****************************************************************************
  81. 函数功能:向DS18B20读温度值
  82. 入口参数:
  83. 出口参数:temperature
  84. ****************************************************************************/
  85. unsigned int ReadTemperature(void)
  86. {  
  87.         Init_DS18B20();          //初始化,调用初始化函数
  88.         WriteOneChar(0xcc);                  //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号)
  89.         WriteOneChar(0x44);                 //启动温度转换,调用写函数,写0x44指令码(启动温度转换)
  90.         DS18_delay(125);                                   //转换需要一点时间,延时
  91.         Init_DS18B20();                         //初始化,调用初始化函数
  92.         WriteOneChar(0xcc);                  //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号?
  93.         WriteOneChar(0xbe);                 //调用写函数,写0xbe指令码,读温度寄存器(头两个值分别为温度的低位和高位)
  94.         tempL=ReadOneChar();                 //读出温度的低位LSB
  95.         tempH=ReadOneChar();                 //读出温度的高位MSB  


  96.          //tempH&=0x0f;//高字节和0f"与"运算,留住后4位有用值,赋给tempH
  97.    tempa=((tempH*256)+tempL)*0.0625;  //温度转换,把高低位做相应的运算转化为实际温度,使用DS18B20温度传感器手册规定的公式,结果是十进制数值

  98.         DS18_delay(20);

  99.         return(tempa);//运算结果返回到函数 :ReadTemperature()调用时需要采用i=ReadTemperature(),然后再对i(任意uchar型变量)进行操作
  100. }









复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:115465 发表于 2016-4-20 16:04 | 只看该作者
请问这个温度计加万年历的程序有吗,就这些?
回复

使用道具 举报

板凳
ID:117249 发表于 2016-4-28 10:43 | 只看该作者
程序是完整的么?
回复

使用道具 举报

地板
ID:74303 发表于 2016-4-28 11:20 | 只看该作者
电路不完整,程序不完整。都没说到的蜂鸣器功能
回复

使用道具 举报

5#
ID:117251 发表于 2016-4-28 12:09 | 只看该作者
请问有程序流程图么
回复

使用道具 举报

6#
ID:117306 发表于 2016-4-28 15:02 | 只看该作者
看起来不错。是完整的嘛
回复

使用道具 举报

7#
ID:109246 发表于 2016-5-25 17:05 | 只看该作者
不完整
回复

使用道具 举报

8#
ID:119445 发表于 2016-5-25 20:10 | 只看该作者
谢谢分享,参考一下!
回复

使用道具 举报

9#
ID:119445 发表于 2016-5-25 20:15 | 只看该作者
谢谢分享!
回复

使用道具 举报

10#
ID:114695 发表于 2016-5-26 21:31 | 只看该作者
谢谢分享,参考一下!
回复

使用道具 举报

11#
ID:116662 发表于 2016-8-6 09:26 来自手机 | 只看该作者
是完整的资料吗,先观察一下
回复

使用道具 举报

12#
ID:148320 发表于 2016-11-16 18:54 | 只看该作者
eeeeee 发表于 2016-4-28 10:43
**** 作者被禁止或删除 内容自动屏蔽 ****

不完整
回复

使用道具 举报

13#
ID:185064 发表于 2017-3-31 14:27 | 只看该作者
有闹钟  就好了
回复

使用道具 举报

14#
ID:185172 发表于 2017-3-31 19:09 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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