一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

在微控制器环境中连接DS18X20/DS1822 1-Wire 温度传感器

来源:analog 发布时间:2023-12-01

摘要: 本应用程序向用户介绍了简单的1线软件,用于将微控制器连接到DS18B20, DS18S20和DS1822 1线温度传感器。

本应用程序向用户介绍了简单的1线软件,用于将微控制器连接到DS18B20, DS18S20和DS1822 1线温度传感器。例如,本文中的目的是使用DS5000(8051兼容)微控制器。给出了软件实例,说明了延迟、复位、读位、写位、读字节、写字节、ROM搜索、CRC、读取温度和读取便签本例程的实现。

介绍

有几种方法可用于将1线器件(如DS18B20、DS18S20或DS1822)连接到微控制器。这些方法包括从简单的软件解决方案到使用串行接口芯片(如DS2480B),再到将Maxim的VHDL 1-Wire主控制器集成到定制ASIC中。本文向用户介绍了微控制器与任意数量的DS18x20或DS1822温度传感器之间基本1线通信的最简单的软件解决方案。

DS18B20、DS18S20和DS1822的详细时序和操作信息可在各自的数据表中获得,这些数据表可从Maxim网站获得。

硬件配置

图1中的框图说明了使用多个1- wire温度传感器时硬件配置的简单性。单线总线为所有设备提供通信访问和电源。母线的电源通过4.7k欧姆上拉电阻从3V到5.5V供电轨道提供。几乎无限数量的1-Wire设备可以连接到总线上,因为每个设备都有一个唯一的64位ROM代码标识符。


图1所示 主机微控制器接口。

接口的时机

通过使用“时隙”实现与DS18x20/DS1822的通信,该时隙允许数据通过1-Wire总线传输。每个通信周期以来自微控制器的复位脉冲开始,然后是来自DS18x20/DS1822的存在脉冲,如图2所示。

当总线主机将1线总线从逻辑高电平(非活动)拉到逻辑低电平时,就会启动一个写时隙。所有写时隙的持续时间必须为60µs到120µs,周期之间的最小恢复时间为1µs。写“0”和写“1”时隙如图3所示。在写“0”时隙期间,主机微控制器在该时隙期间将线拉低。然而,在写“1”时隙期间,微控制器将线拉低,然后在时隙开始后的15µs内释放线。

当微控制器将总线拉低1µs然后释放它时,将启动读取时隙,因此DS18x20/DS1822可以控制线路并呈现有效数据(高或低)。所有读取时隙的持续时间必须为60µs到120µs,周期之间的恢复时间至少为1µs(见图3)。


图2 复位脉冲和存在脉冲。



图3 写和读时隙。

软件控制

为了精确地控制1-Wire接口的特殊时序要求,必须首先建立某些关键功能。创建的第一个函数必须是“延迟”函数,它是所有读写控制的组成部分。此功能完全取决于微控制器的速度。本文使用DS5000(8051兼容)微控制器,其运行频率为11.059MHz。右边的示例说明了用于创建时序延迟的“C”原型函数。


延迟的例子


// DELAY -使用11.059MHz的晶体//调用例程大约需要24us,然后//每次计数又需要16us。//无效延迟(int usseconds){int s;for (s=0;s< useconds; s + +);}

由于每个通信周期必须从微控制器的复位开始,“复位”功能是下一个要实现的最重要的功能。复位时隙为480µs。通过设置延迟“3”,然后是“25”(见下面的例子),复位脉冲将持续所需的持续时间。复位后,微控制器必须释放,以便DS18x20/DS1822可以通过拉低线来指示其“存在”。请注意,如果总线上有多个温度传感器,它们将同时响应一个存在脉冲。


重置的例子


