当前位置:文档之家› 51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法
51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(一)PID算法

(原创文章,转载请注明出处https://www.doczj.com/doc/9515813212.html,/tengjingshu) 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制

图1

控制器公式

在实际应用中,可以根据受控对象的特性和控制的性能要求,灵活地采用不同的控制组合,构成

比例(P)控制器

比例+积分(PI)控制器

比例+积分+微分(PID)控制器

式中

式中

控制系统中的应用

在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。自动控制系统的调节单元将来自变送器的测量值与给定值相比较后产生的偏差进行比例、积分、微分(PID)运算,并输出统一标准信号,去控制执行机构的动作,以实现对温度、压力、流量、也为及其他工艺参数的自动控制。

比例作用P只与偏差成正比;积分作用I是偏差对时间的积累;微分作用D 是偏差的变化率;

比例(P)控制

比例控制能迅速反应误差,从而减少稳态误差。除了系统控制输入为0和系统过程值等于期望值这两种情况,比例控制都能给出稳态误差。当期望值有一个变化时,系统过程值将产生一个稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大,会引起系统的不稳定。

图2比例(P)控制阶跃响应

积分(I)控制

在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

为了减小稳态误差,在控制器中加入积分项,积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即使误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减少,直到等于零。

积分(I)和比例(P)通常一起使用,称为比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。如果单独用积分(I)的话,由于积分输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。

图3积分(I)控制和比例积分(PI)控制阶跃相应

微分(D)控制

在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

由于自动控制系统有较大的惯性组件(环节)或有滞后(delay)组件,在调节过程中可能出现过冲甚至振荡。解决办法是引入微分(D)控制,即在误差很大的时候,抑制误差的作用也很大;在误差接近零时,抑制误差的作用也应该是

零。

图4微分(D)控制和比例微分(PD)控制阶跃相应

图5

注意,这里的

图6 典型的PID控制器对于阶跃跳变参考输入的响应

参数的调整

应用PID控制,必须适当地调整比例放大系数K P,积分时间T I和微分时间T D,使整个控制系统得到良好的性能。

最好的寻找PID参数的办法是从系统的数学模型出发,从想要的反应来计算参数。很多时候一个详细的数学描述是不存在的,这时候就需要实际地调节P ID的参数.

Ziegler-Nichols方法

Ziegler-Nichols方法是基于系统稳定性分析的PID整定方法.在设计过程中无需考虑任何特性要求,整定方法非常简单,但控制效果却比较理想。

具体整定方法步骤如下:

1. 先置I和D的增益为0,逐渐增加K P直到在输出得到一个持续的稳定的振荡。

2. 记录下振荡时的P部分的临界增益Kc,和振荡周期Pc,代到下表中计算出K ,Ti,Td。

P

Ziegler-Nichols整定表

表2

Tyreus-Luyben 整定表:

表3

Tyreus-Luyben的整定值减少了振荡的作用和增强了稳定性。

自动测试方法:

为了确定过程的临界周期Pc和临界增益Kc,控制器会临时使它的PID

算法失效,取而代之的是一个ON/OFF的继电器来让过程变为振荡的。这

两个参数很好的将过程行为进行了量化以决定PID控制器应该如何整定来

得到理想的闭环回路性能。

图6

参考资料

1)Mixed-Signal Control Circuits Use Microcontroller for Flexibility in Impl ementing PID Algorithms,By Eamon Neary

(图1,表1)

2)Atmel 8-bit AVR Microcontrollers Application Note:AVR221: Discrete PI D controller

(图2,图3,图4,图5,表2)

3)使用Ziegler-Nichols方法的自整定控制

https://www.doczj.com/doc/9515813212.html,/2007-03/200733042815.htm

(图6)

4)Ziegler-Nichols Method

https://www.doczj.com/doc/9515813212.html,/~tbco/cm416/zn.html

(表3)

5)Ziegler-Nichols方法PID参数整定--随风的blog

https://www.doczj.com/doc/9515813212.html,/u/4/archives/2007/97.htm

6) PID控制原理教程,胡晓若编制

51单片机PID算法程序(二)位置式PID控制算法

(转载请注明出处https://www.doczj.com/doc/9515813212.html,/tengjingshu) 由51单片机组成的数字控制系统控制中,PID控制器是通过PID控制算法实现的。51单片机通过AD对信号进行采集,变成数字信号,再在单片机中通过算法实现PID运算,再通过DA把控制量反馈回控制源。从而实现对系统的伺服控制。

位置式PID控制算法

位置式PID控制算法的简化示意图

上图的传递函数为:

(2-1)

在时域的传递函数表达式

(2-2)

对上式中的微分和积分进行近似

(2-3)

式中n是离散点的个数。

于是传递函数可以简化为:

(2-4)

其中

u(n)——第k个采样时刻的控制;

K P ——比例放大系数;

K i ——积分放大系数;

K d ——微分放大系数;

T ——采样周期。

如果采样周期足够小,则(2-4)的近似计算可以获得足够精确的结果,离散控制过程与连续过程十分接近。

(2-4)表示的控制算法直接按(2-1)所给出的PID控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为全量式或位置式PID控制算法。

缺点:

1)由于全量输出,所以每次输出均与过去状态有关,计算时要对e(k)(k=0, 1,…n)进行累加,工作量大。

