当前位置: 首页 > news >正文

深圳网站制作需要多少钱建设集团公司

深圳网站制作需要多少钱,建设集团公司,商城网站建站方案,企业网站策划书需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明: sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来: unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…

在这里插入图片描述
需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数
在这里插入图片描述
先根据原理图做好端口的声明:

sbit OneWire_DQ = P3^7;

接下来像之前一样把时序结构用代码模拟出来:
在这里插入图片描述

unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;OneWire_DQ = 1;OneWire_DQ = 0; //总线拉低//延时500usi = 227; while (--i);OneWire_DQ = 1; //释放总线//延时70usi = 29; while (--i);AckBit = OneWire_DQ;//延时500usi = 227; while (--i);return AckBit;
}

在这里插入图片描述

void OneWire_SendBit(unsigned char Bit)
{unsigned char i;OneWire_DQ = 0; //总线拉低//延时10us后直接读电平i = 4; while(--i);OneWire_DQ = Bit;//延时50us凑满时间片i = 22; while(--i);OneWire_DQ = 1;
}

在这里插入图片描述

unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;OneWire_DQ = 0;//延时5usi = 2; while(--i);OneWire_DQ = 1;//延时5usi = 2; while(--i);Bit = OneWire_DQ;//延时50usi = 22; while(--i);return Bit;
}

在这里插入图片描述

void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {OneWire_SendBit(Byte & (0x01<<i));}
}unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte = 0x00;for(i = 0; i < 8; i ++) {if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}}return Byte;
}

至此,OneWire模块就写好了,接下来在DS18B20模块中模拟数据帧:
在这里插入图片描述

在这里插入图片描述

#include <REGX52.H>
#include "OneWire.h"#define DS18B20_SKIP_ROM   0xCC
#define DS18B20_CONVERT_T  0x44
#define DS18B20_READ_SCRATCHPAD  0xBEvoid DS18B20_ConvertT(void)
{OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_CONVERT_T);
}float DS18B20_ReadT(void)
{unsigned char TLSB, TMSB;int temp;float T;OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_READ_SCRATCHPAD);TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();temp = (TMSB<<8) | TLSB;T = temp / 16.0;return T;
}

之后只需要在main中调用即可

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"float T;void main()
{LCD_Init();LCD_ShowString(1, 1, "Temperature!");while(1){DS18B20_ConvertT();T = DS18B20_ReadT();if(T < 0){LCD_ShowChar(2, 1, '-');T = -T;}else{LCD_ShowChar(2, 1, '+');}LCD_ShowNum(2, 2, T, 3);//整数部分LCD_ShowChar(2, 5, '.');LCD_ShowNum(2, 6, (unsigned long)(T *10000) % 10000, 4); //小数部分}
}

在这里插入图片描述


接下来进行一些综合的应用:温度报警器,按键可调整报警温度的上下限,且能用AT24C02记录上下限,掉电不丢失(这里默认所有温度不会超过DS18B20的芯片范围)

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"float T, TShow;
char THigh, TLow;
unsigned char KeyNum;void main()
{THigh = AT24C02_ReadByte(0);TLow = AT24C02_ReadByte(1);//第一次读可能是非法值,所以要特判一下if(THigh > 125 || TLow < - 55 || THigh <= TLow){THigh = 20;TLow = 15;}Timer0_Init();LCD_Init();LCD_ShowString(1, 1, "T:");LCD_ShowString(2, 1, "TH:");LCD_ShowString(2, 9, "TL:");LCD_ShowSignedNum(2, 4, THigh, 3);LCD_ShowSignedNum(2, 12, TLow, 3);while(1){KeyNum = Key();/*温度读取及显示*/DS18B20_ConvertT();T = DS18B20_ReadT();if(T < 0){LCD_ShowChar(1, 3, '-');TShow = -T;}else{LCD_ShowChar(1, 3, '+');TShow = T;}LCD_ShowNum(1, 4, TShow, 3);LCD_ShowChar(1, 7, '.');LCD_ShowNum(1, 8, (unsigned long)(TShow * 100)%100, 2);/*阈值判断及显示*/if(KeyNum){if(KeyNum == 1) THigh ++;if(KeyNum == 2) THigh --;if(KeyNum == 3) TLow ++;if(KeyNum == 4) TLow --;LCD_ShowSignedNum(2, 4, THigh, 3);LCD_ShowSignedNum(2, 12, TLow, 3);AT24C02_WriteByte(0, THigh);Delay(5);AT24C02_WriteByte(1, TLow);Delay(5);}if(T > THigh) LCD_ShowString(1, 13, "OV:H");else if(T < TLow) LCD_ShowString(1, 13, "OV:L");else LCD_ShowString(1, 13, "    ");}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x66;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count ++;if(T0Count >= 20) //20ms执行一次{T0Count = 0;Key_Loop();}
}

在这里插入图片描述

这还没完,在与定时器的结合中,定时器的中断会影响OneWire的延时,从而影响其中的时序结构进而影响温度实时获取,所以在时序结构编写的代码中需要加上屏蔽定时器中断的代码:开始时加上EA = 0,最后加上EA = 1,改版后的OneWire模块如下:

#include <REGX52.H>sbit OneWire_DQ = P3^7;unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;EA = 0;  //屏蔽中断OneWire_DQ = 1;OneWire_DQ = 0; //总线拉低//延时500usi = 227; while (--i);OneWire_DQ = 1; //释放总线//延时70usi = 29; while (--i);AckBit = OneWire_DQ;//延时500usi = 227; while (--i);EA = 1;return AckBit;
}void OneWire_SendBit(unsigned char Bit)
{unsigned char i;EA = 0;  //屏蔽中断OneWire_DQ = 0; //总线拉低//延时10us后直接读电平i = 4; while(--i);OneWire_DQ = Bit;//延时50us凑满时间片i = 22; while(--i);OneWire_DQ = 1;EA = 1;
}unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;EA = 0;  //屏蔽中断OneWire_DQ = 0;//延时5usi = 2; while(--i);OneWire_DQ = 1;//延时5usi = 2; while(--i);Bit = OneWire_DQ;//延时50usi = 22; while(--i);EA = 1;return Bit;
}void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i = 0; i < 8; i ++) {OneWire_SendBit(Byte & (0x01<<i));}
}unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte = 0x00;for(i = 0; i < 8; i ++) {if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}}return Byte;
}

但是这样虽然能维护好单总线的通信,但这样直接屏蔽中断却会影响定时器的计时准确度,从而对定时器控制的其他模块造成影响,这也就是单总线的一大缺点,不过在这个实例中,按键的定时器准度要求并不高,所以这样控制影响不大

http://www.yayakq.cn/news/388532/

相关文章:

  • 网站注册怎么做seo快速优化报价
  • 怎样让网站被百度收录wordpress 月光博客
  • 郑州建设网站哪家好新郑网络推广公司
  • 新东方研学网站那家公司做的平顶山高端网站建设
  • 长沙做网站seo优化外包id创建网站
  • 济宁网站定制公司十大网站黄页免费
  • 有哪个网站专业做漫画素材的温州高端网站建设公司哪家好
  • 网站名字大全有哪些网站模板 酒店 中文
  • 如何建立微网站详细什么是网络营销举例子
  • 凡科网站建设推广应用商店下载安装app
  • ftp修改网站水滴查企业查询
  • 安康市建设银行网站wordpress 点赞数量翻倍
  • 网站开发合同中英文网站免费建站人生若只初相见04
  • 企业网站建设原则企业官网的重要性
  • 注册个体工商户用于网站建设室内设计装修风格大全
  • 网站做的比较好的公司吗想学策划该从哪入手
  • 常德网站设计深圳人才网官方网站
  • 网站建设使用的技术北京专门做seo
  • 怎么查询网站的服务器在哪里wordpress后台账号密码
  • 中超最新积分榜优化什么意思
  • 大尺度做爰床视频网站会宁网站建设公司
  • 柏乡县网站建设网站访问速度跟服务器cpu和内存和带宽哪个重要
  • php网站实例彭州网站建设
  • 免费招聘网站都有哪些网站建设预付款
  • 新昌县住房和城乡建设局网站seo综合查询平台
  • 关于企业微网站建设方案棋牌源码资源网
  • 网站建站管普通电脑怎么做网站服务器吗
  • 免费站推广网站在线微信怎么建设网站
  • 做网站的ui企查查公司名字
  • 林业公司网站模版开发软件多少钱一个月