//////////////////////////////////////////////////////////////////////////////// OW_RESET——执行重置一条线总线和/ /返回检测。重置是480us,所以延迟//值是(480-24)/16 = 28.5 -我们使用29。存在检查//另一个70秒后,所以延迟是(70-24)/16 = 2.875 -我们使用3。//unsigned char ow_reset(void){unsigned char存在;DQ = 0;//pull DQ line lowdelay(29);//设置为480usq = 1;//允许line返回highdelay(3);// wait for presence = DQ;//获取存在信号延迟(25);//等待timesloreturn (presence);//返回存在信号}// 0=存在,1 =不存在

下面四个示例中显示的读写功能代码段提供了所有数据位和数据字节读写操作所需的基本结构。


读位示例


//////////////////////////////////////////////////////////////////////////////// READ_BIT——从一条线总线读取一点。读取所需的延迟//是15us,因此delay例程不起作用。//我们将自己的delay函数以// for 循环的形式放入这个例程中。//unsigned char read_bit(void){unsigned char i;DQ = 0;// pull DQ low to start timeslotDQ = 1;//然后返回highfor (i=0;i< 3;我+ +);//延迟15秒,从时间返回(DQ)开始;//返回DQ行值}


写位示例


//////////////////////////////////////////////////////////////////////////////// WRITE_BIT——写一点到一条线总线,bitval传入。//无效write_bit(char bitval){DQ = 0;// pull DQ low to start timeslotif(bitval==1)//如果写延迟(5),返回DQ高;//延时提供16us /循环,再加24us。因此延时(5)= 104us


读字节示例


//////////////////////////////////////////////////////////////////////////////// READ_BYTE——从一条线总线读取一个字节。//unsigned char read_byte(void){unsigned char i;unsigned char value =0; for (i=0;i<8;i++){if(read_bit ) value|=0x01<<i;//每次读取一个字节,然后//向左移位//等待剩余的时间段}return(value);}


写字节示例


//////////////////////////////////////////////////////////////////////////////// WRITE_BYTE——将一个字节写入一条线巴士。//void write_byte(char val){unsigned char i;unsigned char temp;for (i=0;i< 8;i++) //每次写入一个字节{temp = val>> I;//移出val右'i'的空间&= 0x01;//将该位复制到tempwrite_bit(temp);//将temp中的位写入}delay(5);}

搜索ROM算法

为了充分利用1线网络概念,微控制器必须能够与连接到网络的任何数量的设备进行通信。为了做到这一点,微控制器必须使用图4所示的“搜索ROM”算法学习总线上每个设备的唯一64位ROM识别码。图4中的示例解释了带有四个从设备的总线的Search ROM例程。还显示了搜索ROM例程的示例代码。一旦所有ROM代码被识别,“匹配ROM”命令就可以用来与网络上的任何特定设备进行通信。


图4 搜索ROM算法。

查找ROM示例

在ROM搜索过程中,总线主机必须重复一个简单的三步程序:1)从从设备读取ROM代码位,2)读取该位的补码,3)写入该位的选定值。总线主机必须执行这个三步例程64次——每个ROM码位执行一次。经过一次完整的通过后,总线主机将知道总线上一个从设备的ROM代码。其余的设备及其ROM代码可以通过额外的通道来识别。

下面的示例说明了ROM Search过程,该示例假设四个不同的设备连接到相同的1-Wire总线。四个设备的ROM代码如下所示:

ROM1 00110101…
ROM2 10101010…
ROM3 11110101…
ROM4 00010001…