2)因为计算机输出的u(n)对应的是执行机构的实际位置,如果计算机出现故障,输出u(n)将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实际生产中是不允许的。

位置式PID控制算法C51程序

具体的PID参数必须由具体对象通过实验确定。由于单片机的处理速度和r am资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算

到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的―余数‖,做好余数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。

=========================================================== ==========================================*/

#include

#include //C语言中memset函数头文件

/*========================================================== ==========================================

PID Function

The PID (比例、积分、微分) function is used in mainly

control applications. PIDCalc performs one iteration of the PID algorithm.

While the PID function works, main is just a dummy program showing

a typical usage.

=========================================================== ==========================================*/

typedef struct PID {

double SetPoint; // 设定目标Desired value

double Proportion; // 比例常数Proportional Const

double Integral; // 积分常数Integral Const

double Derivative; // 微分常数Derivative Const

double LastError; // Error[-1]

double PrevError; // Error[-2]

double SumError; // Sums of Errors

} PID;

/*========================================================== ==========================================

PID计算部分

=========================================================== ==========================================*/

double PIDCalc( PID *pp, double NextPoint )

{

double dError, Error;

Error = pp->SetPoint - NextPoint; // 偏差

pp->SumError += Error; // 积分

dError = Error - pp->LastError; // 当前微分

pp->PrevError = pp->LastError;

pp->LastError = Error;

return (pp->Proportion * Error // 比例项

+ pp->Integral * pp->SumError // 积分项

+ pp->Derivative * dError // 微分项

);

}

/*========================================================== ==========================================

Initialize PID Structure PID参数初始化

=========================================================== ==========================================*/

void PIDInit (PID *pp)

{

memset ( pp,0,sizeof(PID));

}

/*========================================================== ==========================================

Main Program 主程序

=========================================================== ==========================================*

double sensor (void)// Dummy Sensor Function

{

return 100.0;

}

void actuator(double rDelta) // Dummy Actuator Function

{}

void main(void)

{

PID sPID;// PID Control Structure

double rOut; // PID Response (Output)

double rIn; // PID Feedback (Input)

PIDInit ( &sPID ); // Initialize Structure

sPID.Proportion = 0.5; // Set PID Coefficients

sPID.Integral = 0.5;

sPID.Derivative = 0.0;

sPID.SetPoint = 100.0; // Set PID Setpoint

for (;;) {// Mock Up of PID Processing

rIn = sensor (); // Read Input

rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation

actuator ( rOut ); // Effect Needed Changes

}

参考资料:

1)Atmel 8-bit AVR Microcontrollers Application Note:AVR221: Discrete PI D controller

2)茶壶- pid C程序,好东西- 腾讯博客–Qzone

https://www.doczj.com/doc/9515813212.html,/blog/38162254-1225976777

3)PID 调节控制做电机速度控制,SUNPLUS凌阳科技

51单片机PID算法程序(三)增量式PID控制算法

(转载请注明出处https://www.doczj.com/doc/9515813212.html,/tengjingshu) 当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的―增量算法‖。

增量式PID控制算法可以通过(2-4)式推导出。由(2-4)可以得到控制器的第k-1个采样时刻的输出值为:

(2-5) 将(2-4)与(2-5)相减并整理,就可以得到增量式PID控制算法公式为:

(2-

6)

其中

由(2-6)可以看出,如果计算机控制系统采用恒定的采样周期T,一旦确定A、B、C,只要使用前后三次测量的偏差值,就可以由(2-6)求出控制量。

增量式PID控制算法与位置式PID算法(2-4)相比,计算量小得多,因此在实际中得到广泛的应用。

位置式PID控制算法也可以通过增量式控制算法推出递推计算公式:

(2-7)

(2-7)就是目前在计算机控制中广泛应用的数字递推PID控制算法。

增量式PID控制算法C51程序

/*========================================================== ==========================================

PID Function

The PID (比例、积分、微分) function is used in mainly

control applications. PIDCalc performs one iteration of the PID

algorithm.

While the PID function works, main is just a dummy program showing

a typical usage.

=========================================================== ==========================================*/

typedef struct PID

{

int SetPoint;//设定目标Desired Value

long SumError; //误差累计

double Proportion; //比例常数Proportional Const

double Integral; //积分常数Integral Const

double Derivative; //微分常数Derivative Const

int LastError; //Error[-1]

int PrevError; //Error[-2]

} PID;

static PID sPID;

static PID *sptr = &sPID;

/*========================================================== ==========================================

Initialize PID Structure PID参数初始化

=========================================================== ==========================================*/

void IncPIDInit(void)

