版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、谈STC的1T指令51单片机上一周,我为了我们的创新基金项目而做了一个ds18b20温度显示试验,用的是郭天祥郭老师的TX-1C实验板,将温度传感器采集到的温度显示在1602液晶屏幕上,显示一切正常因为之前上一个寒假也做过。所以也没什么难的,很顺利就做好了。实验室一女生看到后就想让我给他们寝室做一个这温度显示的玩意儿,随时能知道外边的温度以不至于他们女生穿得太少而挨冻!然后我就觉得小菜一碟嘛,看我的,三下五除二给你整一个,然后我就开始找了一块5*7的洞洞板开始焊接了。我准备用一个20脚的单片机11f02e来做,然后用一个3位的共阳数码管来显示温度,16个IO口用12个够用了。然后我就开工了,很
2、快我就把硬件给焊接好了。把单片机烧好我写的程序,上电之后竟然数码管显示3位零。然后就到处调程序但是还是没有作用。在调试程序的过程中我发现18b20根本就没有应答单片机,数码管显示的零是各位的默认初值。也就是说单片机根本就没有检测到存在脉冲,难道是时序有问题?然后我就把程序烧到我的开发板上,哎,一切显示正常。这见鬼了,怎么会出现这种事情呢?后来我就想硬件有问题吗?然后我就把我焊接的小板上的所有的引脚都用杜邦线连接到单片机开发板上的IO口,一模一样的程序结果还是能够正常显示,这就很有力地印证了第一,我焊接的板子没问题;第二,问题绝对出在单片机上。然后我就换了一块20脚的单片机烧好程序后发现还是老样
3、子。顿时我都没有信心继续搞了,但是当时已经答应人家,怎么能说不做就不做呢?必须得把问题找出来。最起码我现在已经确定是单片机的问题,而且单片机没有损坏,那说明我用的不对。然后我就上网查这款单片机,我发现一句至关重要的话:“11系列是后来研发生产的,STC11系列:1T时钟周期,高速运算能力,是89系列的8-12倍。”然后我就恍然大悟,原来是11系列的单片机是1T指令的;然后就是原来ds18b20里的时序里边的延时库函数延时要比89系列的短好多,这也就印证了为什么用开发板(板载单片机为89C52RC)可以用,而我焊的板就不行。然后我就用示波器检测11f02e得用多少个这个库函数(_nop_())延
4、时,才能达到跟89系列单片机同等时间的延时。然后我发现89系列的用8个能延时10us,而11系列的要用90个才能延时10us。11系列的工作速度果然是89系列的8-12倍。现在我已经做好了,准备验收了,心情也通畅了好多。所以说用到和书上不一样的东西(比如之前都是用的和书上一样的89系列的单片机,现在用11系列的)就不能死按照书上的来了,得自己动脑子想想了,也算是经验吧特此记之!下面是代码:#include#include #define uchar char#define uint unsigned intunsigned char code table=0x0a,0xfa,0x4c,0x68
5、,0xb8,0x29,0x09,0x7a,0x08,0x28;unsigned char code table1=0x02,0xf2,0x44,0x60,0xb0,0x21,0x01,0x72,0x00,0x20;uint numt=0;uint num;sbit dula=P26;sbit wela=P27;bit flag1s=1; /1s 定时标志bit res;int shi,ge;int temp;/读取到的当前温度值int intT, decT; /温度值的整数和小数部分sbit IO_18B20 = P37; /DS18B20 通信引脚int temp; /读取到的当前温度值in
6、t intT, decT; /温度值的整数和小数部分sbit a=P32;sbit b=P35;sbit c=P34;void delayms(uint xms) uint i,j; for(i=xms;i0;i-)for(j=110;j0;j-);/* 软件延时函数,延时时间(t*10)us */void DelayX10us(unsigned char t)/90个延时库函数,11f02e单片机是STC公司生产的1T指令51单片机 do_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_
7、();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_
8、();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(
9、); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); while (-t);/* 复位总线,获取存在脉冲,以启动一次读写操作 */bit Get18B20Ack()bit ack;EA = 0; /禁止总中断IO_18B20 = 0; /产生 500us 复位脉冲DelayX10us(50);IO_18B20=1;DelayX10us(6); /延时 60usack = IO_18B20; /读取存在脉冲while(!IO_18B20); /等待存在脉冲结束EA = 1; /重新使能总中断return ack;/* 向 DS18B20 写入一个
10、字节,dat-待写入字节 */void Write18B20(unsigned char dat)unsigned char mask;EA = 0; /禁止总中断for (mask=0x01; mask!=0; mask=1) /低位在先,依次移出 8 个 bitIO_18B20 = 0; /产生 2us 低电平脉冲_nop_();_nop_();if (mask&dat) = 0) /输出该 bit 值IO_18B20 = 0;elseIO_18B20 = 1;DelayX10us(6); /延时 60usIO_18B20 = 1; /拉高通信引脚EA = 1; /重新使能总中断/* 从
11、DS18B20 读取一个字节,返回值-读到的字节 */unsigned char Read18B20() unsigned char dat;unsigned char mask;EA = 0; /禁止总中断for (mask=0x01; mask!=0; mask=1) /低位在先,依次采集 8 个 bitIO_18B20 = 0; /产生 2us 低电平脉冲_nop_();_nop_();IO_18B20 = 1; /结束低电平脉冲,等待 18B20 输出数据_nop_(); /延时 2us_nop_();if (!IO_18B20) /读取通信引脚上的值dat &=mask;elseda
12、t |= mask;DelayX10us(6); /再延时 60usEA = 1; /重新使能总中断return dat;/* 启动一次 18B20 温度转换,返回值-表示是否启动成功 */bit Start18B20()bit ack;ack = Get18B20Ack(); /执行总线复位,并获取 18B20 应答if (ack = 0) /如 18B20 正确应答,则启动一次转换Write18B20(0xCC); /跳过 ROM 操作Write18B20(0x44); /启动一次温度转换returnack;/ack=0 表示操作成功,所以返回值对其取反/* 读取 DS18B20 转换的温
13、度值,返回值-表示是否读取成功 */bit Get18B20Temp(int *temp)bit ack;unsigned char LSB, MSB; /16bit 温度值的低字节和高字节ack = Get18B20Ack(); /执行总线复位,并获取 18B20 应答if (ack = 0) /如 18B20 正确应答,则读取温度值 Write18B20(0xCC); /跳过 ROM 操作Write18B20(0xBE); /发送读命令LSB = Read18B20(); /读温度值的低字节MSB = Read18B20(); /读温度值的高字节*temp = (int)MSB 4; /分离出温度值整数部分decT = temp & 0xF; /分离出温度值小数部分decT = (decT*10) / 16; /二进制的小数部分转换为 1 位十进制位if(intT0)intT=-intT; shi=intT/10;ge=intT%10;a=0;b=c=1;P1=tableshi;delayms(5);P1=0xff
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购销合同的范本(2篇)
- 股东项目风险划分合同(2篇)
- 南京工业大学浦江学院《税法二》2023-2024学年第一学期期末试卷
- ××机械有限责任公司高效矿井重型刮板输送机成套设备安全验收报告(机械)
- 芳香烃说课稿
- 渭塘刘珏路组织设计
- 《中 国石拱桥》第课时说课稿
- 《乙醇》的说课稿
- 南京工业大学浦江学院《公共事业管理概论》2023-2024学年第一学期期末试卷
- 简单两人散伙协议书(2篇)
- 广东省课程思政示范高职院校申报书
- 工程地质剖面图的绘制(正式)
- JJG 707-2014扭矩扳子行业标准
- 2024医保练兵理论知识考试题库(浓缩500题)
- 生涯职业发展展示
- 三重一大培训课件
- 【增加多场景】员工使用公司车辆协议
- 2024年度2024行政复议法培训
- 车辆托运合同
- 2023土的分散性判别试验规程
- 牧原招聘测评试题
评论
0/150
提交评论