搜索过程如下:

  1. 总线主机通过发出复位脉冲开始初始化序列。从设备通过发出同步存在脉冲来响应。

  2. 然后总线主机在1线总线上发出搜索ROM命令。

  3. 每个设备将通过将各自ROM代码的第一个比特的值放置到1线总线上来响应搜索ROM命令。然后,主机将读取总线值。在这种情况下,ROM1和ROM4将在1-Wire总线上放置一个0,也就是说,它们将把它拉低。ROM2和ROM3将通过允许线路保持高位将1放置到1- wire总线上。结果是在线上所有设备的逻辑与;因此,总线主控将读取一个0。1- wire总线上的所有设备将通过将其ROM代码的第一个位的补码放置到1- wire总线上来响应此读取:ROM1和ROM4将在1- wire总线上放置1,允许线路保持高位,ROM2和ROM3将在总线上放置0,将其拉低。总线主机现在将再次读取总线,并将再次读取0。

    根据从设备ROM代码的不同,总线主站可以从两次读取中获得四种可能的数据组合。这些组合可以解释如下:

    00有连接到总线的设备在当前ROM代码位位置上有冲突的位。
    01所有连接到总线的设备在这个位上都有一个0。
    10所有连接到总线的设备在这个位上都有一个1。
    11没有设备连接到1-Wire总线。

    在这个例子中,总线主机在每次读取期间都读取一个0,这告诉它在1- wire总线上有一些设备在第一个ROM代码位置上具有0,而其他设备具有1。

  4. 作为对前一个数据的响应,总线主机在总线上写入一个0。这将在此搜索通道的其余部分取消选择ROM2和ROM3,只将ROM1和ROM4“连接”到1-Wire总线。

  5. 总线主机再执行两次读操作,接收一个0和一个1。这表明仍然连接到总线的所有设备的第二个ROM数据位都是0。

  6. 然后总线主机写入一个0以保持ROM1和ROM4都连接到总线上。

  7. 总线主机再次执行两次读取并接收两个0。这向主机表明,1- wire总线上的一个设备在第三个ROM代码位置上具有0,而另一个具有1。

  8. 总线主机在总线上写入一个0,它取消选择ROM1,使ROM4成为唯一仍然连接的设备。

  9. 总线主机从ROM4读取ROM位的剩余部分,如果需要,继续访问ROM4设备。这就完成了第一个ROM查找通道;总线主机现在已经通过学习它的ROM代码唯一地标识了1-Wire总线上的一个从机(ROM4)。

  10. 总线主机通过重复步骤1到步骤7开始一个新的ROM搜索序列。

  11. 总线主机现在将1写入总线(而不是0,就像在步骤8中所做的那样)。这将使ROM4解耦,只留下ROM1仍然连接。

  12. 总线主机现在从ROM1读取其余的ROM位,如果需要,可以与ROM1设备通信。这就完成了第二次ROM搜索,主设备现在已经确定了另一个从设备(ROM1)。

  13. 总线主机通过重复步骤1到步骤3开始一个新的ROM搜索。

  14. 总线主机现在将1写入总线(而不是0,就像在步骤4中所做的那样)。这将取消选择ROM1和ROM4用于该搜索传递的其余部分,只留下ROM2和ROM3耦合到总线上。

  15. 总线主机执行两次读取并接收两个0。

  16. 总线主机在总线上写入一个0,它将ROM3解耦,只留下ROM2连接到总线上。

  17. 总线主机从ROM2读取ROM位的剩余部分,如果需要,则与ROM2设备通信。这就完成了第三次ROM搜索,主设备现在已经确定了ROM从设备。

  18. 总线主机通过重复步骤13到15开始第四次也是最后一次ROM搜索。

  19. 总线主机将1写入总线(而不是步骤16中所做的0),这将使ROM2解耦,只留下ROM3连接到总线。

  20. 总线主机从ROM3读取ROM位的剩余部分,如果需要,则与ROM3设备通信。这就完成了第四次ROM搜索,在此期间主机识别了ROM3设备。在这一点上,主设备已经识别了总线上的所有从设备,并且从这一点上,总线主设备可以使用它们的ROM代码单独寻址任何设备。

注意:总线主人在每次ROM搜索通过期间学习一个1-Wire设备的唯一ROM代码。学习一个ROM代码所需的时间是:

960µs + (8 + 3 × 64) 61µs = 13.16m

因此总线主机每秒能够识别75个不同的1线从设备。

搜索ROM代码示例

如下面的原型函数所示,“查找设备”函数以1线重置开始,以确定是否有设备在网络上,如果有,则唤醒它们。然后调用“First”函数,以跟踪差异位并返回“Next”,该函数查找网络上的每个唯一设备。