{

sptr->SumError = 0;

sptr->LastError = 0; //Error[-1]

sptr->PrevError = 0; //Error[-2]

sptr->Proportion = 0; //比例常数Proportional Const

sptr->Integral = 0;//积分常数Integral Const

sptr->Derivative = 0; //微分常数Derivative Const

sptr->SetPoint = 0;

}

/*========================================================== ==========================================

增量式PID计算部分

=========================================================== ==========================================*/

int IncPIDCalc(int NextPoint)

{

register int iError, iIncpid; //当前误差

iError = sptr->SetPoint - NextPoint;//增量计算

iIncpid = sptr->Proportion * iError //E[k]项

- sptr->Integral * sptr->LastError //E[k-1]项

+ sptr->Derivative * sptr->PrevError; //E[k-2]项

//存储误差,用于下次计算

sptr->PrevError = sptr->LastError;

sptr->LastError = iError;

//返回增量值

return(iIncpid);

}

参考资料:

1)PID 调节控制做电机速度控制,SUNPLUS凌阳科技

2)增量式PID控制模块程序设计

https://www.doczj.com/doc/9515813212.html,/data/html/2008-11-24/73560.html

51单片机实验程序

3 3 3 用查表方式编写y=x1 +x2 +x3 。(x 为0~9 的整数) #include void main() { int code a[10]={0,1,8,27,64,125,216,343,512,729}; //将0~9 对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255 或-128~+127 之间的话就用char ,而现在的值明显超过这个范围,用int 较合适。int 的范围是0~65535 或-32768~32767 。 int y,x1,x2,x3; //此处定义根据习惯,也可写成char x1,x2,x3 但是变量y 一定要用int 来定义。 x1=2; x2=4; x3=9; //x1,x2,x3 三个的值是自定的,只要是0~9 当中的数值皆可,也可重复。 y=a[x1]+a[x2]+a[x3]; while(1); //单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。 } //结果的查询在Keilvision 软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch 的框架内双击“double-click or F2 to add”文字输入y 后按回车,右侧会显示其16 进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10 进制数。 1、有10 个8 位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的 数据(1 的个数为偶数)都要存到内RAM50H 开始的数据区中。试编写有关程序。 #include void main() { int a[10]={0,1,5,20,24,54,64,88,101,105}; // 将所要处理的值存入RAM 中,这些可以根据个人随意设定,但建议不要超过0~255 的范围。 char i; // 定义一个变量 char *q=0x50; // 定义一个指针*q 指向内部0x50 这个地址。 for(i=9;i>=0;i--) //9~0 循环,共十次,也可以用for(i=0;i<10;i++) { ACC=a[i]; //将a[i] 的值赋给累加器ACC if (P==0) //PSW0 位上的奇偶校验位,如果累加器ACC 内数值1 的个数为偶数那么P 为0,若为奇数,P 为1。这里的P 是大写的。 { *q=a[i]; q++; // 每赋一个值,指针挪一个位置指向下一个。 } } while(1); //同实验一,程序不能停。 }

51单片机考试常见试题简答 题

简答题部分 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5) OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片 内程序存储器中,程序写入后不能再改写。这种芯片的价 格也较低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

单片机如何运行程序

单片机如何运行程序 知道了单片机通过I/O口与外设打交道,也知道了单片机的程序与数据如何保存,到底单片机是如何运行程序的?原来单片机和其他微机一样,也拥有一个中央处理器(CPU),它是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU 负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。它在单片机中的核心地位见图2.10所示。它通过单片机的内部总线,将单片机内部的各个部分:程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等联系在一起,内部总线有三种:数据总线,专门用来传送数据信息,地址总线专门用来传送地址信息,选中各操作单元,控制总线专门用来传送CPU各种控制命令,以便CPU统一指挥协调工作。完成程序所要执行的各种功能。CPU执行程序一般包括两个主要过程:第一,就是从程序存储器中取出指令,指令的地址由PC指针提供,在前面我们已经知道,PC指针在CPU取指后会自动加一,所以PC指针总是指向下一个将要取出的指令代码或操作数。这样,就能保证程序源源不断往下执行。第二,就是执指过程,取出的指令代码首先被送到CPU中控制器中的指令寄存器,再通过指令译码器译码变成各种电信号,从而实现指令的各种功能。 4.怎样保证CPU工作? 现在我们知道了单片机怎样取指、执指,即怎样运行程序了。那么怎样才能保证CPU有序的工作?这就必须提到单片机的两个非常重要的外围电路:单片机的时钟电路和复位电路。在单片机上面有两个引脚,分别是它的第18、19脚,其功能如下。

