学生实验报告 (理工类)
课程名称:专业班级: 学生学号:学生姓名: 所属院部:指导教师: 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语言写出全部程序,并编译,调试。 - #include <reg52.h>
- #include<intrins.h>
- #include"18b20.h"
- sbit DQ = P1^4;
- //延时函数
- void delay2us(unsigned char t) //2us
- {
- while(t--);
- }
- //DS18B20初始化函数
- bit init_ds18b20(void)
- {
- bit initflag = 0;
- DQ = 1;
- delay2us(1);
- DQ = 0;
- delay2us(250); // 延时大于480us
- DQ = 1;
- delay2us(10); // 15us<waits<80us
- initflag = DQ; // initflag等于1初始化失败
- delay2us(40); //< 60us<presebcepulse<240us
- return initflag;
- }
- //通过单总线向从器件写一个字节
- void WriteOneChar(unsigned char byt)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 1;
- _nop_();
- DQ = 0;
- DQ = byt&0x01;
- delay2us(15);
- DQ = 1;
- byt >>= 1;
- }
- delay2us(5);
- }
- //通过单总线从从器件读一个字节
- unsigned char ReadOneChar(void)
- {
- unsigned char i;
- unsigned char byt;
- for(i=0;i<8;i++)
- {
- DQ = 0; // 拉低开始读时间隙
- byt >>= 1;
- DQ = 1; //单片机释放总线
- if(DQ) //18b20有效数据出现
- byt |= 0x80;
- delay2us(30);
- }
- return byt;
- }
- //温度转换、读取及数据处理器函数
- unsigned char rd_temperature(void)
- {
- unsigned char low,high;
- char temp;
- init_ds18b20();
- WriteOneChar(0xCC);
- WriteOneChar(0x44); //启动温度转换
- init_ds18b20();
- WriteOneChar(0xCC);
- WriteOneChar(0xBE); //读取寄存器
- low = ReadOneChar(); //低字节
- high = ReadOneChar(); //高字节
- temp = high<<4;
- temp += ((low&0xf0)>>4);
- return temp;
- }
- #include<reg52.h>
- #include "18b20.h"
- #include "display.h"
- #include "timer0.h"
- #include "Uln2003.h"//用来关掉烦人的蜂鸣器
- #define uint unsigned int
- #define uchar unsigned char
- sbit buzz = P0^4;
- sbit relay = P0^6;
- uchar disData[]={2,0,10,1,0,10,0,0};
- uchar times=0;
- uchar temperature;
- bit OneSecFlag=0;
- void main(void)
- {
- //消除蜂鸣器叫声
- buzz=0;
- relay=0;
- ULN2003_Latch();
- Init_timer0();
- while(1)
- {
- if(OneSecFlag)
- {
- temperature=rd_temperature();
- disData[6]=temperature / 10;
- disData[7]=temperature % 10;
- OneSecFlag = 0;
- if(temperature<10||temperature>20)
- {
- buzz=1;
- relay=1;
- ULN2003_Latch();
- }
- else
- {
- buzz=0;
- relay=0;
- ULN2003_Latch();
- }
- }
- display(disData); //也可以在这里动态扫描
- }
- }
- void Timer0_isr(void) interrupt 1 using 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- times++;
- //中断扫描数码管显示,也可以放在while(1)中
- if(times == 10)//0.5s
- {
- times=0;
- OneSecFlag = 1;
- }
- }
- 2.思考若要显示小数点后面2位,数据该如何处理? 写出数据处理部分程序片段
- DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xf7,0x7f};
- uchar disData[]={0,0,0,0,0,13,0,0};
-
- void main(void)
- {
- //消除蜂鸣器叫声
- buzz=0;
- relay=0;
- ULN2003_Latch();
- Init_timer0();
- while(1)
- {
- display(disData);//中断扫描数码管显示,也可以放在while(1)中
- if(OneSecFlag)
- {
- temperature=rd_temperature();
- disData[3]=temperature /1000;
- disData[4]=temperature %1000/100;
- disData[6]=temperature %100/10
- disData[7=temperature/10
- OneSecFlag = 0;
复制代码
全部资料51hei下载地址:
|