“Next”函数非常广泛,它完成了查找网络上每个设备的每个唯一64位ROM代码标识符的大部分工作。

// FIND DEVICESvoid FindDevices(void){unsigned char m;if(!ow_reset ) //当检测到存在时开始{if(First ) //当至少找到一个部分时开始{numROMs=0;do{numROMs++;for(m=0;m<8;m++){FoundROM[numROMs][m]=ROM[m];//识别已找到设备上的ROM\\编号}printf("\nROM CODE =%02X%02X%02X%02X\n",FoundROM[5][7],FoundROM[5][6],FoundROM[5][4],FoundROM[5][3],FoundROM[5][2],FoundROM[5][1],FoundROM[5][0])}while (Next &&(numrom <10));//继续,直到没有找到其他设备}}}
// FIRST函数重置ROM搜索的当前状态,并调用// Next来查找1-Wire总线上的第一个设备。//unsigned char First(void){lastDiscrep = 0;//重置最后一次查找的差异globaldoneFlag = FALSE;返回Next ;//调用Next并返回其返回值}
// NEXT// NEXT函数在1-Wire总线上查找下一个设备。如果1-Wire上没有更多的设备,则返回false。//unsigned char Next(void){unsigned char m = 1;// ROM位indexunsigned char n = 0;// ROM Byte indexunsigned char k = 1;// bitmaskunsigned char x = 0;//差异标记;//输出bitunsigned char;//返回值标记;//设置下一个标志为false down = 0;//重置downcrcflag = ow_reset ;//复位1-Wireif(flag||doneFlag) //没有部件->返回false{lastDiscrep = 0;//重置搜索返回FALSE;}write_byte(0xF0);//发送搜索命令//所有八个字节{x = 0;if(read_bit ==1) x = 2;delay(6);if(read_bit ==1) x |= 1;//和它的互补(x ==3) //在1-断线上没有设备;else{if(x>0) //所有设备耦合为0或1g = x>>1;//位写入值的搜索else{//如果这个差异是之前的最后一个//差异在前一个下一个选择//相同的最后一次如果(m< last离散)g = ((ROM[n]&k)>0);否则//如果等于最后一次选择1g = (m== last离散);//如果没有,则拾取0//如果拾取0,则记录//位置用掩码kif (g==0) discrepMarker = m;}if(g==1) //用掩码kROM[n] |= k;elseROM[n] &= ~k;//写入++;//增量位计数器mk = k<<1;//移动位掩码kif(k==0) //如果掩码为0,则转到新ROM{// byte n并重置maskow_crc(ROM[n]);//累积crcn++;k + +;}}}, (n< 8);//循环直到所有ROM字节0-7if(m<65|| downcrc) //如果搜索失败,则lastdiscrep =0;//将最后一个差异重置为0否则{//搜索成功,因此设置last离散,// lastOne, nxtlast离散= discrepMarker;doneFlag = (last离散==0);nxt = TRUE;//表示搜索尚未完成,还有更多//部分剩余}返回nxt;}

执行循环冗余检查

循环冗余检查(CRC)可以使用下面所示的函数来完成,并且在执行Search ROM功能时应该包含该函数。