Pin19:时钟XTAL1脚,片内振荡电路的输入端。 Pin18:时钟XTAL2脚,片内振荡电路的输出端。 89S51的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体和振荡电容,振荡电容的值一般取10p~30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。如图2.11 当时钟电路起振后,产生一定频率的时钟信号,单片机的CPU在时钟信号的控制下,就能一步一步完成自己的工作。通常我们必须了解以下几种周期。 【振荡周期】:单片机外接石英晶体振荡器的周期。如外接石英晶体的频率若为12MHz,这其振荡周期就是1/12微秒。 【状态周期】:单片机完成一个最基本的动作所需的时间周期。如扫描一次定时器T0引脚状态所需要的时间。一个状态周期=2个振荡周期。 【机器周期】:单片机完成一次完整的具有一定功能的动作所需的时间周期。如一次完整的读操作或写操作对应的时间。一个机器周期=6个状态周期。 【指令周期】:执行完某条指令所需要的时间周期,一般需要1~4个机器周期,如MUL AB指令是四机器周期指令。一个指令周期=1~4个机器周期。 单片机工作时,除了需要时钟支持外,还必须有一个初始状态,即单片机的复位状态。在单片机外部引脚第9脚,就是专门给单片机提供复位脉冲的。 Pin9:RESET/Vpd复位信号复用脚,当89S51通电,时钟电路开始工作,在RESET 引脚上出现24个时钟周期以上的高电平,系统即初始复位。

51单片机多任务运行

51单片机多任务运行 最近发现有的幺弟在对系统的内核感兴趣,加上我也是部分内核的初学者,突然来兴,便用了两天写了一个简单的内核。这个内核简单得不能再简单了,加上空格行、大括号和详细的注解只有246行,还带了4个点亮LED的任务。至今为止我所见最简单的内核~~~ 就跟这个内核取个“多任务分时处理内核”吧!这个内核和ucos系统思想有很大的差异,但是能够帮助我们学习理解ucos系统,能够帮我们了解51的内部结构,以及大多数的单片机运行处理数据的原理~~~ 好废话就不说啦!希望我们能互相学习共同进步 1、先来讲讲原理: 首先,我们看书时会知道51单片机在执行中断的时候,会有以下几个步骤和几种情况。 根据KEIL的编译惯例(这个编译惯例你可以在编完程序后点仿真,里面有个后缀为.src 的文件,这个文件里面是一句C对应一句汇编,你就可以知道你编译的C代码它是怎么处理的,能帮助你学习汇编哦~~~),通常把进入中断后的所使用的通用寄存器组根据情况选择压栈。也就是说,中断前后使用的寄存器组可能不一样,中断前可能使用0,中断中可能使用1。如果使用的同一组寄存器,为了保存现场,KEIL就PUSH现场数据,然后POP 就行啦。但是keil很多时候不是你想象中那样,你叫它怎样他就怎样编译。所以在程序中嵌入了少量的汇编。 其实,嵌入汇编是很简单的事情。 只要在C代码中加入#pragma asm 和#pragma endasm并在他俩的中间加入汇编就行。别忘了还要在工程文件中添加C51S.LIB,这个文件在KEIL/C51/LIB中,这个文件也很重要,不然编译会出现警告,记得把文件类型选择为全部文件,不然看不见它。 接下来说说KEIL的中断汇编。在C51中,中断到来时,CPU响应中断保存当前PC 指针地址压栈SP所指地址。然后将PC指针指向中断向量地址,在中断向量地址中只有一句汇编程序:LJMP XX 意思是跳转到某地址。因为中断后只有8个寄存器,但是你的代码量远远不只有8个寄存器能装下的。这也就是说,响应中断后,先跳转到硬件规定的地址,再由那个地址跳转到中断程序入口。 然后,PC指针跳转到中断程序地址,开始从SP所指地址压栈ACC,B,DPH,DPL,PSW,按理说还需要压栈R0~R7,但KEIL一般是通过换通用寄存器来实现的(也就是改变RS1和RS0来实现的)。也就说KEIL根本不压栈R0~R7。 这个怎么能行,当然不行!不保存我们就不能完全的返回先前压栈的任务啦!好吧,那我们就只有手动保存压栈,这样不就行了,简单吧! 所以我们来帮它。已经通过前面知道它在进入中断的时候已经把中断前的PC指针压栈到中断前SP所指的地址了,所以进入中断后,实际在SP中断前所指地址中已经按顺序压栈了PC低8位,PC高8位,ACC,B,DPH,DPL,PSW总共7个数据,SP是向上增长的,也就是说每压一次堆栈SP+1。然后再把我们的R0~R7寄存器压入堆栈,这不就行啦,就保护现场所需的全部数据,就算有时R0~R7寄存器用不上我们也得加进去,为了为了保证正确的返回现场。 因此我们保存一次数据就需要7+8=15字节的堆栈,每个任务的起始地址保存一次,中间临时要保存一次,共需要15+15=30字节的堆栈。所以定义程序空间为现场保存空间为 0~29。名字叫:unsigned char TASK_STACK[TASK_MAX][30];//程序现场保存数组。TASK_MAX是程序个数,因为每一个程序都需要保存两次,每次15个变量来保存现场,并且51是8位的单片机所以用unsigned char。 然后就是程序现场保存数组的初始化使每个数据都是0。 首先,根据响应中断后的压栈顺序,知道了数组0位和1位保存的是中断前程序的地

