找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3989|回复: 3
收起左侧

DS1621温度传感器单片机代码+Proteus仿真实验

[复制链接]
ID:442810 发表于 2018-12-13 11:41 | 显示全部楼层 |阅读模式
DS1621温度传感器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. /***************   writer:shopping.w   ******************/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. bit I2C_Busy, NO_Ack,Bus_Fault,point;

  7. uchar bdata a;
  8. sbit LSB = a^0;
  9. sbit MSB = a^7;
  10. sbit SDA = P3^3;
  11. sbit SCL = P3^2;
  12. uchar Array[] = {'0','1','2','3','4','5','6','7','8','9'};
  13. uchar command_data[]=
  14. {
  15.         0xac,0x00,0xee,0xa1,0x00,0x00,0xa2,0x00,0x00,0xaa
  16. };
  17. uchar Prompt[]="Waiting for a while...\r";
  18. uchar i;
  19. void DelayMS(uint ms)
  20. {
  21.         uchar i;
  22.         while(ms--)
  23.         {
  24.                  for(i=0;i<120;i++);
  25.         }
  26. }

  27. void SendStop()
  28. {
  29.         SDA = 0;
  30.         SCL = 1;
  31.         _nop_();
  32.         SDA = 1;
  33.         I2C_Busy = 0;
  34. }

  35. void SendByte(uchar wd)
  36. {
  37.         uchar i;
  38.         a = wd;
  39.         for(i=0;i<8;i++)
  40.         {
  41.                  SCL = 0;
  42.                 _nop_();
  43.                 _nop_();
  44.                 SDA = MSB;
  45.                 a <<= 1;
  46.                 _nop_();
  47.                 _nop_();
  48.                 SCL = 1;
  49.                 _nop_();
  50.                 _nop_();
  51.                 SCL = 0;
  52.         }
  53.         SDA = 1;
  54.         SCL = 1;
  55.         _nop_();
  56.         _nop_();

  57.         if(!SDA)
  58.         {
  59.                  SCL = 0;
  60.                 _nop_();
  61.                 _nop_();
  62.         }
  63.         else
  64.         {
  65.                  NO_Ack = 1;
  66.                 SCL = 0;
  67.                 _nop_();
  68.                 _nop_();
  69.         }
  70. }

  71. void Master(uchar slave_addr)
  72. {

  73.         I2C_Busy = 1;
  74.         NO_Ack = 0;
  75.         Bus_Fault = 0;
  76.         if(!SCL || !SDA)
  77.                 Bus_Fault = 1;
  78.         else
  79.         {
  80.                  SDA = 0;
  81.                 _nop_();
  82.                 _nop_();
  83.                 SCL = 0;
  84.                 _nop_();
  85.                 _nop_();
  86.                 SendByte(slave_addr);
  87.         }
  88. }

  89. uchar RecvByte(uchar cnt)
  90. {
  91.         uchar i,rcv_data;
  92.         for(i=0;i<8;i++)
  93.         {
  94.                  SDA = 1;
  95.                 SCL = 1;
  96.                 _nop_();
  97.                 LSB = SDA;
  98.                 if(i<7)
  99.                         a <<= 1;
  100.                 _nop_();
  101.                 SCL = 0;
  102.                 _nop_();
  103.         }
  104.        
  105.         if(cnt == 1)
  106.                 SDA = 1;
  107.         else
  108.                 SDA = 0;
  109.         SCL = 1;
  110.         _nop_();
  111.         SCL = 0;
  112.         SDA = 1;
  113.         _nop_();
  114.         rcv_data = a;
  115.         return rcv_data;       
  116. }

  117. void SendData(uchar slave_address,uchar start,uchar end)
  118. {
  119.         Master(slave_address);
  120.         for(i=start;i<=end;i++)
  121.                 SendByte(command_data[i]);       
  122.         SendStop();
  123. }

  124. void InitialiseSerialPort()
  125. {
  126.         TMOD = 0x20;
  127.         TH1  = 0xfd;
  128.         SCON = 0x50;
  129.         TR1  = 1;
  130. }

  131. void SendCharToSerialPort(uchar ch)
  132. {
  133.         SBUF = ch;
  134.         while(!TI);
  135.         TI = 0;
  136. }

  137. void SendTemperatureToSerialPort(uchar val)
  138. {
  139.         if(val>200)
  140.         {
  141.                  val = 255-val;
  142.                 SendCharToSerialPort('-');
  143.                 if(!point)
  144.                         val+=1;
  145.         }
  146.         SendCharToSerialPort(Array[(val/10)/10]);
  147.         SendCharToSerialPort(Array[(val/10)%10]);
  148.         SendCharToSerialPort(Array[val%10]);
  149.         SendCharToSerialPort('.');
  150.         if(point)
  151.                 SendCharToSerialPort('5');
  152.         else
  153.                 SendCharToSerialPort('0');
  154.         SendCharToSerialPort(' ');
  155.         SendCharToSerialPort('C');
  156.         SendCharToSerialPort('\r');       
  157. }

  158. void SetTemperatureLimit(uchar HI,uchar LO)
  159. {
  160.         command_data[4] = HI;
  161.         command_data[5]        = 0;
  162.         command_data[7] = LO;
  163.         command_data[8] = 0;
  164.         SendData(0x90,3,5);
  165.         DelayMS(10);
  166.         SendData(0x90,6,8);       
  167. }

  168. void StartConversion()
  169. {
  170.         SendData(0x90,2,2);
  171.         DelayMS(750);
  172. }

  173. uchar ReadTemp()
  174. {
  175.         uchar d;
  176.         SendData(0x90,9,9);
  177.         Master(0x91);
  178.         d = RecvByte(0);
  179.         point = RecvByte(1)>>7;
  180.         SendStop();
  181.         return d;
  182. }

  183. void WriteConfig(uchar c)
  184. {
  185.         command_data[1] = c;
  186.         SendData(0x90,0,1);               
  187. }

  188. void main()
  189. {
  190.         uchar i;
  191.            InitialiseSerialPort();
  192.         while(Prompt[i]!='\0')
  193.                 SendCharToSerialPort(Prompt[i++]);
  194.         WriteConfig(0x02);
  195.         StartConversion();
  196.         SetTemperatureLimit(40,35);
  197.         while(1)
  198.         {
  199.                  DelayMS(50);
  200.                 SendTemperatureToSerialPort(ReadTemp());
  201.         }       
  202. }
复制代码

所有资料51hei提供下载:
温度传感器实验(DS1621).rar (40.67 KB, 下载次数: 78)
回复

使用道具 举报

ID:555486 发表于 2019-6-5 11:35 | 显示全部楼层
protues 没有大图吗
回复

使用道具 举报

ID:453180 发表于 2019-7-1 13:16 | 显示全部楼层
仿真全打不开

回复

使用道具 举报

ID:575682 发表于 2019-7-1 15:06 来自手机 | 显示全部楼层
学习~感谢楼主~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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