//////////////////////////////////////////////////////////////////////////////// 一线CRC / / unsigned char ow_crc (unsigned char x) {dowcrc = dscrc_table [dowcrc ^ x];返回dowcrc;}
#定义错误0 #定义真正的1 ////////////////////////////////////////////////////////////////////////////// 全局变量/ /无符号字符罗[8];// ROM Bitunsigned char lastDiscrep = 0;// doneFlag = 0;// Done flagunsigned char FoundROM[5][8];/ /表发现罗codesunsigned char numROMs; unsigned char dowcrc;无符号字符代码dscrc_table[] ={0, 94188226, 97, 63221131194156126, 32163253, 31日,65157195年,33127252162年,64年,30岁,95年,1227189年,62年,96130220年,35125159193年,66年,28254160225191年,93年,3128222年,60岁,98190224年,2,92223129年,99年,61124年,34192158年,29岁,67161255年,70年,24250164年,39121155197132218年,56102229187年,89年,7219133103年,57186228年,88年,25岁,71165251120年,38196154101年,59217135年,90184230167249, 27岁,69198152122,36248166,68,26153199,37123,58100134216,91,5231185140210,48110237179,81,15日,78年,16242172年,47113147205年,17日,79173243112年,46204146211141111年,49178236年,14日,80175241年,19日,77206144114年,44109年,51209143年,12,82176238,50108142208,83,13239177240174,76,18145207,45115202148118,40171245,23日,73年,8,86180234105,55213139,87,9235181,54104138212149203,41119244170,72,22233183,85、111,136,214、52,106、43,117,151,201、74、20,246,168,116、42,200,150、21、75,169,247,182,232、10、84,215,137,107、53};

设备温度

如果网络上只有一台设备,则可以直接使用“读取温度”功能,如下图所示。但是,如果网络上有多个设备,为了避免数据冲突,必须使用“Match ROM”功能来选择特定的设备。

下面的代码示例是专门为DS18S20温度传感器编写的。要将此代码与DS18B20或DS1822一起使用,由于温度寄存器格式的差异,必须对其进行稍微修改。有关温度寄存器格式信息,请参阅相应的数据表。