51单片机的看门狗

“看门狗”概念及其应用 在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。 加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。 通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现,不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。 看门狗定时器寄存器(WDT_CONTR) STC单片机看门狗定时器寄存器在特殊功能寄存器中的字节地址为E1H,不能位寻址,该寄存器用来管理STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。单片机复位时该寄存器不一定全部被清0,在STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择,大家根据需要可做出适合自己设计系统的选择。其各位的定义如表4.2.1所示。 表1看门狗定时器寄存器(WDT_CONTR)

51单片机中断系统程序实例

51单片机中断系统程序实例(STC89C52RC) 51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。 单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点: 1. 要知道寄存器的英文全拼,比如IE = interrupt中断 不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。 2. 每个知识点要有形像的出处 比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位 看到ET0, 马上要形像地定位到IE寄存器的第2位 https://www.doczj.com/doc/9515813212.html,/tuenhai/独家揭秘:形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。 写程序代码时,也要把尽量把每行代码形像化。 51单片机内中断源 8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):

8052有6个中断源,它比8051多一个定时器/计数器T2中断源。 8051五个中断源分别是: (1)51单片机外部中断源 8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。 INT0也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。 TCON的结构如下图: (a)定时器T0的运行控制位TR0

51单片机精确延时程序大集合

51单片机精确延时程序大集合 以下程序说是精确延时,实际上都不对。调用一次差个几微秒、几百微秒,一天下来差好几分钟。加我的QQ群有精确版本哦,不同频率的晶振都适用。群:38397759 2008-04-24 12:10:26, 在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H;2个机器周期 PUSH 05H;2个机器周期 PUSH 06H;2个机器周期 MOV R4,#50;1个机器周期 DELAY5S_0:MOV R5,#200;1个机器周期 DELAY5S_1:MOV R6,#245;1个机器周期 DJNZ R6,$;2×245=490个机器周期 DJNZ R5,DELAY5S_1;这条2个机器周期,这层循环包含R5×(490+1) +2×R5=98600个机器周期 DJNZ R4,DELAY5S_0;这条2个机器周期,这层循环包含R4×(98600+1) +2×R4=4930150个机器周期 POP 06H;2个机器周期 POP 05H;2个机器周期 POP 04H;2个机器周期 RET;2个机器周期 ;(共2+2+2+1+4930150+2+2+2+2=4930165个机器周期) ;513微秒延时程序 DELAY: MOV R2,#0FEH;1个机器周期 JUZINAIYOU: DJNZ R2,JUZINAIYOU;2×R21即2×245 RET;2个机器周期 ;(实际上是493个机器周期)

;10毫秒延时程序 DL10MS: MOV R3,#14H DL10MS1:LCALL DELAY DJNZ R3,DL10MS1 RET ;(缺DELAY) ;0.1s延时程序12MHz DELAY: MOV R6,#250 DL1: MOV R7,#200 DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET ;延时1046549微秒(12MHz) ;具体的计算公式是: ;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)*r5+5 DEL : MOV R5,#08H DEL1: MOV R6,#0FFH DEL2: MOV R7,#0FFH DJNZ R7,$ DJNZ R6,DEL2 DJNZ R5,DEL1 RET ;1秒延时子程序是以12MHz晶振 DELAY:MOV R1,#50 del0: mov r2,#91 del1: mov r3,#100 djnz r3,$ djnz r2,del1 djnz r1,del0 Ret ;1秒延时子程序是以12MHz晶振为例算指令周期耗时 KK: MOV R5,#10 ;1指令周期×1 K1: MOV R6,#0FFH ;1指令周期×10

单片机结构与开发设计流程图

模块一单片机结构及开发设计流程 课题一单片机结构 1、画出89C51单片机的引脚排列图。 2、画出89C51单片机的引脚功能图。 3、画出89C51单片机的基本组成框图。 4、叙述89C51单片机各部分的具体组成情况。 课题二单片机工作条件 1、画出51系列单片机部时钟和外部时钟电路接线图。 2、画出51系列单片机上电复位和按键复位电路接线图。 3、画出51系列单片机工作条件接线图。 课题三单片机输入/输出端口结构 1、画出51系列单片机P0、P1、P 2、P3口位结构图。 2、叙述51系列单片机P0~P3口使用注意事项。 课题四单片机开发设计流程 1、用Protel软件画出按键左移亮灯电路原理图。 2、用Protel软件设计出按键左移亮灯电路印制电路板图。 3、制作按键左移亮灯电路板。 4、连接仿真器。 5、运行仿真软件,输入按键左移亮灯程序,编译、调试及仿真运行程序。 6、连接编程器。 7、运行编程器软件,将调试通过的按键左移亮灯程序目标代码写入89C51单片机。 8、将经过编程的89C51单片机插入电路板上的单片机IC插座中,脱机运行,观察电路运 行情况。 模块二单片机指令系统及汇编语言程序设计 课题一程序设计基础 1、简述单片机存储器总体分配情况。 2、简述单片机片数据存储器结构。 3、简述单片机七种寻址方式。

