❶ 唤醒越频繁 单片机功耗怎么越低
是不是听反了啊
唤醒越频繁,功耗反而越高
唤醒越不频繁,功耗越低
单片机低功耗的解决方案常用方法如下:
目前单片机的种类很多,大多数都是针对某一类特定应用而设计的,合适的单片机系统选择与设计是节点微功耗设计的关键。单片机的微功耗设计可从下列几个因素考虑。
(1) 尽量选择集成度高的单片机。随着微电子技术的发展,单片机的集成度越来越高,实现了真正意义上的单片化。很多单片机都集成了大量的外围功能模块,如ADC、DAC、程序存储器、定时器、串行接口(RS232、SPI、I2C等)等。选择这样的器件,可有效加快开发进度、降低系统成本、减小体积、提高可靠性和抗干扰能力,同时SOC技术进一步降低了器件接口间的功耗。
(2) 考虑到有些场合单片机的工作特点,选择单片机不光要关注工作电流,更应该关注单片机休眠时的静态电流。单片机丰富的低功耗模式和极低的静态电流,在满足特定应用功能的同时,有效降低系统的功耗。
(3) 在满足应用要求的前提下,选择配较低的单片机,较小的RAM/ROM、较低的ADC分辨率、较低的ADC速率,较少的IO管脚都可以降低单片机的整体功耗。当然了,这个得能满足你产品需求的前提下
(4) 对于一个数字系统而言,其功耗大致满足公式:P=CV2f。其中C为系统的负载电容,V为电源电压,f为系统工作频率[2]。功耗与电源电压的平方成正比,因此电源电压对系统的功耗影响最大,其次是工作频率,再次就是负载电容。负载电容对设计人员而言,一般是不可控的,因此设计一个低功耗系统,在不影响系统性能的前提下,尽可能地降低电源的电压和工作频率。
(5) 对于大多数低功耗单片机来说,工作频率越低,意味着消耗的电流也越小,但是不能认为频率越低,系统整体功耗越小,因为工作频率降低,意味着需要更长的处理时间,其他外围电路消耗的电能就越多。目前有很多单片机都允许有两个或者两个以上的时钟源,低频时钟作为如UART、定时器等外围功能器件的时钟源,高频时钟作为系统的主时钟。在不需要高速运行的场合下,低频时钟也可以作为系统主时钟使用。
(6) 对于需要在工作状态与空闲状态之间频繁切换的应用,在考虑单片机本身低功耗的同时,应该考虑切换时间和切换电流。
❷ 单片机系统软件抗干扰方法
在提高硬件系统抗干扰能力的同时 软件抗干扰以其设计灵活 节省硬件资源 可靠性好越来越受到重视 下面以MCS 单片机系统为例 对微机系统软件抗干扰方法进行研究
软件抗干扰方法的研究
在工程实践中 软件抗干扰研究的内容主要是 一 消除模拟输入信号的嗓声(如数字滤波技术) 二 程序运行混乱时使程序重入正轨的方法 本文针对后者提出了几种有效的软件抗干扰方法
指令冗余
CPU取指令过程是先取操作码 再取操作数 当PC受干扰出现错误 程序便脱离正常轨道 乱飞 当乱飞到某双字节指令 若取指令时刻落在操作数上 误将操作数当作操作码 程序将出错 若 飞 到了三字节指令 出错机率更大
在关键地方人为插入一些单字节指令 或将有效单字节指令重写称为指令冗余 通常是在双字节指令和三字节指令后插入两个字节以上的NOP 这样即使乱飞程序飞到操作数上 由于空操作指令NOP的存在 避免了后面的指令被当作操作数执行 程序自动纳入正轨
此外 对系统流向起重要作用的指令如RET RETI LCALL LJMP JC等指令之前插入两条NOP 也可将乱飞程序纳入正轨 确保这些重要指令的执行
拦截技术
所谓拦截 是指将乱飞的程序引向指定位置 再进行出错处理 通常用软件陷阱来拦截乱飞的程序 因此先要合理设计陷阱 其次要将陷阱安排在适当的位置
软件陷阱的设计
当乱飞程序进入非程序区 冗余指令便无法起作用 通过软件陷阱 拦截乱飞程序 将其引向指定位置 再进行出错处理 软件陷阱是指用来将捕获的乱飞程序引向复位入口地址 H的指令 通常在EPROM中非程序区填入以下指令作为软件陷阱
NOP
NOP
LJMP H
其机器码为
陷阱的安排
通常在程序中未使用的EPROM空间填 最后一条应填入 当乱飞程序落到此区 即可自动入轨 在用户程序区各模块之间的空余单元也可填入陷阱指令 当使用的中断因干扰而开放时 在对应的中断服务程序中设置软件陷阱 能及时捕获错误的中断 如某应用系统虽未用到外部中断 外部中断 的中断服务程序可为如下形式
NOP
NOP
RETI
返回指令可用 RETI 也可用 LJMP H 如果故障诊断程序与系统自恢复程序的设计可靠 完善 用 LJMP H 作返回指令可直接进入故障诊断程序 尽早地处理故障并恢复程序的运行
考虑到程序存贮器的容量 软件陷阱一般 K空间有 个就可以进行有效拦截
软件 看门狗 技术
若失控的程序进入 死循环 通常采用 看门狗 技术使程序脱离 死循环 通过不断检测程序循环运行时间 若发现程序循环时间超过最大循环运行时间 则认为系统陷入 死循环 需进行出错处理
看门狗 技术可由硬件实现 也可由软件实现 在工业应用中 严重的干扰有时会破坏中断方式控制字 关闭中断 则系统无法定时 喂狗 硬件看门狗电路失效 而软件看门狗可有效地解决这类问题
笔者在实际应用中 采用环形中断监视系统 用定时器T 监视定时器T 用定时器T 监视主程序 主程序监视定时器T 采用这种环形结构的软件 看门狗 具有良好的抗干扰性能 大大提高了系统可靠性 对于需经常使用T 定时器进行串口通讯的测控系统 则定时器T 不能进行中断 可改由串口中断进行监控(如果用的是MCS 系列单片机 也可用T 代替T 进行监视) 这种软件 看门狗 监视原理是 在主程序 T 中断服务程序 T 中断服务程序中各设一运行观测变量 假设为MWatch T Watch T Watch 主程序每循环一次 MWatch加1 同样T T 中断服务程序执行一次 T Watch T Watch加1 在T 中断服务程序中通过检测T Watch的变化情况判定T 运行是否正常 在T 中断服务程序中检测MWatch的变化情况判定主程序是否正常运行 在主程序中通过检测T Watch的变化情况判别T 是否正常工作 若检测到某观测变量变化不正常 比如应当加 而未加 则转到出错处理程序作排除故障处理 当然 对主程序最大循环周期 定时器T 和T 定时周期应予以全盘合理考虑 限于篇幅不赘述
系统故障处理 自恢复程序的设计
单片机系统因干扰复位或掉电后复位均属非正常复位 应进行故障诊断并能自动恢复非正常复位前的状态
非正常复位的识别
程序的执行总是从 H开始 导致程序从 H开始执行有四种可能 一 系统开机上电复位 二 软件故障复位 三 看门狗超时未喂狗硬件复位 四 任务正在执行中掉电后来电复位 四种情况中除第一种情况外均属非正常复位 需加以识别
硬件复位与软件复位的识别
此处硬件复位指开机复位与看门狗复位 硬件复位对寄存器有影响 如复位后PC= H SP= H PSW= H等 而软件复位则对SP SPW无影响 故对于微机测控系统 当程序正常运行时 将SP设置地址大于 H 或者将PSW的第 位用户标志位在系统正常运行时设为 那么系统复位时只需检测PSW 标志位或SP值便可判此是否硬件复位 图 是采用PSW 作上电标志位判别硬 软件复位的程序流程图
图 硬 软件复位识别流程图
此外 由于硬件复位时片内RAM状态是随机的 而软件复位片内RAM则可保持复位前状态 因此可选取片内某一个或两个单元作为上电标志 设 H用来做上电标志 上电标志字为 H 若系统复位后 H单元内容不等于 H 则认为是硬件复位 否则认为是软件复位 转向出错处理 若用两个单元作上电标志 则这种判别方法的可靠性更高
开机复位与看门狗故障复位的识别
开机复位与看门狗故障复位因同属硬件复位 所以要想予以正确识别 一般要借助非易失性RAM或者EEROM 当系统正常运行时 设置一可掉电保护的观测单元 当系统正常运行时 在定时喂狗的中断服务程序中使该观测单元保持正常值(设为 AAH) 而在主程中将该单元清零 因观测单元掉电可保护 则开机时通过检测该单元是否为正常值可判断是否看门狗复位
正常开机复位与非正常开机复位的识别
识别测控系统中因意外情况如系统掉电等情况引起的开机复位与正常开机复位 对于过程控制系统尤为重要 如某以时间为控制标准的测控系统 完成一次测控任务需 小时 在已执行测控 分钟的情况下 系统电压异常引起复位 此时若系统复位后又从头开始进行测控则会造成不必要的时间消耗 因此可通过一监测单元对当前系统的运行状态 系统时间予以监控 将控制过程分解为若干步或若干时间段 每执行完一步或每运行一个时间段则对监测单元置为关机允许值 不同的任务或任务的不同阶段有不同的值 若系统正在进行测控任务或正在执某时间段 则将监测单元置为非正常关机值 那么系统复位后可据此单元判系统原来的运行状态 并跳到出错处理程序中恢复系统原运行状态
非正常复位后系统自恢复运行的程序设计
对顺序要求严格的一些过程控制系统 系统非正常复位否 一般都要求从失控的那一个模块或任务恢复运行 所以测控系统要作好重要数据单元 参数的备份 如系统运行状态 系统的进程值 当前输入 输出的值 当前时钟值 观测单元值等 这些数据既要定时备份 同时若有修改也应立即予以备份
当在已判别出系统非正常复位的情况下 先要恢复一些必要的系统数据 如显示模块的初始化 片外扩展芯片的初始化等 其次再对测控系统的系统状态 运行参数等予以恢复 包括显示界面等的恢复 之后再把复位前的任务 参数 运行时间等恢复 再进入系统运行状态
应当说明的是 真实地恢复系统的运行状态需 要极为细致地对系统的重要数据予以备份 并加以数据可靠性检查 以保证恢复的数据的可靠性
其次 对多任务 多进程测控系统 数据的恢复需考虑恢复的次序问题 笔者实际应用的数据恢复过程流程图如图 所示
图 系统自恢复程序流程图
图中恢复系统基本数据是指取出备份的数据覆盖当前的系统数据 系统基本初始化是指对芯片 显示 输入输出方式等进行初始化 要注意输入输出的初始化不应造成误动作 而复位前任务的初始化是指任务的执行状态 运行时间等
结束语
lishixin/Article/program/qrs/201311/11074
❸ 求单片机直流电机调速系统的设计的方案和意义
一.电机调速模块. 我们的设计思路是先产生占空比可调的方波(方法有多种,一是用555构成多谐振荡器.二可以利用单片机产生PWM方波)+4功率器件构成的H桥电路,用以驱动直流电机转动.当然还许多驱动方案,比如三极管-电阻作栅极驱动\低压驱动电路的简易栅极驱动,还有可以直接用个MCU产生PWM外加一个MOS管驱动也可以. 1.1直流电机驱动电路的设计目标 在直流电机驱动电路的设计中,主要考虑一下几点: 1. 功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动电机即可,当电机需要双向转动时,可以使用由4个功率元件组成的H桥电路或者使用一个双刀双掷的继电器。如果不需要调速,只要使用继电器即可;但如果需要调速,可以使用三极管,场效应管等开关元件实现PWM(脉冲宽度调制)调速。 2. 性能:对于PWM调速的电机驱动电路,主要有以下性能指标。 1)输出电流和电压范围,它决定着电路能驱动多大功率的电机。 2)效率,高的效率不仅意味着节省电源,也会减少驱动电路的发热。要提高电路的效率,可以从保证功率器件的开关工作状态和防止共态导通(H桥或推挽电路可能出现的一个问题,即两个功率器件同时导通使电源短路)入手。 3)对控制输入端的影响。功率电路对其输入端应有良好的信号隔离,防止有高电压大电流进入主控电路,这可以用高的输入阻抗或者光电耦合器实现隔离。 4)对电源的影响。共态导通可以引起电源电压的瞬间下降造成高频电源污染;大的电流可能导致地线电位浮动。 5)可靠性。电机驱动电路应该尽可能做到,无论加上何种控制信号,何种无源负载,电路都是安全的。 考虑到以上的因素我们采用555多谐振荡器产生占空比可调的方波+4功率器件构成的H桥来驱动直流电机.电路图如下: 1.2、电机调速模块的电路图功能分析 555通过可调电阻可以实现占空比可调的方波,即组成占空比可调的多谐振荡器。 多谐振荡器实现占空比可调的方波的功能分析: 电源接通瞬间,电容C2上的初始电压为0,施密特触发器输出电压为U为高电平,与此同时由于集电极开路输出端(7脚)对地断开,电源通过R5、R7开始对电容C充电,电路进入暂稳态I状态。此后电路按下列四个阶段周而复始地循环,产生周期性的输出脉冲。 (1) 暂稳态I阶段,VCC通过R5。R7向电容C充电,电容C的电压Uc按指数上升,在UC高于2/3VCC之前,定时器暂时维持‘1’的状态,输出为高电位。 (2) 翻转I阶段,电容C继续充电,当Uc高于2/3VCC后,定时器翻转为‘0’的状态,输出为低电位。此时,集电极开路输出端(7脚)由对地断开变为导通。 (3) 暂稳态II阶段,电容C开始经历R7、R6对地(7脚)放电,Uc按照指数下降,在Uc低于1/3VCC之前,定时器依然维持‘0’的状态。输出为低电位。 (4) 翻转II阶段,电容C继续放电,当Uc低于1/3VCC后,定时器翻转为‘1’状态,输出为高电位。此时,集电极开路输出端(7脚)由对地导通变为对地断开。此后,振荡器又回复到暂稳态I状态。 (5) 可以通过调节R6的大小来调节定时器输出方波的占空比。 Uln2003芯片是16脚七路电机驱动芯片,这块芯片在这里可以看作是七非门芯片,作用是保证10脚和14脚的输出SINGLE1和SINGLE2的输出为一高一低。芯片中的二极管起到分流的作用。电路图的右部分的作用是通过调节电机的正转与反转来调节电机的转速,当SINGLE1为高 SINGLE2为低时,三极管Q2,Q3,Q5导通,Q1,Q4,Q6截止,电机1端通过Q5接地,Vcc通过Q2直接押在电机2端,此时电机2端电位高于1端,电机反转;当SINGLE1为低SINGLE2为高时,电机正转。当某一时刻占空比大于50%时,电机呈现正转加速或是反转减速状态;某一时刻占空比小于50%时,电机呈现正转减速或是反转加速状态。电机就是通过矩形波占空比的不同来调节转速的,电机呈现出来的转速是平均速度。 二.电机测速模块电路以及功能分析 我们的设计思路是利用光电隔离器件以及BCD计数器实现直流电机测速模块电路.利用电机转动时带动纸片遮挡光耦,使其发光二极管发出的红外光被其中的光敏三极管所接收,通过BCD计数器最后将在单位时间内转动的转数给显示出来.电路图如下: 1.3、电机测速模块整个电路以及其他功能分析 1.3.1芯片功能分析 CD40192: 可预置BCD加/减计数器(双时钟) NSC\TI///J1J2J3J4是可以预设数字的输入,Q1Q2Q3Q4是加减计数的输出。C0是进位端接高位的UP(加计数器)。BO是借位端图上不接,为空脚。ENABLE是使能端。VSS接地,VCC接电源。DOWN是减计数器。 CD4511 BCD锁存、7段译码,驱动器: //A、B、C、D分别接BCD加减计数器的输出端,锁存数字。再7段译码将其输出到数码管。 CD40106 六施密特触发器: NSC\TI //输入信号为A,输出信号为A反,对输入的脉冲进行整形并取反,使高位计数器的加计数能够计数。 1.4、接受板子整个电路图功能分析 光电耦合器OPTOISO1,当其接受到光信号,LED放光,三极管饱和导通,晶体管Q1导通,因为电阻R3 为47K,大部分的电压分压在电阻上了,A为低电平。若没有接受到光的话,A为一高点平,这样在A端形成了一个负脉冲,再经过CD40106 六施密特触发器对脉冲进行整形并且取反,得到A的非为一正脉冲(指的是没有光的时候为低电平,有光信号的时候为高电平)。 经过六施密特触发器的脉冲信号再接到CD40192的UP端使BCD计数器件1为加计数器。又两个CD40192ENABLE是使能端一起接在enable信号上。 REST信号也相连一起通过按键S1接VCC高电平/通过R9 10K接地。这样只要按S1就可以实现REST重置清零。不按S1的就照常计数。 Enable使能信号的产生:是通过按键S1和555芯片以及相应的RC电路,实现一定时间的延时,也就是意味着一按S1,在定时T(由RC值确定)的时间内,计数器在计数,将光电耦合器接受到的恒定脉冲个人给计数,定时时间到的话就停止.这样的话可以将电机的速度给测出来.定时时间为0.5S~1.0S. 驱动CD40192工作,我们对照图2来分析这个定时器的功能。 当一上电的时候, 3 (OUT)脚输出一个高电平,
❹ [电子百科] 单片机系统中对电源干扰的抑制方法有哪些麻烦告诉我
除此之外,由于交流电源共用,各电子设备之间通过电源也会产生相互干扰,因此抑制电源干扰尤其重要。电源干扰主要有以下几类:1)电源线中的高频干扰供电电力线相当于一个接收天线档岁,能把雷电、电弧、广播电台等辐射的高频干扰信号通过电源变压器初级耦蠢耐合行档睁到次级,形成对单片机系统的干扰。2)感性负载产生的瞬变噪声切断大容量感性负载时,能产生很大的电流和电压变化率,从而形成瞬变噪声干扰,成为电磁干扰的主要形式。3)晶闸管通断时的干扰晶闸管通断时的电流变化率很大,使晶闸管在导通瞬间流过一个具有高次谐波的大电流,在电源阻抗上产生很大的压降,从而使电网电压出现缺口,这种畸变的电压波形含有高次谐波,可以向空间辐射或通过传导耦合,干扰其他设备。此外,还有电网电压波动或电压瞬时跌落产生千扰等。
❺ 单片机开发中应掌握的几个技巧
一、 如何提高C语言编程代码的效率
邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。他强调:“如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。
先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。”
他指出,各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长
5-20%。他说:“对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统
所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但由于不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作
上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。”
二、 如何减少程序中的bug?
对于如何减少程序的bug,邓宏杰给出了一些建议,他指出系统运行中应考虑的超范围管理参数有:
1.物理参数。这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。合理设定这些边界,将超出边界的参数都视为非正常激励或非正常回应进行出错处理。
2.资源参数。这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。在程式设计中,对资源参数不允许超范围使用。
3.应用参数。这些应用参数常表现为一些单片机、功能单元的应用条件。如E2PROM的擦写次数与资料存储时间等应用参数界限。
4.过程参数。指系统运行中的有序变化的参数。
三、如何解决单片机的抗干扰性问题
邓宏杰指出:防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。单片机干扰最常见的现象就是
复位;至于程序跑飞,其实也可以用软件陷阱和看门狗将程序拉回到复位状态;所以单片机软件抗干扰最重要的是处理好复位状态。一般单片机都会有一些标志寄存
器,可以用来判断复位原因;另外你也可以自己在RAM中埋一些标志。在每次程序复位时,通过判断这些标志,可以判断出不同的复位原因;还可以根据不同的标
志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。
四、 如何测试单片机系统的可靠性
有读者希望了解用用什么方法来测试单片机系统的可靠性,邓宏杰指出:“当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:
1.测试单片机软件功能的完善性。这是针对所有单片机系统功能的测试,测试软件是否写的正确完整。
2.上电、掉电测试。在使用中用户必然会遇到上电和掉电的情况,可以进行多次开关电源,测试单片机系统的可靠性。
3.老化测试。测试长时间工作情况下,单片机系统的可靠性。必要的话可以放置在高温,高压以及强电磁干扰的环境下测试。
4、ESD和EFT等测试。可以使用各种干扰模拟器来测试单片机系统的可靠性。例如使用静电模拟器测试单片机系统的抗静电ESD能力;使用突波杂讯模拟器进行快速脉冲抗干扰EFT测试等等。
邓宏杰强调:“还可以模拟人为使用中,可能发生的破坏情况。例如用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电钻靠近单片机系统工作,由此测试抗电磁干扰能力等。
❻ 如果单片机系统检测到端口的信号不太稳定,可能存在的问题在哪里怎么解决
1.信号加相应的滤波电容,吸收干扰
2.端口接上拉电阻,一般用4.7K
3.信号采集可用光耦等隔离
4.在单片机软件中对检测的端口进行数字滤波处理,比如连续采集10个数,用尘衫冒泡法对10数进行从小到大排序,取中间一位值,或去掉最大最小值再取平均指兄丛值。
5.找出干扰源,比如附唯樱近有高频线路、电磁干扰,离远一些。
❼ 请简述单片机系统的设计过程是怎样的
单片机应用系统设计分为硬件设计与软件设计两部分及系统调试三个部分,大致过程如下:一、硬件电路设计1、根据任务需求规划确定单片机类型及外围接口电路方案;2、根据方案设计具体电路。二、软件设计1、根据目标任务的功能需求,结合硬件电路控制方式,规划设计软件功能模块;2、将功能模块细化成流程图;3、根据流程图编写程序代码;4、将编译后的目标代码下载到实物单片机或虚拟单片机进行软件仿真调试;三、系统调试1、将初调成功的目标的代码下载到单片机目标试验板进行软硬件联调及功能验证;2、验证成功符合设计要求,就可以进入小批量测试了。
❽ 毕业设计做单片机应该怎么做
1、单片机的硬件系统是由单片机、A/D转换器和显示驱动电路等组成。一般在硬件电路设计完成时,应选择标准化、模块化的典型电路和符合单片机应用系统的常规电路在系统中.相关器件以及相关电路一定要做到性能匹配.当外接电路较多时.还应考虑驱动能力。在硬件设计中.必不可少的是可靠性和干扰性.这与自身的硬件系统有关.因此应认真对待。
2、针对于硬件的电路总体设计和各部分电路的组成.系统软件可分为数据采集、数据显示、数据传输和数据存储这4个基本功能。软件系统包括主程序、系统监控、定时/中断等子程序。
主程序为整个通用数据采集系统的主体部分.它由若干个模块组成:自检与初始化模块、MD转换程序模块、显示驱动模块、监控程序模块、按键程序模块、数据上传通讯模块、数据定时存储模块。
其中有些模块还包含有子模块,使用时下一级模块被高一级模块调用,各部分既相互独立.又相互联系主程序首先是系统初始化.当运行正常后.进入数据采集软件的主程序运行.使用默认配置参数来设定系统的采集通道数,完成数据采集、数据显示、数据传输及数据定时存储等基本功能。
通常,在各种工业设计环境中遇至不同形式的干扰.单片机数据采集系统是软硬件的结合.因此设计者应从软硬两方面消除.结合各种抵抗干扰的方法互相补充和完善.才能确保系统可靠、安全、正确地运行。
单片机系统被干扰后会集中表现在几个方面:控制状态失效、采集数据误差大、数据发生乱码以及程序的运行失控这些干扰有内、外因素的干扰.所以软硬件都应当采取有效的措施进行解决。
硬件系统的干扰就是防和抗的概念.即消除和抑制干扰源:降低系统对干扰信号的敏感性;切断干扰对系统的耦合。而相应的措施有隔离、屏蔽、接地、提高信噪比、滤波以及电压保护等软件抗于扰主要是通过软件的合理编制降低单片机系统对干扰的灵敏度。解决的技术有指令冗余技术、软件陷阱技术、“看门狗”技术、数字滤波技术等方法。
❾ 关于单片机AT89S51温度控制系统的温度的滞后怎么处理
嘿嘿 俺来帮你想想办法
1 可以靠硬件方法解决:
可以采用史密斯补偿器,以消除温度滞后,给系统带来的稳定性的影响。
2 可以靠软件方法解决:
在程序中 增加史密斯补偿算法 以消除温度滞后,给系统带来的稳定性的影响。
也可以采用大林算法
呵呵 也没有加分呀 就给个满意回答吧
❿ 单片机温度控制系统设计方案
#include<reg52.H>
externGetTemp(); //声明引用外部函数
; //声明引用外部变量
voiddelay(unsignedinti);
//elseIO
sbitLS138A=P2^2;//管脚定义
sbitLS138B=P2^3;
sbitLS138C=P2^4;
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsignedlongLedOut[5],LedNumVal;
voidsystem_Ini()
{
TMOD|=0x11;
TH1=0xD8;//10
TL1=0xF0;
IE=0x8A;
TR1=1;
}
main()
{unsignedchari;
system_Ini();
while(1)
{
GetTemp();
/********以下将读18b20的数据送到LED数码管显示*************/
LedNumVal=Temperature;//把实际温度送到LedNumVal变量中
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10];//个位
for(i=0;i<4;i++)
{
P0=LedOut[i];
switch(i)
{ //138译码
case0:LS138A=0;LS138B=0;LS138C=0;break;
case1:LS138A=1;LS138B=0;LS138C=0;break;
case2:LS138A=0;LS138B=1;LS138C=0;break;
case3:LS138A=1;LS138B=1;LS138C=0;break;
}
delay(100);
}
P0=0;
}
}
//延时程序
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
/*************************此部分为18B20的驱动程序*************************************/
#include<reg52.H>
#include<intrins.h>
sbitD18B20=P3^7;
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
voidTempDelay(unsignedcharidataus);
voidInit18b20(void);
voidWriteByte(unsignedcharidatawr);//单字节写入
voidread_bytes(unsignedcharidataj);
unsignedcharCRC(unsignedcharj);
voidGemTemp(void);
voidConfig18b20(void);
voidReadID(void);
voidTemperatuerResult(void);
bitflag;
unsignedintidataTemperature;
unsignedcharidatatemp_buff[9];//存储读取的字节,readscratchpad为9字节,readromID为8字节
unsignedcharidataid_buff[8];
unsignedcharidata*p,TIM;
unsignedcharidatacrc_data;
unsignedcharcodeCrcTable[256]={
0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,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};
//
/************************************************************
*Function:延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
voidTempDelay(unsignedcharidataus)
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
voidInit18b20(void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80);//delay530uS//80
_nop_();
D18B20=1;
TempDelay(14);//delay100uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag=1;//detect1820success!
else
flag=0;//detect1820fail!
TempDelay(20);//20
_nop_();
_nop_();
D18B20=1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
voidWriteByte(unsignedcharidatawr)//单字节写入
{
unsignedcharidatai;
for(i=0;i<8;i++)
{
D18B20=0;
_nop_();
D18B20=wr&0x01;
TempDelay(3);//delay45uS//5
_nop_();
_nop_();
D18B20=1;
wr>>=1;
}
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
unsignedcharReadByte(void)//读取单字节
{
unsignedcharidatai,u=0;
for(i=0;i<8;i++)
{
D18B20=0;
u>>=1;
D18B20=1;
if(D18B20==1)
u|=0x80;
TempDelay(2);
_nop_();
}
return(u);
}
/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
voidread_bytes(unsignedcharidataj)
{
unsignedcharidatai;
for(i=0;i<j;i++)
{
*p=ReadByte();
p++;
}
}
/************************************************************
*Function:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
unsignedcharCRC(unsignedcharj)
{
unsignedcharidatai,crc_data=0;
for(i=0;i<j;i++)//查表校验
crc_data=CrcTable[crc_data^temp_buff[i]];
return(crc_data);
}
/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
voidGemTemp(void)
{
read_bytes(9);
if(CRC(9)==0)//校验正确
{
Temperature=temp_buff[1]*0x100+temp_buff[0];
// Temperature*=0.625;
Temperature/=16;
TempDelay(1);
}
}
/************************************************************
*Function:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
voidConfig18b20(void)//重新配置报警限定值和分辨率
{
Init18b20();
WriteByte(0xcc);//skiprom
WriteByte(0x4e);//writescratchpad
WriteByte(0x19);//上限
WriteByte(0x1a);//下限
WriteByte(0x7f);//set11bit(0.125)
Init18b20();
WriteByte(0xcc);//skiprom
WriteByte(0x48);//保存设定值
Init18b20();
WriteByte(0xcc);//skiprom
WriteByte(0xb8);//回调设定值
}
/************************************************************
*Function:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
voidReadID(void)//读取器件id
{
Init18b20();
WriteByte(0x33);//readrom
read_bytes(8);
}
/************************************************************
*Function:18B20ID全处理
*parameter:
*Return:
*Modify:
*************************************************************/
voidTemperatuerResult(void)
{
p=id_buff;
ReadID();
Config18b20();
Init18b20();
WriteByte(0xcc);//skiprom
WriteByte(0x44);//Temperatureconvert
Init18b20();
WriteByte(0xcc);//skiprom
WriteByte(0xbe);//readTemperature
p=temp_buff;
GemTemp();
}
voidGetTemp()
{
if(TIM==100)//每隔1000ms读取温度
{TIM=0;
TemperatuerResult();
}
}
/*************************************
[t1(10ms)中断]中断
*************************************/
voidT1zd(void)interrupt3
{
TH1=0xD8;//10
TL1=0xF0;
TIM++;
}
/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/
#include<reg52.h>
#include<intrins.h>
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
voidHC595SendData(unsignedintSendVal);
//SPIIO
sbitMOSIO=P1^5;
sbitR_CLK=P1^6;
sbitS_CLK=P1^7;
sbitIN_PL=P3^4;//74HC165shiftload把数据加载到锁存器中
sbitIN_Dat=P3^5;//74HC165output数据移出
sbitOE=P3^6;
/*********************************************************************************************************
**函数名称:HC595SendData
**功能描述:向SPI总线发送数据
*********************************************************************************************************/
voidHC595SendData(unsignedintSendVal)
{
unsignedchari;
for(i=0;i<16;i++)
{
if((SendVal<<i)&0x8000)MOSIO=1;//setdatalinehigh
elseMOSIO=0;
S_CLK=0;
NOP();
NOP();
S_CLK=1;
}
R_CLK=0;//setdatalinelow
NOP();
NOP();
R_CLK=1;//片选
OE=0;
}