AFB0912HHD AFB0912HHD AFB0912HHD
数据区:数据区包括需要由从机返送何种信息或执行什么动作。
CPU内部用了一个500mS定时器来控制通讯,每500mS读一次变频器的频率。次读个变频器,第二次读第二个变频器,然后再返回读个,周而复始。当文本屏要设定数据时,暂停定时器停止通讯,设定后返回正确信息。如果设定不,返回错误信息并提示重新设定。若不次数过5次即报警,认为PLC不能与该变频器通讯。
**台达风扇---------代理 销售**
【程先生 qq:937926739】
风机、水泵设备通常是以流量为控制对象的。传统的流量控制方法是阀门/挡板控制法,即通过关小和开大阀门/挡板的开度来调节流量。阀门控制法的实质是通过改变管网阻力大小来改变流量。因此,这种控制方式当所需流量减少时,压力反而会增加,故轴功率的降低有限,此时,过剩的风机、水泵功率将导致压力增加而白白浪费掉了。
风机、水泵节电器可在保持阀门/挡板开度不变的前提下,通过改变风机、水泵的转速来调节流量,其实质是通过减少流体动力来节电。
由流体力学理论可知,流量与转速的一次方成正比,压力与转速的平方成正比,轴功率与转速的三次方成正比。
因此,采用风机、水泵节电器这种控制方式时,当所需流量减少时,轴功率将显著降低。例如,当流量下降到80%,转速也下降到80%时,轴功率将下降为额定功率的51%。这种控制方式可从根本上消除风机、水泵设备由于选型或负荷变化普遍存在的“大马拉小车”的动力浪费现象,消除了挡板节流阻力,使风机、水泵始终运行在佳工作状态。
风机、水泵节电器的平均节电率为30%-60%,具有投资回收期短,受益期长等特点,是现代风机、水泵控制之理想设备。
笔者了解到有些朋友惯把瓶装水倒在杯子里放入微波炉加热,用来沏茶。但是当把茶一放入杯中,杯子里的水就立即冒出大量的气泡,其中的水竟然突然沸腾起来,而且沸腾十分剧烈,杯子中90%的水都炸裂了出来,令人心惊胆战!
这是杯子中有一部分水处于过热状态的缘故,也就是说,这部分水的温度实际上已经高过沸点,也就是高过在正常情况下应该变成水蒸气的温度。杯子里的水在微波炉中之所以没有沸腾,那是因为水中缺乏形成气泡的成核中心(凝结核)。
若用水壶烧水就不会出现这种现象,因为水壶有粗糙的内表面,而且有从壶底升起的热水搅动,这些都可以使水正常沸腾。液体内的湍流也能够加强形成气泡的成核过程,为了预防这种事情发生,用微波炉加热任何液体,加热后都必须让它在炉内静置至少一分钟,然后再开门动它。
把水壶放在炉子上直接烧开水,水温上升后,内部出现循环流动,再加上水壶壁的一些细微划痕或壶底细微的过热颗粒,这些被称之为晶核的物质,使得一些水分子由液态变成了气态,形成蒸汽气泡上升到水的表面:随后气泡大量形成并不断上升,就意味着水已达到100℃的恒定温度。微波炉工作时,容器本身并不发热,水不会发生循环流动。由于没有晶核,水中不会产生气泡,有时无法看到翻滚沸腾现象,因此也无法知道水是否被烧开。如果加热时间长了,水有可能被烧得越来越热,甚至过沸点,这时的水就是过热水。当你把盛有过热水的微波炉容器放在桌子上时,只要轻微地碰击,就会扰动容器里面的水,由此引发的水气流就会起到某种晶核作用,导致水突然沸腾、溅出,甚至造成烫伤。
下面结合8051介绍单片机C语言的优越性:
·不懂得单片机的指令集,也能够编写的单片机程序;
·无须懂得单片机的具体硬件,也能够编出符合硬件实际的水平的程序;
·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;
·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多性的处理,避免了运行中间非异步的破坏;
·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;
·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;
·提供small、compact、large等编译模式,以适应片上存储器的大小;
·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;
·提供常用的标准函数库,以供用户直接使用;
·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;
·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;
·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
一、单片机的特点 :
1 、具有优异的性能价格比
2 、集成度高、体积小、可靠性高
3 、控制功能强
4 、低电压、低功耗
二、单片机的应用 :
1 、在智能仪器仪表中的应用:在各类仪器仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,简化仪器仪表的硬件结构,提高其性能价格比。
2 、在机电一体化中的应用:机电一体化产品是指集机械、微电子技术、计算机技术于一本,具有智能化特征的电子产品。
3 、在实时过程控制中的应用:用单片机实时进行数据处理和控制,使系统保持佳工作状态,提高系统的工作效率和产品的质量。
4 、在人类生活中的应用:目前国外各种家用电器已普通采用单片机代替传统的控制电路。
5 、在其它方面的应用:单片机除以上各方面的应用,它还广泛应用于办公自动化领域、商业营销领域、汽车及通信、计算机外部设备、模糊控制等各领域中。

三、单片机的基本组成 :
它由 CPU 、存储器(包括 RAM 和 ROM )、 I/O 接口、定时 / 计数器、中断控制功能等均集成在一块芯片上,片内各功能通过内部总线相互连接起来。
输入 / 输出引脚 P0 、 P1 、 P2 、 P3 的功能 :P0.0~P0 。 7 : P0 口是一个 8 位漏极开路型双向 I/O 端口。在访问片外存储器时,它分时作低 8 位地址和 8 位双向数据总线用。在EPROM 编程时,由 P0 输入指令字节,而在验证程序时,则输出指令字节。验证程序时,要求外接上拉电阻。 P0 能以吸收电流的方式驱动8个LSTTL 负载。
P1. 0 ~P1. 7 ( 1~8 脚): P1 是一上带内部上拉电阻的 8 位双向 I/O 口。在 EPROM 编程和验证程序时,由它输入低 8 位地址。 P1 能驱动 4 个 LSTTL 负载。
在 8032/8052 中, P1. 0 还相当于功能端 T2 ,即定时器的计数触发输入端; P1. 1 还相当于功能端T2EX ,即定时器 T2 的外部控制端。P2.0~P2.7 ( 21~28 脚): P2 也是一上带内部上拉电阻的 8 位双向 I/O 口。在访问外部存储器时,由它输出高 8 位地址。在对 EPROM 编程和程序验证时,由它输入高 8 位地址。 P2 可以驱动 4 个 LSTTL 负载。P3. 0 ~P3. 7 ( 10~17 脚): P3 也是一上带内部上拉电阻的双向 I/O 口。在 MCS-51 中,这 8 个引脚还用于专门的第二功能。 P3 能驱动 4 个 LSTTL 负载。
P3. 0 RXD (串行口输入)
P3. 1 TXD (串行口输出)
P3. 2 INT0 (外部中断 0 输入)
P3. 3 INT1 (外部中断 1 输入)
P3. 4 T0 (定时器 0 的外部输入)
P3. 5 T1 (定时器 1 的外部输入)
P3. 6 WR (片外数据存储器写选通)
P3. 7 RD (片外数据存储器读选通)
四、MCS-51 的寻址方式:
1 、立即寻址 如: MOV A , #40H
2 、直接寻址 如: MOV A , 3AH
3 、寄存器寻址 如: MOV A , Rn
4 、寄存器间接寻址 如: MOV A , @Rn
5 、基址加变址寻址 如: MOVC A , @A+DPTR
6 、相对寻址 如: SJMP 08H
7 、位寻址 MOV 20H , C
五、指令:
MOV : 片内 RAM 传送
MOVX : 片外 RAM 传送
MOVC : ROM 传送
XCH : 交换(和 A 交换)
SWAP : A 内半字节交换
ADD :不带进位加
ADDC :带进位加
SUBB :带进位减
INC :加 1
DEC :减 1
MUL :乘法
DIV :除法
DAA :调整
六、计数初值的计算
定时或计数方式下计数初值如何确定,定时器选择不同的工作方式,不同的操作模式其计数值均不相同。若设大计数值为 M ,各操作模式下的 M 值为:
模式 0 : M=2 13 =8192
模式 1 : M=2 16 =65536
模式 2 : M=2 8 =256
模式 3 : M=256 ,定时器 T0 分成 2 个独立的 8 位计数器,所以 TH0 、 TL0 的 M 均为 256 。
因为 MCS-51 的两个定时器均为加 1 计数器,当初到大值( 00H 或 0000H )时产生溢出,将 TF 位置 1 ,可发出溢出中断,因此计数器初值 X 的计算式为: X=M- 计数值式中的 M 由操作模式确定,不同的操作模式计数器的长不相同,故M值也不相同。而式中的计数值与定时器的工作方式有关。
1 、计数工作方式时
计数工作方式时,计数脉冲由外部引入,是对外部冲进行计数,因此计数值根据要求确定。其计数初值: X=M- 计数值
例如:某工序要求对外部脉冲信号计 100 次, X=M-100
2 、定时工作方式时
定时工作方式时,因为计数脉冲由内部供给,是对机器周期进行计数,故计数脉冲频率为 f cont =f osc × 1/12 、计数周期 T=1/f cont =12/f osc 定时工作方式的计数初值 X 等于:
X=M- 计数值 =M-t/T=M- ( f osc × t ) /12
式中: f osc 为振荡器的振荡频率, t 为要求定时的时间。
定时器有两种工作方式 :即定时和计数工作方式。由 TMOD 的 D6 位和 D2 位选择,其中 D6 位选择 T1 的工作方式, D2 位选择 T0 的工作方式。 =0 工作在定时方式, =1 工作在计数方式。并有四种操作模式:
1 、模式 0 : 13 位计数器, TLi 只用低 5 位。
2 、模式 1 : 16 位计数器。
3 、模式 2 : 8 位自动重装计数器, THi 的值在计数中不变, TLi 溢出时, THi 中的值自动装入 TLi 中。
4 、模式 3 : T0 分成 2 个独立的 8 位计数器, T1 停止计数。
MCS-51 有 5 个中断源,可分为 2 个中断优先级,即高优先级和低优先级,中断自然优先级:
外部中断 0 ;定时器 0 中断; 外部中断 1 ;定时器 1 中断 ;
串行口中断 ;定时器 2 中断
( 1 )同级或高优先级的中断正在进行中;
( 2 )现在的机器周期还不是执行指令的后一上机器周期,即正在执行的指令还没完成前不响应任何中断;
( 3 )正在执行的是中断返回指令 RET1 或是访问寄存器 IE 或 IP 的指令,换而言之,在 RETI 或者读写 IE 或 IP 之后,不会马上响应中断请求,至少要在执行其它一要指令之扣才会响应。
(一)中断响应条件
CPU 响应中断的条件有:
( 1 )有中断源发出中断请求;
( 2 )中断允许位 EA=1 ,即 CPU 开中断;
( 3 )申请中断的中断源的中断允许位为 1 ,即没有被屏蔽。
七、串行口工作方式及帧格式
MCS-51 单片机串行口可以通过软件设置四种工作方式:
方式 0 :这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收低位。
方式 2 :采用这种方式可接收或发送 11 位数据,以 11 位为一帧,比方式 1 增加了一个数据位,其余相同。第 9 个数据即 D8 位具有特别的用途,可以通过软件搂控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用于多机通信。方式 2 的波特率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,可由 PCON 的高位选择。
方式 3 :方式 3 与方式 2 完全类似,的区别是方式 3 的小组特率是可变的。而帧格式与方式 2- 样为 11 位一帧。所以方式 3 也适合于多机通信。
1.1 了解单片机的能力
【规则1】设计满足要求的精简的系统。
正确估计单片机的能力,知道单片机能做什么,大程度的挖掘单片机的潜力对一个单片机系统设计者来说是至关重要的。我们应该有这样一个认识,即单片机的处理能力是非常强大的。早期的PC机,其CPU(8086)处理能力和8051 相当,却能处理相当复杂的任务。单片机的能力的关键就在软件设计者编写的软件上。只有充分地了解到单片机的能力,才不会做出“冗余”的系统设计。而采用许多的外围芯片来实现单片机能实现的功能。这样做,即增加了系统成本,也可能会降低了系统的可靠性。
1.2 系统可靠性至关重要
【规则2】使用看门狗。
看门狗电路通常是一块在有规律的时间间隔中进行更新的硬件。更新一般由单片机来完成,如果在一定间隔内没能更新看门狗,那看门狗将产生复位信号,重新复位单片机。更新看门狗的具体形式多是给看门狗芯片相关引脚提供一个电平上升沿或读写它的某个寄存器。使用看门狗电路将在单片机发生故障进行死机状态时,重新复位单片机。当前有多种看门狗的芯片,如MAXIM 公司的MAX802,MAX813 等。而且,有好多种单片机中本身就集成有看门狗。一个外部的看门狗是好的,因为它不依赖于单片机。如果可能的话,看门狗更新程序不应该放在中断或是子程序中,原则上应该放在主程序中。我曾经见过一个工程师,他所调试的程序在运行时偶而会引起看门狗的复位动作,于是他干脆在每10ms 就中断一次的时钟中断程序中清看门狗。我相信他也知道使看门狗失去作用,可他却没有不是去查明引起这个现象的真正原因。因此,我想提醒大家:不论什么理由,不要忽略系统故障的真正原因。高质量的产品来自于高素质的工程师,高质量的产品造就高素质的工程师。
【规则3】确定系统的复位信号可靠。
这是一个很容易忽略的问题。当你在设计单片机系统时,你脑中有这个概念吗?什么样的复位信号才是可靠的吗?你用示波器查看过你设计的产品的复位信号吗?不稳定的复位信号可能会产生什么样的后果?你有没有发现过你所设计的单片机系统,每次重新上电启动后,数据变得乱七八糟,并且每一次现象并不相同,找不出规律,或者有时候干脆不运行,或者有时候进入一种死机状态,有时候又一点事都没有正常运行?在这种情况下,你应该查一下你的系统的复位信号。一般在单片机的数据手册(Datasheet)中都会提到该单片机需要的复位信号的要求。一般复位信号的宽度应为。复位电平的宽度和幅度都应满足芯片的要求,并且要求保持稳定。还有特别重要的一点就是复位电平应与电源上电在同一时刻发生,即芯片一上电,复位信号就已产生。不然,由于没有经过复位,单片机中的寄存器的值为随机值,上电时就会按PC 寄存器中的随机内容开始运行程序,这样很容易进行误操作或进入死机状态。
【规则4】确定系统的初始化有效。
系统程序开始应延时一段时间。这是很多单片机程序设计中的常用方法,为什么呢?因为系统中的芯片以及器件从上电开始到正常工作的状态往往有一段时间,程序开始时延时一段时间,是让系统中所有器件到达正常工作状态。究竟延时才算合适?这取决于系统的各芯片中到达正常工作状态的时间,通常以慢的为准。一般来说,延时20-100毫秒已经足够。对于系统中使用嵌入式MODEM 等“慢热”型的器件来说,则应更长。当然,这都需要在系统实际运行中进行调整。
【规则5】上电时对系统进行检测。
上电时对系统中进行检测是单片机程序中的一个良好设计。在硬件设计时也应该细细考虑将各个使用到的芯片、接口设计成容易使用软件进行测试的模式。很多有经验的单片机设计者都会在系统上电时(特别是次上电时)进行全面的检测,或者更进一步,将系统的运行状态中分为测试模式和正常运行模式,通过加入测试模式对系统进行详细的检测,使得系统的批量检测更为方便容易。另外要注意的是,一个简单明了的故障显示界面也是颇要费得心思的。比如:系统的外部RAM(数据存储器)是单片机系统中常用的器件。外部RAM 如果存在问题,程序通常都会成为一匹脱缰的野马。因此,程序在启动时(至少在次上电启动时)一定要对外部RAM 进行检测。检测内容包括:1)检测RAM 中的单元。这主要通过写入和读出的数据保持一致。2)检测单片机与RAM 之间的地址数据总线。总线即没有互相短路,也没有连接到“地”上。另外,很多芯片,都提供了测试的方法。如串行通信芯片UART,都带环路测试的功能。
【规则6】按EMC 测试要求设计硬件。
EMC 测试要求已经成为产品的必需。有很多的文章关于这方面的。
1.3 软件编程和调试
【规则7】尽可能使用Small 模式编译
对比起Large模式和Compact 模式,Small 模式能生成更为紧凑的代码。在Small 模式下,C51 编译器将没有使用关键词,如idata、pdata、xdata特殊声明的变量通通放在data单元中。在编程中,对于在的数据区,可以放在外部存储器中。
【规则8】在仿真前做好充分的准备
单片机硬件仿真器给单片机开发者带来了极大的方便,同时也很容易造成人的依赖性。很多时候,没有仿真器却能促使工程师写出更高质量的程序。也许在硬件仿真调试之前,下面准备工作将会对你有用:
1)程序编完后,对代码仔细逐行检查。检查代码的错误,建立自己的代码检查表,对经常易错的地方进行检查。检查代码是否符合编程规范。 2)对各个子程序进行测试。测试的方法:用程序测试程序,编制一个调用该子程序的代码,建立要测试子程序的入口条件,再看看它是否按预期输出结果。
3)如果代码有修改,再次对代码进行检查。
4)有可能的话,进行软件仿真——Keil C 的软件仿真功能十分强大。软件仿真可以防止因硬件的错误,如器件损坏、线路断路或短路,而引起调试的错误。
5)开始硬件仿真。
【规则9】使用库函数
重用代码,尤其是是标准库的代码,而不是手工编写你自己的代码。这样更快、更容易也更安全。KeilC 中提供了多个库函数,这些库函数的用法在KeilC 的帮助文件中有详细的描述。
【规则10】使用const。
这一点在很多经典的关于C 和C++的书籍中是必谈的要点。在《Exceptional C++》一书中,对这点有很精彩的描述,现摘录如下:“没有正确的安全意识的枪手在世界上是不可能活的很长的。const 观念不正确的程序员也是一样和没有时间戴紧帽子的正确,没有时间检查带电电线的电工一样不会活的很长。”
在C 语言中,const 修饰符表示告诉编译器此函数将不会改变被修饰的变量的指向的任何值(除了强制类型转换)。当把指针作为参数传递时,是合适地使用const,不仅可以防止你无意中错误的赋值,而且还可以防止在作为参数将指针传递给函数时可能会修改了本不想改变的指针所指向的对象的值。如: const int num = 7;
num = 9; file://有/可能得到编译器的警告。
const char *ptr,则表示该指针所指向的内容不会被改变,如果在程序中被发生对其赋值的操作,编译时将出错误提示。如:
const char *ptr = “hello”;
*ptr = ‘H’; file://错/误,所指内容不可改变也可将const 放在星号后面来声明指针本身不可改变。如:
char* const ptr;
ptr++; file://错/误,指针本身不可改变
也可同时禁止改变指针和它所引用的内容,其形式如下: const char* const ptr;
【规则11】使用static
static是一个能够减少命名冲突的有用工具。将只在一个模块文件中的变量和函数使用static 修饰,将不会和其他模块可能具有相同名称的函数和变量在模块连接时不会产生名称冲突。一般来说,只要不是提供给其它模块使用的函数,和非全局变量,均应使用static修饰。将子程序中的变量使用static 修饰时,表示这个变量在程序开始时分配内存,在程序结束时释放,它们在程序执行期间保持它们的值。如:
void func1(void)
{
static int time = 0;
time++
}
void func2(void)
{
static int time = 0;
time++;
}
两个子程序中的time 变量使用static 修饰,所以它们是静态变量,每调用一次time将进行加1,并保持这个值。它们的功能与下面程序相似:
int time1 = 0;
int time2 = 0;
void func1(void)
{
time1++
}
void func2(void)
{
time2++;
}
我们可以看出,使用static修饰后,模块中的全局变量减少,使得程序的更为简单。
【规则12】不要忽视编译器的警告。
编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。 【规则13】注意溢出问题,写安全的代码。