4、简述单片机不同存储器空间的寻址方式。 5、回答下列指令的寻址方式: (1)MOV A, #6AH (2)MOV A, #0E#H (3)MOV A, 3FH (4)MOV A, 7BH (5)MOV A, R1 (6)MOV A, R3 (7)MOV A, R0 (8)MOV A, R1 (9)MOVX A, DPTR (10)MOVC A, A+DPTR (11)MOV A, A+PC (12)JZ 50H (13)SETB 01H 课题二延时程序 1、将本课题任务二中的R3的值改为01H、02H和08H,观察亮灯的间隔时间有何变化? 2、将本课题任务二中的RL A指令改为RR A指令,观察亮灯的顺序有何变化? 3、将本课题任务二中的亮灯数据初值改为03H、07H和55H,观察亮灯规律有何变化? 4、设计一延时5S的延时程序,并替代任务二中的延时程序,观察亮灯间隔时间。 5、设单片机振荡频率为6MHz,试精确计算下列延时子程序的延时时间。 DEL: MOV R7, #0FAH DEL1: MOV R6, #0F8H NOP DEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 6、设单片机振荡频率为12MHz,试估算下列延时子程序的延时时间。 MOV R5, #20 K1: MOV R6, #250 K2: DJNZ R6, K2 DJNZ R5, K1

51单片机汇编时间片程序

;******************************************************************* ********* ;本时间片系统的原理是利用51单片机的T0定时一个中断,切换用户的任务轮流执行, ;用户的任务写法和一般的一样,此处用2个流水灯和一个按键程序做实例 ;**************程序步骤**************** ;1定义一个全局变量用于存储任务号,另一个存储任务数 task_name equ7ch task_amount equ7bh ;2定义任务的堆栈区数组,由于任务的切换需要占用15个字节,所以每个任务的堆栈区大小要看程序的使用情况而定, ;如果按照任务有3级深度设计,则堆栈区的大小为15+6=21个字节 ;tsp*_a都只有一级深度,18个字节够用 tsp0_a equ30h;31,32,33,34,35,36,37,38,39,3a,3b,3c,3d,3e,3f,40,41, tsp1_a equ42h;43,44,45,46,47,48,49,4a,4b,4c,4d,4e,4f,50,51,52,53, tsp2_a equ54h;55,56,57,58,59,5a,5b,5c,5d,5e,5f,60,61,62,63,64,65, tsp3_a equ66h;67,68,69,6a,6b,6c,6d,6e,6f,70,71,72,73,74,75,76,77, ;3定义一个数组,用于保存每个任务的栈顶,数组的长度等于任务数 sp_a equ78h;79,7a, ;哈哈,内存区快用完了,还好位寻址区还有空间,当然如果是52就够用了 ;4定义一个数组,用于存储每个任务的标志位,因为有的任务有运行的先后之分,也就是有条件运行,在这里是这样 ;处理的,只有任务的标志位为零时,在任务调度时才能运行,例如要设计一个按键程序,只有先运行按键检测程序 ;后,相应的显示的程序才能运行。我们可以这样处理,在按键程序中给显示程序的一个标志位置1,按键程序结束后将 ;显示程序的标志位置0,这个数组最好设置在位寻址区(20h),长度等于任务数 tnt_a equ20h;21,22,23, org0000h ljmp clear;清理内存 org000bh ljmp IntTime0;时间片中断 org0030h ;***********主程序********** main: mov task_amount,#3;3个任务

单片机C51程序结构

1 C51程序流程与控制 C语言是一种结构化的编程语言。其基本元素是模块,它是程序的一部分,只有一个入口和一个出口,不允许有中途插入或从模块的其它路径退出。 C语言有3种基本结构: ●顺序结构; ●选择结构; ●循环结构; 1.1顺序结构程序 顺序结构的程序是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,如图所示,程序先执行A操作,再执行B 操作,两者是顺序执行的关系。 1.2选择结构程序 此结构中必包含一个判断框,根据给定的条件P是 否成立而选择执行A框或B框。选择结构由条件语句构 成。 条件语句 条件语句又被称为分支语句,其关键字是由if语句或switch/case构成。

C语言提供了3种形式的if语句结构: 用法1: if (条件表达式) 语句 描述:当条件表达式的结果为真时,就执行语句,否则就跳过。例:if(a>=3) b=0; 用法2: if (条件表达式) 语句1 else 语句2 描述:当条件表达式成立时,就执行语句1,否则就执行语句2。例:if (a==b) a++; else a--; 当a等于b时,a加1,否则a-1。 用法3: if (条件表达式1) 语句1; else if (条件表达式2) 语句2;