void Read_Temperature(void){char get[10];char temp_lsb,temp_msb;int k;char temp_f,temp_c;ow_reset ;/ /跳过ROMwrite_byte (0 x44);//开始转换延迟(5);ow_reset ;write_byte(0xCC);//跳过ROMwrite_byte(0xBE);/ /读取抓Padfor (k = 0; k< 9 k + +){得到[k] = read_byte  ;} printf (" \ n便条簿数据= % % % X % X % X \ n ", [8], [7], [6], [5], [4], [3], [2], [1], [0]); temp_msb = [1];// Sign byte + lsbittemp_lsb = get[0];//临时数据加lsbif (temp_msb <= 0x80){temp_lsb = (temp_lsb/2);} // shift获取整个degreetemp_msb = temp_msb &0 x80;//掩码除符号bittif (temp_msb >= 0x80) {temp_lsb = (~temp_lsb)+1;} //双互补(temp_msb >= 0x80) {temp_lsb = (temp_lsb/2)}//移位得到整个degreeif (temp_msb >= 0x80) {temp_lsb = ((-1)*temp_lsb)}//添加符号bitprintf("\nTempC= %d度C\n", (int)temp_lsb);//打印temp. Ctemp_c = temp_lsb;//准备转换为Fahrenheittemp_f = (((int)temp_c)* 9)/5 + 32;printf("\nTempF= %d degrees F\n", (int)temp_f);//打印temp. F}

重新使用刮板内存

刮擦板存储器为用户提供所有必要的设备数据,包括温度,TH和TL可编程温度计设置,以及在分数温度测量中使用的计数剩余和计数每C数据。CRC字节也包含在Scratch Pad内存中。

空白Read_ScratchPad (void) {int j; char垫[10],printf(“胚根端胚乳ng便条簿数据\ \ n”);write_byte (0 xbe);为(j = 0; j< 9; j + +){垫[j] = read_byte  ;} printf (" \ n便条簿数据= % % % X % X % X % \ n”,[8],[7],[6],[5],[4],[3],[2],[1],垫[0]);}

“Read ROM”命令用于在网络上只有一个设备时查找64位的ROM代码。多个设备需要使用“搜索ROM”功能。

空白Read_ROMCode (void) {int n; char dat [9]; printf(“胚根端胚乳ng ROM代码\ \ n”);ow_reset  ; write_byte (0 x33);为(n = 0; n< 8; n + +) {dat [n] = read_byte  ;} printf (" \ n ROM代码= % X % X % % \ n”,dat [7], dat [6], dat [5], dat [4], dat [3], dat [2], dat [1], dat [0]);}

“匹配ROM”功能必须提供64位ROM- id来选择网络上的单个设备。

//unsigned char Send_MatchRom(void){unsigned char i;if(ow_reset )返回false;write_byte(0x55);/ /匹配ROMfor (i = 0; i< 8;我+ +){write_byte (FoundROM [numROMs][我]);//发送ROM代码}返回true;

附录A

DS5000(8051源代码)


// 1wiretalk.c—达拉斯半导体DS18x20/DS1822的功能//双线温度传感器//专为8051微控制器设计//此代码是使用DS5000/DS2251T开发的//请注意,运行此程序需要128K RAM大小。/*----------------------------------------------------------------------*///# 编译指示代码优化小(3)/ *命令行指令* / # include & lt; absacc.h>/*绝对寻址模式*/#include </*字符类型*/#include </*标准数学*/#include </*标准I/O */#include <string.h>/*字符串函数*/#include <ds50001w.h>/ * DS5000系列8052寄存器  *//*----------------------------------------------------------------------*//* 配置参数  *//*----------------------------------------------------------------------*/# 定义XtalFreq(11059490) / *主要晶体频率* / # define CntrFreq (XtalFreq / 12) / *主要频率计数器* / # define波特率(9600)/ *波特率* / # define CntrTime(8) / *周期计数器数量* / # define英尺(32768.0)/ *目标晶体频率*//*----------------------------------------------------------------------*//*--------------------------------------------------------------------* ////////////////////////// 主程序开始 ////////////////////////////// 主要  {/*----------------------------------------------------------------------*//* 局部变量  *//*----------------------------------------------------------------------*/ 无符号字符Select_Type;/ *函数变量  *//*----------------------------------------------------------------------*//* 开始的程序执行  *//*----------------------------------------------------------------------*//* 抑制看门狗定时器和设置内存  *//*----------------------------------------------------------------------*/ TA = 0 xaa;/*定时访问*/TA = 0x55;PCON = 0x00;/ *抑制看门狗定时器  */*----------------------------------------------------------------------*//* 设置串口  *//*----------------------------------------------------------------------*/ SCON = 0×50;/* SCON: mode 1,8位UART, enable rcvr */TMOD = 0x21;/* TMOD:定时器1,模式2,8位reload *//* TMOD:定时器0,模式1,16位*/PCON |= 0x80;/* SMOD = 1 */TH0=TL0 = 0;TH1=TL0 = (unsigned int)(256 - ((XtalFreq / BaudRate) / 192));TR0 = 1;/* TR0:定时器0运行*/TR1 = 1;/* TR1:定时器1运行*/TI = 1;/ * TI:TI的UART发送第一个字符  *//*----------------------------------------------------------------------*//* 显示DS1820横幅一条线设备  *//*----------------------------------------------------------------------*/ printf (" \ n "); printf("达拉斯半导体-系统扩展\ n”);printf("来源DS1820温度ng和\ n”);printf(“搜索ROM代码。\ n”);printf(" 8月更新的代码,2001 \ n”);printf (" [C程序DS500x或8051兼容单片机]”);printf (" \ n \ n "); printf (" \ n ********************************************************************\ n”);printf("选择菜单选项\ n "); printf(" 1。单线复位\n");在网络上读取单个设备的ROM代码\n");执行“搜索ROM\n”;Read Scratch PAD\n");读取温度\n");找到所有设备\ n”);printf (" \ n \ n "); printf(“注意:这个程序是一个例子。\ n”);printf("不保证或提供这个项目的技术支持。\ n ");/*----------------------------------------------------------------------*/ 做  {/*----------------------------------------------------------------------*//* 使CE2  *//*----------------------------------------------------------------------*/ EA = 0;/*禁止中断*/TA = 0xAA;/*定时访问*/TA = 0x55;MCON = MCON |= 0x04;/ *使上部CE 0 xcc  *//*----------------------------------------------------------------------*//* 禁用CE2  *//*----------------------------------------------------------------------*/ TA = 0 xaa;/*定时访问*/TA = 0x55;MCON = 0xC8;/*关闭上层CE */EA = 1;/*启用中断*/Select_Type = getchar ;/*获取变量开始*/切换(Select_Type){case '1': printf ("\n 1. "ow_reset ;break;case '2': printf (" 2;读取网络上单个设备的ROM代码\n");ow_reset ;Read_ROMCode ;case '3': printf("\n ")ow_reset ;First ;printf("\nROM CODE =%02X%02X%02X%02X\n",FoundROM[5][7],FoundROM[5][6],FoundROM[5][5] [4],FoundROM[5][3],FoundROM[5][2],FoundROM[5][1],FoundROM[5][0]);break;case '4': printf("\n ")。ow_reset ;write_byte(0xCC);//跳过ROMRead_ScratchPad ;break;case '5': printf ("\n ";读温度\ n”);Read_Temperature  ;//启动温度重置;case '6': printf ("\n 6. n ")
ow_reset ;FindDevices ;break;默认:printf ("\n打字错误:选择另一个菜单选项\n");break;};/* end switch*/} while (1);/ *永远循环  *//*----------------------------------------------------------------------*//* 结束程序  *//*----------------------------------------------------------------------*/

附录B

DS5000 (8051c包含头文件)


/*----------------------------------------------------------------------------- DS5000。达拉斯半导体DS5000的h头文件。版权所有(c) 1995-1996 Keil Software, Inc版权所有。-----------------------------------------------------------------------------*/# 如果未定义DS5000_HEADER_FILE # define DS5000_HEADER_FILE 1 /*------------------------------------------------ DS5000字节寄存器 ------------------------------------------------*/ sfr P0 = 0 x80; sfr SP = 0 x81; sfr DPL = 0 x82; sfr衰变时= 0 x83; sfr PCON = 0 x87; sfr TCON = 0 x88; sfr TMOD = 0 x89; sfr TL0 = 0 x8a; sfr TL1 = 0 x8b; sfr TH0 = 0 x8c; sfr TH1 = 0 x8d; sfr P1 = 0 x90; sfr SCON = 0 x98; sfr SBUF = 0 x99; sfr P2 = 0 xa0; sfr IE = 0 xa8; sfr P3IP = 0 = 0 xb0; sfr xb8; sfr MCON = 0 . xc6; sfr TA = 0 xc7; sfr PSW = 0 xd0; sfr ACC = 0 xe0; sfr B = 0 xf0 ;/*------------------------------------------------ DS5000 P0位寄存器 ------------------------------------------------*/// sbit P0_0 = 0 x80;//设置输出位DQ = 0x80;/ /设置输出Heresbit P0_1 = 0 x81; sbit P0_2 = 0 x82; sbit P0_3 = 0 x83; sbit P0_4 = 0 x84; sbit P0_5 = 0 x85; sbit P0_6 = 0 x86; sbit P0_7 = 0 x87; AN16217 /*------------------------------------------------ DS5000 PCON位的值 ------------------------------------------------*/# 定义IDL_ 0 x01 # define STOP_ 0 x02 # define EWT_ 0 x04 # define EPFW_ (# define WTR_ 0 x10 # define PFW_ 0 x20 # # define定义POR_ 0 x40 SMOD_ 0 x80 /*------------------------------------------------ DS5000 TCON一点寄存器 ------------------------------------------------*/ sbit IT0 = 0 x88; sbit IE0 = 0 x89; sbit IT1 = 0 x8a; sbit IE1 = 0 x8b; sbit TR0 = 0 x8c; sbit TF0 = 0 x8d; sbit TR1 = 0 x8e; sbit TF1 x8f = 0 ;/*------------------------------------------------ DS5000 TMOD位的值 ------------------------------------------------*/# 定义T0_M0_ 0 x01 # define T0_M1_ 0 x02 # define T0_CT_ 0 x04 # define T0_GATE_ (# define T1_M0_ 0 x10 # define T1_M1_ 0 x20 # # define定义T1_CT_ 0 x40 T1_GATE_ 0 x80 # define T1_MASK_ 0 xf0 #定义T0_MASK_ 0 x0f /*------------------------------------------------ DS5000 P1段寄存器 ------------------------------------------------*/ sbit P1_0 = 0 x90; sbit P1_1 = 0 x91; sbit P1_2 = 0 x92; sbit P1_3 = 0 x93; sbit P1_4 = 0 x94; sbit P1_5 = 0 x95; sbit P1_6 = 0 x96; sbit P1_7 = 0 x97; AN16218 /*------------------------------------------------ DS5000 SCON位寄存器 ------------------------------------------------*/ sbit RI = 0 x98; sbit TI = 0 x99; sbit RB8 = 0 x9a; sbit TB8 = 0 x9b; sbit任= 0 x9c; sbit SM2 =0 x9d; sbit SM1 = 0 x9e; sbit SM0 x9f = 0 ;/*------------------------------------------------ DS5000 P2位寄存器 ------------------------------------------------*/ sbit P2_0 = 0 xa0; sbit P2_1 = 0 xa1; sbit P2_2 = 0 xa2; sbit P2_3 = 0 xa3; sbit P2_4 = 0 xa4; sbit P2_5 = 0 xa5; sbit P2_6 = 0 xa6; sbit P2_7 xa7 = 0 ;/*------------------------------------------------ DS5000 IE位寄存器 ------------------------------------------------*/ sbit EX0 = 0 xa8; sbit ET0 = 0 xa9; sbit EX1 = 0 xaa; sbit ET1 = 0 xab; sbit ES =0 xac; sbit EA xaf = 0 ;/*------------------------------------------------ DS5000 P3位寄存器(助记符,港口 )------------------------------------------------*/ sbit RD = 0 xb7; sbit WR = 0 xb6; sbit T1 = 0 xb5; sbit T0 = 0 xb4; sbit INT1 = 0 xb3; sbit INT0 = 0 xb2; sbit TXD = 0 xb1; sbit RXD = 0 xb0; sbit P3_0 = 0 xb0; sbit P3_1 = 0 xb1; sbit P3_2 = 0 xb2; sbit P3_3 = 0 xb3; sbit P3_4 = 0 xb4; sbit P3_5 = 0 xb5; sbit P3_6 = 0 xb6; sbit P3_7 = 0 xb7; AN16219 /*------------------------------------------------ DS5000 IP位寄存器 ------------------------------------------------*/ sbit PX0 = 0 xb8; sbit PT0 = 0 xb9; sbit PX1 = 0 xba; sbitPT1 = 0 xbb; sbit PS = 0 xbc; sbit RWT xbf = 0 ;/*------------------------------------------------ DS5000 MCON位的值 ------------------------------------------------*/# 定义SL_ 0 x01 # define PAA_ 0 x02 # define ECE2_ x04 #定义RA32_8_0x08 #定义PA0_ 0 x10 # define PA1_ 0 x20 # # define定义PA2_ 0 x40 PA3_ 0 x80 /*------------------------------------------------ DS5000 PSW位寄存器 ------------------------------------------------*/ sbit P = 0 xd0; sbit OV = 0 xd2; sbit RS0 = 0 xd3; sbit RS1 = 0 xd4; sbit F0 =0 xd5; sbit AC = 0 xd6; sbit CY xd7 = 0 ;/*------------------------------------------------ 中断向量:中断地址=(数量* 8)+ 3 ------------------------------------------------*/# 定义IE0_VECTOR 0 * 0 x03 * / # define TF0_VECTOR 1 / * 0 x0b * / # define IE1_VECTOR 2 / * 0 * 13 * / # define TF1_VECTOR 3 / * 0 x1b * / # define SIO_VECTOR 4 / * 0 x23 * / 5 # define PFW_VECTOR x2b / * 0  *//*------------------------------------------------------------------------------------------------*/# endif



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: