当前位置:文档之家› 一个比较典型的PID处理程序分析pid算法在51单片机上实现

一个比较典型的PID处理程序分析pid算法在51单片机上实现

一个比较典型的PID处理程序分析pid算法在51单片机上实现
一个比较典型的PID处理程序分析pid算法在51单片机上实现

============================================

*/(PID算法)

*/

/* /* 这是一个比较典型的PID处理程序,在使用单片机作为控制cpu

时,请稍作简化,具体的PID */

/* 参数必须由具体对象通过实验确定。由于单片机的处理速度和

ram资源的限制,一般不采用浮点数运算, */

/* 而将所有参数全部用整数,运算到最后再除以一个2的N次方

数据(相当于移位),作类似定点数运算,可 */

/* 大大提高运算速度,根据控制精度的不同要求,当精度要求很

高时,注意保留移位引起的“余数”,做好余 */

/* 数补偿。这个程序只是一般常用pid算法的基本架构,没有包

含输入输出处理部分。 */

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

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

#include

#include

#include

#include

============================================

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.

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

#define DAC0832 XBYTE[0XE000]

#define AD0809 XBYTE[0xf000]

sbit END0809=P3^2;

typedef struct PID {

float SetPoint; // 设定目标 Desired Value

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

单片机分析程序

四、分析程序并填空() 1.执行下列程序段后,(P1)=___9BH____。 MOV P1,#5DH CPL P1.1 CPL P1.2 CLR P1.6 SETB P1.7 2.执行下列程序段后,(A)=__8BH_____,(C Y)=__不影响__。 MOV A,#C5H RL A 3.下列程序段执行后,(R0)=___7FH____,(7EH)=__00H__,(7FH)=_41H______。 MOV R0,#7EH MOV 7EH,#0FFH MOV 7FH,#40H INC @R0 INC R0 INC @R0 4.已知(SP)=60H,子程序SUBTRN的首地址为0345H,现执行位于0123H的ACALL SUBTRN双字节指令后,(PC)=__0345H_,(61H)=___25H____,(62H)= __01H__。 5.阅读下列程序,说明其功能。 MOV R0,#data MOV A,@R0 RL A MOV R1,A RL A RL A ADD A,R1 MOV @R0,A RET ; (data)×10操作 6.改错 1.MUL RoRl 乘法指令应使用A、B寄存器操作 2.MOV A,@R7 间接寄存器使用R7有误,间址寄存器只能使用R0、R1 3.MOV A,#3000H 8位累加器A不能接受16位数据 4.MOVC @A+DPTR,A MOVC指令为对程序存储区操作指令,累加器的内容不可通过变址方式送入程序存储器,两操作数写反了。 5.UMP #1000H 长转移指令中的操作数为16位转移地址,不能用立即数的形式来表达。 7. 说明MCS—51单片机的下列各条指令中源操作数的寻址方式(可直接在每条指令后面书写) 1.ANL A,20H 直接寻址 2.ADDC A,#20H 立即寻址

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个振荡周

51单片机C语言程序设计经典案例

项目三 C51程序设计语言基础 任务1 C51程序的识读 1.C51程序结构 例3-1 P_test /********************* ,标准的MCS-51单片机头文件为””,STC89系列单片机头文件为””

4.C51的常量和变量 1)常量 常量就是在程序运行过程中,其值不能改变的数据,包括整型常量、字符常量、字符串常量、实数常量、位标量等。 (1)整型常量:可以用二进制、八进制、十进制、十六进制表示。 无符号整数常量在一个数字后面加上“u”或“U”表示。长整数型常量在后面加上“l”或“L”,无符号长整数型常量在数字后面加上“ul”或“UL”,实数型常量在后面加“f”或“F”。 (2)字符常量:单引号内的字符,不可以显示的控制字符在前加“\”组成专用转义字符。(3)字符串常量:双引号内的字符,当双引号内没有字符时是空字符串。在C语言中,字

符串常量是作为字符类型数组来处理的,在存储字符串时,系统在字符串尾部加上转义字符“\o”,作为该字符串的结束符。 (4)实数常量:有十进制和指数两种表示形式。指数表示的实数为“[±]数字[.数字]e[±]数字”,[ ]中的内容为可选项 (5)位标量:位标量的值是一个二进制数。 2)变量 变量就是在程序运行过程中,其值可以被改变的数据。必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义变量的格式: [ < 存储模式 > ] < 类型定义 > [ 存储器类型 ] < 标识符 >; 类型定义和标识符是必要的。存储模式有四种,自动(auto)、外部(extern)、静态(static)和寄存器(register),默认类型为自动(auto)。 表3-3 C51存储类型与MCS-51单片机存储空间的对应关系及其大小 如果在变量定义时省略了存储类型标识符,则编译器会自动选择默认的存储类型。默认的存

单片机如何运行程序

单片机如何运行程序 知道了单片机通过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单片机简答题部分(经典) 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个振荡周

51单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

小只推荐:51单片机知识大汇总看你了解有多少

小只推荐:51单片机知识大汇总看你了解有多少 基于51单片机的函数信号发生器利用单片机AT89C52 采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A 转换器DAC0832 将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz 的波形。下面就对51单片机进行详细论述。 ? ?1.取指译码执行模型:首先我们来看看单片机是如何工作的,我们拿电脑的主板来作为对比,我们买电脑时,总是追求处理器的主频。处理器的工作原理是从存储器上取出一条指令,然后对指令译码,译码完后执行。然后取下一条指令,译码,执行。它为什幺能这幺有序的工作?是因为它有一个工作时钟,在这个工作时钟的统一管理下,处理器有序的工作,这里的主频就是工作时钟的速度,当然,现在你可能也知道主频越高,取指译码速度越快,性能越好。那幺你可能会问,这跟51单片机有什幺关系,OK,切入正题,单片机的工作也是这个原理,从存储器上取指,译码,执行。但是单片机的存储器在哪?在单片机的内部,对于电脑来说,是把处理器,内存集中在一块主板上。而现在你应该很明确,对于单片机它就相当于一块电脑主板,把处理器,存储器集中到一块芯片内部。从这个宏观的角度看,所有的单片机是不是都是一个原理,服从于取指,译码,执行的基本模型。OK,继续…… 2. 51单片机的外设:我们在学习单片机时,所做的第一个实验都是一样的,点灯。也许你已经学会了用单片机做出好看的花样灯,或者用单片机驱动数码管显示出数字或字母。或者可以检测按键了。不错,我们仔细想想这些是什幺,无非,你就是控制那一排排引脚输出高低电平,我们称这些引脚叫I/O口,输入输出,按键是输入,点灯是输出。其实你以为你学了三样东

51单片机经典教程

单片机经典教程 目录
第一课 第二课 第三课 第四课 第五课 第六课 第七课 第八课 第九课 第十课 第十一课 第十二课 第十三课 第十四课 第十五课 第十六课 第十七课 第十八课 第十九课 第二十课 第二十一课 第二十二课 第二十三课 第二十四课 单片机的概述 单片机的硬件结构与开发过程 单片机的内部结构 一 半导体存储器 单片机的内部结构 二 工作寄存器 单片机的内部结构 三 时序与时钟 单片机的内部结构 四 并行口 单片机的内部结构 五 数据与地址 单片机的内部结构 六 特殊功能存储器 单片机的工作方式 单片机的寻址 单片机的指令 一 数据传递类指令 单片机的指令 二 数据传递类指令 单片机的指令 三 算术逻辑运算类指令 单片机的指令 四 控制转移类指令 单片机的指令 五 位及位操作指令 单片机的程序设计方法 单片机的定时 计数器 单片机的中断系统 单片机的定时/中断实验 一 单片机的定时/中断实验 二 键盘接口及编程方法 一 独立式按键 键盘接口及编程方法 二 矩阵式按键 单片机显示器接口及编程方法 数码管的静态扫描与编程方法 6 9 11 15 18 20 24 27 29 32 35 38 42 47 51 55 64 68 73 78 81 87 90 94
4

第一课 单片机的概述
因为我们的主要课程是单片机的应用 本来不想讲解单片机的历史与发展 这话说现状更确切 些 但为了兼顾大多数朋友 我还是简单的介绍一下这方面的相关知识 一 单片机的由来 单片机 专业名称—Micro Controller Unit(微控制器件) 它是由大名鼎鼎的 INTEL 公司发明的 最早的系列是 MCS-48 后来有了 MCS-51 我们经常说的 51 系列单片机就是 MCS-51 micro controller system 它是一种 8 位的单片机 8 位是什么意思 我们以后再讲 后来 INTEL 公司把它的核心技术转让给了世界上很多的小公司 不过 再小也有几个亿的销售/ 年哦 所以世界上就有许多公司生产 51 系列兼容单片机 比如飞利浦的 87LPC 系列 华邦的 W78 系列 达拉斯的 DS87 系列 现代的 GSM97 系列等等 目前在我国比较流行的就是美国 ATMEL 公司的 89C51 它是一种带 Flash ROM 的单片机 至于什么是 Flash ROM 我在这儿先不作介绍 等以后大家学到相 关的知识时自然就会明白 我们的讲座就是以该型号的单片机来作实验的 讲到这里 也许有的人会 问 我平时在各种书上看到全是讲解 8031 8051 等型号的单片机 它们又有什么不同呢 其实它们同 属于一个系列 只是 89C51 的单片机更新型一点(事实上,89C51 目前正在用 89S51 代替 我们的实验系 统采用就是 89S52 的 兼容 89C52) 这里随便说一下 目前国内的单片机教材都是以 8051 为蓝本的 尽管其内核也是 51 系列的 但毕竟 8051 的单片机已经属于淘汰产品 在市场上也很少见到了 所以由 此感叹 国内的高等教育是如此的跟不上时代的发展需要 这话可能会引起很多人的不满,所以大家别 说是我讲的哦 二 主要单片机的分类 接着上面的话题 再给大家介绍一下我们经常在各种刊物上看到的 AVR 系列和 PIC 系列单片机是 怎么回事 以便让大家对单片机的发展有一个较全面的认识 在没有学习单片机之前 这是一个令很多 初学者非常困惑的问题 这么多的单片机我该先学哪一种呢 AVR 系列单片机也是 ATMEL 公司生产的一种 8 位单片机 它采用的是一种叫 RISC 精简指令集单 片机 的结构 所以它的技术和 51 系列有所不同 开发设备也和 51 系列是不通用的 它的一条指令的 运行速度可以达到纳秒级 即每秒 1000000000 次 是 8 位单片机中的高端产品 由于它的出色性能 目前应用范围越来越广 大有取代 51 系列的趋势 所以学完了 51 系列的 看来必须学会 AVR 的才行 可叹知识爆炸 人生苦短 说完了 AVR 的 再来说说另一种--PIC 系列单片机 它是美国 MICROCHIP 公 司 唉 又是老美 叫微芯公司的生产的另一种 8 位单片机 它采用的也是 RISC 的指令集 它的指令 系统和开发工具与 51 系列更是不同 但由于它的低价格和出色性能 目前国内使用的人越来越多 国 内也有很多的公司在推广它 不过它的影响力远没有 51 系列的大 所以作为初学者 51 系列当然是首 选 以上几种只是比较多见的系列 其实世界上还有许多的公司生产各种各样的单片机 比如 MOTOROLA 的 MC68H 系列 老牌的单片机 TI 的 MSP430C 系列 极低功耗的单片机 德国的西门子 SIEMENS 等等 它们都有各自的结构体系 并不与 51 系列兼容 为了不搞大家的脑筋 这里就不介绍了 等大 家入了门以后自己去研究它吧 我们还是回来了解一下 51 系列单片机到底是个什么东西 它有那些部 分组成 请接着往下看 三 单片机的结构及组成 单片机到底是一种什么 DD 它究竟能做什么呢 其实它就是一种能进行数学和逻辑运算 根据不 同使用对象完成不同控制任务的面向控制而设计的集成电路 此话好象有点绕口 没关系 大家都应该 知道我们经常使用的电脑吧 在电脑上 我们可以用不同的软件在相同的硬件上实现不同的工作 比如 我们用 WORD 可以打字 用 PROTEL 可以设计图纸等等 单片机其实也是如此 同样的芯片可以根据我们 不同的要求做出截然不同的产品 只不过电脑是面向应用的 而单片机是面向控制的 比如控制一个指
6

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单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/3316053240.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/3316053240.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/3316053240.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序 END ;结束程序

51单片机基本程序

1第一位隔一秒闪烁一次 #include #define uint unsigned int sbit led1=P1^0; uint i; uint j; void main() { while(1) { led1=0; for(i=1000;i>0;i--) for(j=110;j>0;j--); led1=1; for(i=1000;i>0;i--) for(j=110;j>0;j--); } } 2复杂广告灯 #include #define uint unsigned int #define uchar unsigned char uchar discode[]={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//正向流水灯 0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//反向流水灯 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,//隔灯闪烁3次 0xF0,0x0F,0xF0,0x0F,0xFF,//高四盏。低四盏闪烁2次 0x33,0xCC,0x33,0xCC,0x33,0xCC,0xFF//隔两盏闪烁3次 }; void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<120;i++); } } void main(void) { uchar i; P0=0xFF;

while(1) { for(i=0;i<35;i++) { P0=discode[i]; delayms(250); } } } 3拉幕式与闭幕式广告灯 #include #define uint unsigned int #define uchar unsigned char uchar discode1[4]={0x18,0x24,0x42,0x81}; uchar discode2[4]={0x7E,0x3C,0x18,0x00}; void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<120;i++); } } void main(void) { uchar i,j; P0=0xFF; while(1) { for(i=0;i<4;i++) { j=discode1[i]; P0=~j; delayms(500); } j=0xFF; P0=~j; delayms(500); for(i=0;i<4;i++) { j=discode2[i]; P0=~j;

PWM电机调速原理及51单片机PWM程序经典

Pwm电机调速原理 对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常的方法有两种: (1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻 辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。 (2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。 这就要用到ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考相关书籍。 51单片机PWM程序 产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256, PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 *程序思路说明: * * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数* *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms * ******************************************************************************/ #include #define uchar unsigned char /*****************************************************************************

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

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