else if (条件表达式3) 语句3; else if (条件表达式n) 语句n; else 语句m; 描述:如果表达式1为“真”,则执行语句1,退出if语句;否则去判断表达式2,如果为“真”,则执行语句2,退出if语句;否则去判断表达式3·最后,如果表达式n也不成立,则执行else后面的语句m。else和语句m也可省略不用。例: if (a>=3) b=10; else if (a>=2) b=20; else if (a>=1) b=30; else b=0; switch/ case语句结构 我们学习了条件语句,用多个条件语句可以实现多方向条件分支,但是可以发现使用过多的条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。这时使用开关语句同样可以达到处理多分支选择的目的,又可以使程序结构清晰。它的语法为下:

51单片机温度控制程序

51单片机温度控制程序 51单片机温度控制程序(续)功能说明: 本装置的功能是对温度进行实时监测与控制。由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。如实时温度超过设定的上、下限值,一方面由LC 51单片机温度控制程序(续) 功能说明: 本装置的功能是对温度进行实时监测与控制。由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。 程序:LCD2402.ASM 01 ; ――――――――――――――――――――――――――――――― 02 ; 温度值存放单元 03 TEMP_ZH EQU 24H ;实时温度值存放单元 04 TEMPL EQU 25H ;低温度值存放单元 05 TEMPH EQU 26H ;高温度值存放单元 06 TEMP_TH EQU 27H ;高温报警值存放单元 07 TEMP_TL EQU 28H ;低温报警值存放单元 08 TEMPHC EQU 29H ;存十位数BCD码 09 TEMPLC EQU 2AH ;存个位数BCD码 10 ;――――――――――――― 11 按键输入引脚定义 12 K1 EQU P2.1 13 K2 EQU P2.2

14 K3 EQU P2.3 15 K4 EQU P2.4 16 ;――――――――――――― 17 SPK EQU P3.4 ;蜂鸣器引脚 18 RELAY EQU P2.0 ;继电器引脚 19 X EQU 2FH ;LCD 地址变量 20 ;――――――――――――― 21 ;LCD控制引脚 22 RS EQU P3.5 23 RW EQU P3.6 24 E EQU P3.7 25 ;――――――――――――― 26 FLAG EQU 20H.0 ;DS18B20是否存在标记 27 KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记 28 DQ EQU P2.5 29 30 ;=============主程序============== 31 32 MAIN: 33 ACALL SET_LCD ;LCD初始化设置子程序 34 ACALL WR_THL ;将报警上下线写入暂存寄存器子程序 35 TOOP: ACALL RESET_1820 ;调用18B20复位子程序

51单片机加减程序可运行

#include //STC51单片机头文件 #define uchar unsigned char #define uint unsigned int uint key; uchar code numbercode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //用于设置(共阴极)数码管的段选信号,从0~9共10个数值 void delay(uint x) //延时 { uchar t; while(x--) for(t=0;t<250;t++); } void display(uchar key) //数码管显示 { P2=0x06; //在第7个数码管上显示个位 P0=numbercode[key]|0x80; delay(10); } void display1(uchar key) //数码管显示 { P2=0x00; //在第1个数码管上显示a P0=numbercode[key]; delay(10); } void display2(uchar key) //数码管显示 { P2=0x05; //在第6个数码管上显示十位 P0=numbercode[key]; delay(10); } void display3(uchar key) //数码管显示 { P2=0x02; //在第3个数码管上显示b P0=numbercode[key]; delay(10); } void display4(uchar key) //数码管显示 { P2=0x07; //在第8个数码管上显示小数 P0=numbercode[key]; delay(10); } void main()

51系列单片机最小系统原理图和程序

51系列单片机最小系统设计与调试实验 一、实验目的 1. 了解单片机的基本工作原理 2. 学习并掌握相关软件的使用方法(Protel、keil) 2. 掌握单片机片内程序存储器下载方法 3. 掌握单片机程序设计(汇编及C51) 二、原理 1. 什么是单片机最小系统 单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统. 对51系列单片机来说,单片机+晶振电路+复位电路,便组成了一个最小系统.但是一般我们在设计中总是喜欢把按键输入、显示输出等加到上述电路中,成为小系统。 2. AT89C51高性能8位单片机功能 AT89C51提供以下标准功能:8K字节Falsh闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时AT89C51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,时/计数器,串行通信口及中断系统持续工作。掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。

