找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2802|回复: 0
收起左侧

单片机单总线接口学生实验报告

[复制链接]
ID:274161 发表于 2018-1-10 10:42 | 显示全部楼层 |阅读模式
(理工类)

课程名称:专业班级:
学生学号:学生姓名:
所属院部:指导教师:
20——20学年          第学期
金陵科技学院教务处制

实验项目名称:实验学时:

同组学生姓名:实验地点:

实验日期:实验成绩:

批改教师:批改时间:

一、实验目的和要求

1、进一步熟练Keil uVision3的项目文件创建、编译、运行和软件仿真的基本操作方法;
2、巩固程序调试的方法;
3、掌握单总线的工作原理;
4、掌握单总线器件18B20温度传感器的使用方法;
5、掌握对采集数据后续处理方法;
实验任务:编写程序,实时(定时器0中断每隔0.5s)采集单总线温度传感器18B20的数据,能单独显示温度。显示格式要求如下:
当温度高于或低于上、下限值时继电器吸合灯亮,蜂鸣器鸣叫报警。可自行修改上下限值。

二、实验仪器和设备

单片机编译软件Keil uVision3,计算机,USB下载线,CT107D单片机综合开发平台

三、实验过程

目前,温度测量方法很多,温度传感器也非常普遍。本实验是基于DS18B20芯片的“一线式”温度传感器。该传感器只需占用微处理器的一个普通端口, 独特的单线接口仅需一个端口引脚进行通讯,并且多个传感器可以并联在一起使用,适用于多点温度检测系统,节约了大量系统资源。
主机(单片机)使用时间隙(time slots)来读写DSl8B20 的数据位和写命令字的位。
(1)初始化
主机总线t0 时刻发送一复位脉冲(最短为480us 的低电平信号) 接着在t1时刻释放总线并进入接收状态。DSl820 在检测到总线的上升沿之后等待15-60us 接着DS1820 在t2 时刻发出存在脉冲(低电平持续60-240 us)
(2)写时间隙
  •        当主机总线 t0 时刻从高拉至低电平时就产生写时间隙;
  •        从 t0时刻开始15us 之内应将所需写的位送到总线上DSl820 在t0后15-60us 间对总线采样若低电平写入的位是0;若高电平写入的位是1 。
  •        连续写2 位间的间隙应大于1us
(3)读时间隙
见图,主机总线t0时刻从高拉至低电平时总线只须保持低电平1us 之后,单片机将总线拉高,释放总线以产生读时间隙。读时间隙在t1 时刻后t2 时刻前有效, t2距t0为15us。也就是说t2时刻前主机必须完成读位。每次读周期至少 60us,两次读之间至少隔1us。
存储器操作指令
发送CC:跳过ROM命令
发送44: 启动温度变换
发送BE: 读暂存存储器
数据格式
DS18B20,用12位存储温度,S为符号位:
正温度S全部为0;
负温度S全部为1,数据为二进制补码;

使用buzz=0;relay=0;ULN2003_Latch();命令即可实现当温度超过上下限制时,继电器吸合灯亮,蜂鸣器响。

当动态扫描在while(1)中扫描时,数码管显示的只会闪动,当在循环后面扫描时,数码管才不闪动。

四、实验结果与分析

1.请用c语言写出全部程序,并编译,调试。
  1. #include <reg52.h>

  2. #include<intrins.h>

  3. #include"18b20.h"

  4. sbit DQ = P1^4;

  5. //延时函数

  6. void delay2us(unsigned char t)              //2us

  7. {

  8.   while(t--);

  9. }

  10. //DS18B20初始化函数

  11. bit init_ds18b20(void)

  12. {

  13.   bit initflag = 0;

  14.   DQ = 1;

  15.   delay2us(1);

  16.   DQ = 0;

  17.   delay2us(250);  // 延时大于480us

  18.   DQ = 1;

  19.   delay2us(10);   // 15us<waits<80us

  20.   initflag = DQ;  // initflag等于1初始化失败

  21.   delay2us(40);                //< 60us<presebcepulse<240us

  22.   return initflag;

  23. }

  24. //通过单总线向从器件写一个字节

  25. void WriteOneChar(unsigned char byt)

  26. {

  27.   unsigned char i;

  28.   for(i=0;i<8;i++)

  29.   {

  30.     DQ = 1;

  31.               _nop_();

  32.               DQ = 0;

  33.     DQ = byt&0x01;

  34.     delay2us(15);

  35.     DQ = 1;

  36.     byt >>= 1;

  37.   }

  38.   delay2us(5);

  39. }

  40. //通过单总线从从器件读一个字节

  41. unsigned char ReadOneChar(void)

  42. {

  43.   unsigned char i;

  44.   unsigned char byt;

  45.   for(i=0;i<8;i++)

  46.   {

  47.     DQ = 0;                // 拉低开始读时间隙

  48.     byt >>= 1;

  49.     DQ = 1;                //单片机释放总线

  50.     if(DQ)                //18b20有效数据出现

  51.        byt |= 0x80;

  52.               delay2us(30);

  53.   }

  54.   return byt;

  55. }

  56. //温度转换、读取及数据处理器函数

  57. unsigned char rd_temperature(void)

  58. {

  59.   unsigned char low,high;

  60.   char temp;

  61.   init_ds18b20();

  62.   WriteOneChar(0xCC);

  63.   WriteOneChar(0x44); //启动温度转换

  64.   init_ds18b20();

  65.   WriteOneChar(0xCC);

  66.   WriteOneChar(0xBE); //读取寄存器

  67.   low = ReadOneChar();  //低字节

  68.   high = ReadOneChar(); //高字节

  69.   temp = high<<4;

  70.   temp += ((low&0xf0)>>4);

  71.   return temp;

  72. }

  73. #include<reg52.h>

  74. #include "18b20.h"

  75. #include "display.h"

  76. #include "timer0.h"

  77. #include "Uln2003.h"//用来关掉烦人的蜂鸣器            

  78. #define uint unsigned int

  79. #define uchar unsigned char

  80. sbit buzz = P0^4;

  81. sbit relay = P0^6;

  82. uchar disData[]={2,0,10,1,0,10,0,0};

  83. uchar times=0;

  84. uchar temperature;

  85. bit OneSecFlag=0;

  86. void main(void)

  87. {

  88.       //消除蜂鸣器叫声

  89.    buzz=0;

  90.    relay=0;

  91.    ULN2003_Latch();

  92.    Init_timer0();

  93.    while(1)

  94.    {

  95.                  if(OneSecFlag)

  96.                  {

  97.        temperature=rd_temperature();

  98.        disData[6]=temperature / 10;

  99.        disData[7]=temperature % 10;

  100.                  OneSecFlag = 0;

  101.                  if(temperature<10||temperature>20)

  102.                  {

  103.                       buzz=1;

  104.             relay=1;

  105.             ULN2003_Latch();

  106.                  }              

  107.                  else

  108.                                           {

  109.                                                         buzz=0;

  110.                 relay=0;

  111.                 ULN2003_Latch();

  112.                                           }

  113.      }

  114.      display(disData); //也可以在这里动态扫描

  115.    }

  116. }

  117. void Timer0_isr(void) interrupt 1 using 1

  118. {

  119. TH0=(65536-50000)/256;            

  120. TL0=(65536-50000)%256;

  121. times++;

  122. //中断扫描数码管显示,也可以放在while(1)中

  123. if(times == 10)//0.5s

  124.    {

  125. times=0;

  126.                  OneSecFlag = 1;

  127.    }

  128. }

  129. 2.思考若要显示小数点后面2位,数据该如何处理? 写出数据处理部分程序片段

  130. DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xf7,0x7f};

  131. uchar disData[]={0,0,0,0,0,13,0,0};



  132. void main(void)

  133. {

  134.       //消除蜂鸣器叫声

  135.    buzz=0;

  136.    relay=0;

  137.    ULN2003_Latch();

  138.    Init_timer0();

  139.    while(1)

  140.    {

  141.      display(disData);//中断扫描数码管显示,也可以放在while(1)中

  142.                  if(OneSecFlag)

  143.                  {

  144.        temperature=rd_temperature();

  145. disData[3]=temperature /1000;

  146. disData[4]=temperature %1000/100;

  147. disData[6]=temperature %100/10

  148. disData[7=temperature/10

  149. OneSecFlag = 0;
复制代码

全部资料51hei下载地址:

实验八.doc

254.5 KB, 下载次数: 3, 下载积分: 黑币 -5

实验要求.docx

173.04 KB, 下载次数: 2, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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