3. AT89C51高性能8位单片机资料 请参考相关书籍 三、实训任务. (1)认识MCS-51的ROM及片外RAM空间:认识51系列单片机的程序存储器(ROM)的空间范围;汇编指令编码在ROM中存储形式;掌握指令编码和指令编码所在地址的概念;了解51系列单片机的程序存储器(ROM)固定地址的用途。认识51系列单片机的片外数据存储器(片外RAM)的地址空间范围;了解51系列单片机的片外数据存储器的用途;重点掌握片内片外访问存储器的指令。 (2)认识MCS-51片内RAM空间:认识51系列单片机片内随机存储器(片内RAM)的空间范围;认识51系列单片机片内随机存储器的区域划分;掌握字节地址和位地址的概念;了解R0~R7寄存器与字节地址的关系。重点掌握MCS-51系列单片机四个口的用法的位操作。 (3)MCS-51汇编语言设计(编码转换):用MCS-51汇编指令进行程序设计。将四位BCD码化为十六位二进制数。(或将四位十六进制数转化为BCD码)。要求:在PC机上调试,程序可正确运行并上交源程序清单及程序说明。 (4)键盘输入电路设计/动态显示电路设计:在实训过程中要求设计按键输入电路、设计显示电路,并画出电路图并编写按键输入子程序。重点掌握硬件电路的设计及通过编程对电路的控制。 (5)单片机最小系统设计:单片机最小系统的设计是单片机应用系统设计及开发的基础,通过单片机最小系统设计,使学生对所学的单片机原理及应用课程有更深的理解。要求:提供电路图和程序清单。重点掌握硬件电路的设计及过程控制。 (6)基于单片机的应用系统设计:设计出实现某控制目的的应用系统是本实训课的最终实训的结果。实训要求中包括单片机最小系统的设计,按键输入电路设计,显示电路的设计,及应用系统的软件编程。

Proteus运行Keil编写的51单片机C语言步骤

Proteus运行Keil编写的51单片机C语 言步骤 1.在Keil 编写好程序以后,在左侧项目栏中单击鼠标右键, 如下图

2.点击上图中Options for Target’Target1’ 选项,弹出下列窗口

3.在Target标签中将Xtal(MHz)中的晶振频率改 为12.0;再在Output标签中勾选Create HEX Fi复选框。 完成上面两项设置后点击确定。 4.再点击编译,生成Hex 文件。

5再在Proteus中双击的51芯片,弹出下列窗口,按下图修改晶振频率,添加需要运行的C语言生成的hex文件即可运行。

#include; #define uchar unsigned char #define uint unsigned int #define DB P1 sbit RS=P2^0; sbit rw=P2^1; sbit en=P2^2; uchar code ttt[]="Tel:123456789"; uchar code ggg[]="address:Xi'an dianziyuan";

/************************************************ ****** 1602液晶显示必须的几个函数: 1.初始化函数,清屏,设置从头显示,字符状态,光标状态等 2.写命令函数,显示的位置,方式 3.写数据函数,要显示的内容 4.延迟函数 5主函数 ************************************************* ***/ void LCDinit(void); void delay(uchar x); void writecom(uchar com); void writedat(uchar dat); void LCDinit(void) { writecom(0x38); writecom(0x0c); writecom(0x06); writecom(0x01); delay(100);

51单片机密码锁程序

;初始正确密码为000000 ;密码错误,错误灯亮; ;密码连续错误3次锁定灯亮,机器锁定 ;按下接触锁定方可继续运行; ;密码正确,正确灯亮,输入新密码,输入完成灯灭; ;密码被更改,开始新的循环; ;断电后整机复位,初始密码恢复000000; KEYBUF EQU 30H ;键值暂存单元,查表时用 ;************************************* ;* * ;* 主程序和中断程序入口* ;* * ;************************************* ORG 0000H ;程序执行开始地址 AJMP MAIN1 ;跳至MAIN执行 ;************************************* ;* * ;* 主程序* ;* * ;************************************* ORG 0040H MAIN1: MOV R1,#30H ; 设置R1初始值30h CLR 21H.0 ; 清零设置的错误标志位

MOV R4,#00H ; 连续错误次数初始值0次 MOV P2,#00H ; MAIN: MOV P1,#0FFH ; CLR P2.0 ; LCALL KEYSCAN ;主体程序。调用查键子程序 CJNE R1,#36H,JI ; 按键不到(36-30)=6次,跳转。 MOV R1,#30H ; 按键次数回归初始值 JNB 21H.0,JI1 ; 判断是否有错,无错跳转 INC R4 ; 连续错误次数加1 CLR 21H.0 ; 清除错误标志 SETB P2.1 ; LCALL DELAY1S ; CLR P2.1 ; CJNE R4,#3,JI ; 判断是否连续错3次,不到3次跳转。 MOV R4,#00H ; SETB P2.3 ; JB P1.3,$ ; CLR P2.3 ; AJMP JI ; JI1: SETB P2.2 ; LCALL DELAY1S ; MOV R4,#00H ; SHURU: lcall keyscan ; CJNE R1,#36H,SHURU ;输入6位后继续往下 MOV R1,#30H CLR P2.2 JI: LJMP MAIN ;转MAIN循环 NOP ;软件陷阱 NOP NOP LJMP MAIN ;************************************* ;* * ;* 键盘工作子程序(4 * 4 阵列) * ;* 出口为各键工作程序入口P1口* ;************************************* KEYSCAN: MOV P1,#0FFH;清P1口,初始化键低电平有效 CLR P1.4;清P1.4口

相关主题
文本预览
相关文档 最新文档