单片机P口控制程序

合集下载

单片机实验 P3.3口输入,P1口输出

单片机实验   P3.3口输入,P1口输出

实验一P3.3口输入,P1口输出一、实验目的1、掌握P3口、P1口简单使用2、学习Keil,Proteus软件使用二、实验说明本次实验用外中断1的中断方式控制P1口8位LED亮灭状态,即第一次按下S键时,8位LED点亮,再次按下S时,8位LED熄灭,如此循环。

三、实验线路图四、实验步骤1、先建立文件夹“ex1”,然后建立“ex1”工程项目,最后建立源程序文件“ex1.c”,输入如下源程序;/*******************************************实验1:P3.3输入,P1口输出******************************************///用外中断1的中断方式进行数据采集#include<reg51.h>sbit S=P3^3;/*******************************************函数功能:主函数******************************************/void main(void){EA=1;EX1=1;IT1=1;P1=0xff;while(1); //无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T1的中断服务程序**************************************************************/void int1(void) interrupt 2 using 0{P1=~P1;}2、用Proteus软件仿真经过Keil软件编译通过后,可利用Proteus软件仿真。

在Proteus ISIS编辑环境中绘制仿真电路图。

打开配套实验1仿真原理图文件“ex1.DSN”,将编译好的“ex1.hex”文件载入AT89C51。

51单片机pid算法程序

51单片机pid算法程序

51单片机pid算法程序51单片机是一种广泛应用于嵌入式系统开发的微控制器。

PID算法是一种常用的控制算法,用于实现系统的闭环控制。

本文将介绍如何在51单片机上实现PID算法。

PID算法是一种经典的控制算法,它能够根据系统的反馈信息,自动调整控制量,使系统的输出接近期望值。

PID算法由比例项(P 项)、积分项(I项)和微分项(D项)组成。

比例项用来根据当前误差大小调整控制量,积分项用来根据过去误差的累积值调整控制量,微分项用来根据误差的变化速度调整控制量。

在51单片机上实现PID算法,首先需要编写程序来读取系统的反馈信息和期望值。

例如,可以通过ADC模块读取传感器的信号,然后通过计算得到当前误差。

接下来,根据比例项、积分项和微分项的系数,计算PID控制量。

最后,将PID控制量输出到执行机构,例如电机或舵机,来控制系统的输出。

在编写PID算法程序时,需要注意一些细节。

首先,要根据实际系统的特点和要求来选择合适的PID参数。

比例项的系数决定了控制量对误差的敏感程度,积分项的系数决定了控制量对误差累积值的敏感程度,微分项的系数决定了控制量对误差变化速度的敏感程度。

其次,要注意处理PID算法中的积分项和微分项的累积误差。

积分项的累积误差可能会导致系统出现超调或震荡,需要适当地进行限制或清零。

微分项的累积误差可能会导致系统出现噪声放大或不稳定,需要进行滤波或限制。

最后,要注意程序的效率和实时性。

PID算法通常需要以一定的频率进行计算和更新,要保证程序能够及时响应系统的变化。

除了基本的PID算法,还可以根据具体的应用需求进行算法的优化和改进。

例如,可以引入自适应调整PID参数的方法,使系统能够根据实时的工作条件自动调整PID参数。

还可以引入前馈控制或模糊控制等方法,进一步提高系统的控制性能和鲁棒性。

51单片机是一种常用的嵌入式系统开发平台,可以很方便地实现PID算法。

通过合理选择PID参数和优化算法,可以实现对系统的精确控制。

实验一 KEIL软件的使用及P1口控制

实验一  KEIL软件的使用及P1口控制

实验一KEIL软件的使用及P1口控制一实验目的1、学习KEIL软件的使用方法及单片机实验平台2、学习P1口的控制方法3、学习延时子程序的编写和单片机延时计算方法二实验原理1、KEIL软件是德国Keil公司开发的基于Windows平台的单片机集成开发环境软件。

KEIL软件包括编译器、连接器、库管理器和仿真调试器,通过集成开发环境(μVision)将这些部分组合在一起。

2、P1口是一个八位的准双向I/O口,其中一位的内部结构如图所示,输出驱动电路有一只场效应管和一个上拉电阻组成。

每一根口线都可以分别定义成输入或输出线。

做输出线时,写入“1”,则Q’为“0”,T1截止,P1.X输出高电平,写入“0”,则Q’为“1”,T1导通,P1.X输出低电平。

做输入线时,必须先向该口线写“1”,使T1截止。

3、程序延时分析方法:延时=指令个数X机器周期机器周期=12÷nMHZ n为单片机时钟频率三实验要求与步骤实验(一):用P1口做输出口,接八位逻辑电平显示,程序功能使发光二极管从右到左轮流循环点亮。

1、使用单片机最小应用系统1模块。

关闭该模块电源,用扁平数据线连接单片机P1口与八位逻辑电平显示模块。

(并口线与右侧的8个插孔是串联等效的。

)2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。

3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加P1_A.ASM源程序,进行编译,直到编译无误。

4、进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。

5、(先接通仿真器电源再开启试验箱电源)打开模块电源和总电源,点击开始调试按钮,点击RUN按钮运行程序,观察发光二极管显示情况。

发光二极管单只从右到左轮流循环点亮。

注:软件具体操作见附录实验(二):用P1.0、P1.1作输入接两个置位开关,P1.2、P1.3作输出接两个发光二极管。

单片机实验 实验二 P 口输入 输出实验

单片机实验 实验二 P 口输入 输出实验

实验二 P1口输入、输出实验一、实验目的学习Pl口的使用方法。

学习延时子程序的编写和使用。

进一步熟悉星研Star16L仿真器系统的操作,和EL-Ⅱ型通用接口板实验电路结构,学习使用PROTEUS仿真软件实现单片机的虚拟仿真。

掌握虚拟仿真与实际系统仿真的有机衔接。

二、实验仪器和设备PC机、星研Star16L仿真器系统+仿真头PODPH51(DIP)、EL-Ⅱ型通用接口板实验电路,PROTEUS仿真软件。

三、实验内容1)P1口做输出口,经过74LS04反相器接八只发光二极管,编写程序,使发光二极管循环点亮。

2)(选作)P1口既做输入又做输出,在P1.0~P1.3口接四个平推开关,通过开关的不同位置向P1.0~P1.3输入不同的状态,然后利用输入指令读取所设开关状态,为验证输入结果的正确与否,将它们输出到P1.4~P1.7,经过74LS04反相器驱动发光二极管。

四、实验结果1)循环点亮八只发光二极管。

取P1.0口接出第一个二极管,以此类推,第八个接P1.7口。

Proteus 仿真图①循环左移,即从第一个二极管开始点亮到第八个二极管实验程序:ORG 0000HSTART:MOV R2,#8MOV A,#01H ;先让第一个发光二极管点亮LOOP: MOV P1,A ;从P1口输出到发光二极管LCALL DELAYRL A ;循环左移(从第一个发光二极管开始一直往下一个二极管)DJNZ R2,LOOP ;判断移动是否超过8位,未超过则继续循环LJMP START ;循环发光DELAY:MOV R5,#5 ;延时0.5秒子程序DEL1: MOV R6,#200DEL2: MOV R7,#126DEL3: DJNZ R7,DEL3DJNZ R6,DEL2DJNZ R5,DEL1RETEND仿真结果:发光二极管从D1开始发光,依次往下到D8,然后循环这一过程。

实验结果:发光二极管从第一个开始发光,依次往左到第八个,然后循环这一过程。

单片机p1口原理

单片机p1口原理

单片机p1口原理
P1口是单片机上的一个I/O口,用于与外部设备进行数据交换。

P1口是一个8位的双向口,既可以作为输入口接收外部数据,也可以作为输出口发送数据给外部设备。

P1口的输出功能是通过将数据写入P1口的相应位来实现的。

P1口的每一位都可以独立设置为高电平(1)或低电平(0)输出。

当某一位设置为高电平时,在P1口上相应的引脚上会产生高电平信号;当某一位设置为低电平时,则会产生低电平信号。

P1口的输入功能则是通过读取P1口的相应位上的电平来实现的。

当外部设备向P1口的某一位输入高电平时,读取该位的状态会得到高电平(1);当外部设备输入低电平时,读取该位的状态会得到低电平(0)。

需要注意的是,P1口的输入和输出是通过P1口的特定引脚来实现的,需要根据具体的单片机型号以及外部设备的连接方式来确定。

在编程中,我们可以通过设置P1口相应的寄存器来控制其输入输出的功能。

总而言之,P1口是单片机上的一个8位双向口,可以通过设置相应位的电平来进行数据输出,并可以通过读取相应位的电平来进行数据输入。

单片机P2端口

单片机P2端口

单片机 P2端口
P2端口有P2.0~P2.7共8个引脚,P2端口每个引脚的内部电路结构都相同。

P2端口的内部结构与P0端口很相似。

P2端口也可作I/O引脚,在外接存储器时,还可以作为地址总线引脚。

(1)当P2端口用作地址总线引脚时
如果要将P2端口用作地址总线引脚,单片机内部的CPU会发出一个控制信号到电子开关的控制端,让电子开关与内部地址总线接通,地址总线上的信号就可以在通过电子开关、非门和场效应管后从P2端口引脚输出。

(2)当P2端口用作I/O接口时
如果要将P2端口用作I/O接口,单片机内部的CPU会发出一个控制信号到电子开关的控制端,让电子开关与锁存器接通。

当将P2端口用作输出端口时,给锁存器的CL端送写脉冲信号,内部总线上的数据就被锁存进锁存器并从Q端输出,再通过电子开关、非门和场效应管从P2端口引脚输出。

当将P2端口用作输入端口时,如果锁存器以前锁存的为“0”,即Q=0,经非门反相后会使场效应管导通,P2端口被钳在“0”电平上,“1”将无法送入P2端口。

所以与P0、P1端口一样,在将数据输入P2端口前,先通过内部总线向锁存器写“1”,让Q=1,场效应管截止,P2端口输入的“1”就可以送到输入三态门的输入端,此时再给读引脚送一个读控制信号,“1”就可以通过三态门送到内部总线。

8051单片机p0端口工作原理

8051单片机p0端口工作原理

8051单片机p0端口工作原理一、前言8051单片机是一种广泛应用于嵌入式系统中的微控制器,其具有成本低、易于使用和可靠性高等优点。

P0端口是8051单片机的一个重要端口,它通常用于控制外部设备和与其他设备进行通信。

本文将详细介绍8051单片机P0端口的工作原理。

二、8051单片机概述8051单片机是由Intel公司在1980年推出的一款8位微控制器,它采用了Harvard结构,并且具有4K字节的ROM、128字节的RAM 和32个I/O端口等特点。

其主要特点如下:1. 8位CPU:具有12个寄存器,可以直接访问内部和外部数据。

2. 存储器:包括4K字节ROM和128字节RAM。

3. I/O端口:包括32个I/O端口,其中P0、P1、P2、P3四个端口是最常用的。

4. 定时器/计数器:具有两个16位定时器/计数器。

5. 中断系统:支持5种不同类型的中断源。

6. 串行通信接口:支持UART模式和SPI模式。

7. 其他功能:包括PWM输出、ADC输入等。

三、P0端口概述P0端口是8051单片机的一个8位双向I/O端口,它的引脚编号为P0.0~P0.7。

在默认情况下,P0端口的所有引脚都被配置为输入状态,并且具有上拉电阻。

当需要使用P0端口时,需要将其相应的引脚配置为输出状态,并且需要关闭上拉电阻。

四、P0端口工作原理1. P0端口寄存器P0端口是通过一个8位寄存器来控制的,该寄存器的地址为80H。

当写入数据到该寄存器时,数据会被输出到对应的引脚上。

当从该寄存器读取数据时,会返回当前引脚上的输入数据。

2. P0端口模式设置P0端口可以通过特定的位掩码来配置其模式。

其中,每个引脚都有两个对应的位用于控制其模式:- P0Mx:用于选择引脚是否为输入或输出。

- P0Px:用于选择是否启用内部上拉电阻。

其中,x表示对应引脚编号(例如:P0M1表示P0.1引脚的模式选择位)。

3. P0端口输入输出控制在将某个引脚配置为输出状态后,可以通过向相应位写入逻辑高或逻辑低来控制该引脚的输出电平。

51单片机温控器PID程序

51单片机温控器PID程序
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
if(t<=0||t>0x900) return Real_temp;
return(t);
}
void display(signed int dd)//数码管扫描函数
{
int tt=0;
tt= (unsigned int)(dd*0.625+0.5); //放大10倍输出并四舍五入
m=tt/100; //分离出十位
n=(tt%100)/10; //分离出个位
p=tt%10; //分离出小数位
P0=table[m];
out=0;
PWM=0;
I_term=0;
last_error=0;
Set_temp=41; //初始设定温度为41度
Set_temp<<=4;
Real_temp=Set_temp;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
key_value=P1;
key_value&=0x07; //提取按键键值
if(key_value!=7) //按键按下
{
if(!key_hold) //按键第一次按下
{
key_hold=1; //标志按键处于保持按下状态
switch (key_value)
{
TH0=0xFF;
TL0=0x80;
if(PWM)
{ PWM=0;

使用51单片机控制继电器示例代码

使用51单片机控制继电器示例代码

使用51单片机控制继电器示例代码
51单片机(如Intel的8051或其相容的微控制器)常被用于各种嵌入式系统。

使用继电器进行控制时,可以通过51单片机的数字输出引脚来控制继电器的开关状态。

下面是一个简单的示例代码,用于演示如何使用51单片机控制继电器:
#include <reg52.h> // 包含51单片机的头文件
sbit relay = P1^0; // 定义P1.0口为继电器控制口
void main() {
while(1) {
relay = 0; // 关闭继电器
delay(1000); // 延时1秒
relay = 1; // 打开继电器
delay(1000); // 延时1秒
}
}
void delay(unsigned int t) { // 简单的延时函数
while(t--);
}
这个示例代码使用了一个简单的循环来交替打开和关闭继电器。

delay函数用于在操作继电器之后进行简单的延时,以避免过于频繁的开关切换。

请注意,这只是一个基本示例,实际应用中可能需要更复杂的逻辑和保护措施。

此外,还需要注意以下几点:
继电器的驱动能力:根据具体应用选择适当的继电器,以确保其可以承受所需的负载和电压。

电源和地线:为继电器提供适当的电源和地线,并确保连接牢固。

保护措施:在继电器控制电路中添加适当的保护措施,如限流电阻、二极管等,以避免过电
压或过电流对设备和人员造成伤害。

编程和调试:根据实际硬件配置和需求对代码进行适当的修改和调试。

单片机实验P3.3输入、P1口输出和步进电机控制实验

单片机实验P3.3输入、P1口输出和步进电机控制实验

单⽚机实验P3.3输⼊、P1⼝输出和步进电机控制实验南昌航空⼤学实验报告⼆0⼀⼀年⼗⽉⼀⼗七⽇课程名称:单⽚微型机实验名称:P3.3输⼊、P1⼝输出和步进电机控制实验班级: 080611 学⽣姓名:学号: 08061108 指导教师评定:签名:⼀、实验⽬的1、掌握P3⼝、P1⼝简单使⽤;2、学习延时程序的编写和使⽤;3、了解步进电机控制的基本原理;4、掌握步进电机转动编程⽅法。

⼆、实验内容及要求1、P3.3输⼊、P1⼝输出实验1)P3.3⼝做输⼊⼝,外接⼀脉冲,每输⼊⼀个脉冲,P1⼝按⼗六进制加⼀。

P1⼝做输出⼝,编写程序,使P1⼝接的8个发光⼆极管L1—L8按16进制加⼀⽅式点亮发光⼆极管。

2)P1⼝是准双向⼝,它作为输出⼝时与⼀般的双向⼝使⽤⽅法相同,由准双向⼝结构可知:当P1⼝作为输⼊⼝时,必须先对它置⾼电平,使内部MOS管截⽌,因内部上拉电阻是20KΩ—40KΩ,故不会对外部输⼊产⽣影响。

若不先对它置⾼,且原来是低电平,则MOS管导通,读⼊的数据是不正确的。

3)延时⼦程序的延时计算问题。

对于延时程序:DELAY :MOV R6, #00HDELAY1:MOV R7, #80HDJNZ R7, $DJNZ R6, DELAY1查指令表可知MOV、DJNZ指令均需⽤两个机器周期,⽽⼀个机器周期时间长度为12/ 6.0MHZ,所以该段指令执⾏时间为:((80+1)×256+1)×2×(12÷6000000)=132.1ms。

图1 P3.3输⼊、P1图2 实验电路原理图2、步进电机控制实验1)从键盘上输⼊正、反转命令,转速参数和转动步数显⽰在显⽰器上,CPU再读取显⽰器上显⽰的正、反转命令,转速级数(16级)和转动步数后执⾏。

转动步数减为零时停⽌转动。

2)步进电机驱动原理是通过对它每相线圈中的电流和顺序切换来使电机作步进式旋转。

驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速,微电脑控制步进电机最适合。

51单片机的P0口工作原理详细讲解

51单片机的P0口工作原理详细讲解

51单片机的P0口工作原理详细讲解一、P0端口的结构及工作原理P0端口8位中的一位结构图见下图:由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。

再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。

下面,我们先就组成P0口的每个单元部份跟大家介绍一下:先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。

下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。

D锁存器:构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。

大家看上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。

对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP 没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。

如果时序控制端CP的时序脉冲一旦到了,这时D端输入的数据就会传输到Q 及Q非端。

数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。

如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。

单片机c语言开关程序

单片机c语言开关程序

单片机c语言开关程序单片机是一种集成电路,它具有微处理器、存储器和输入输出端口等功能。

在单片机中,C语言是一种常用的编程语言,可以用来开发各种程序。

本文将详细介绍如何使用C语言编写一个简单的开关程序。

开关是我们日常生活中常见的一种电子元件,它可以控制电路的通断。

在单片机中,我们可以通过编写程序来控制开关的状态。

下面是一个使用C语言编写的开关程序示例:```c#include <reg52.h> // 包含单片机的头文件sbit LED = P1^0; // 将P1.0引脚定义为LED输出口sbit SW = P3^2; // 将P3.2引脚定义为开关输入口void main(){LED = 0; // 初始状态下关闭LEDwhile(1){if(SW == 0) // 当开关按下时{LED = 1; // 打开LED}else{LED = 0; // 关闭LED}}}```上述程序使用了51单片机的C语言编程,通过将P1.0引脚定义为LED输出口,P3.2引脚定义为开关输入口,实现了一个简单的开关控制LED的功能。

在主函数中,我们首先将LED置为0,即关闭LED。

然后通过一个无限循环,不断检测开关的状态。

当开关按下时,开关引脚的电平为低电平(0),此时将LED置为1,即打开LED;当开关松开时,开关引脚的电平为高电平(1),此时将LED置为0,即关闭LED。

通过这段简单的代码,我们可以实现一个基本的开关控制LED的功能。

当按下开关时,LED会亮起;当松开开关时,LED会熄灭。

这个程序可以很好地理解开关的工作原理和单片机的输入输出控制。

当然,这只是一个简单的示例程序,实际应用中可能会更加复杂。

在实际开发中,我们可以根据需要添加更多的功能,如控制多个LED灯、设置开关的触发条件等。

通过不断学习和实践,我们可以掌握更多关于单片机C语言开发的技巧和知识,实现更多有趣和实用的功能。

通过C语言编写单片机的开关程序,我们可以实现对开关状态的监测和控制。

AT89C51单片机的P2口控制

AT89C51单片机的P2口控制

用AT89‎C51单片‎机的P2口‎控制8个L‎e d的流水‎灯的C程序‎看不懂?‎悬赏分:‎80 - ‎解决时间:‎2009-‎4-1 2‎3:55 ‎用AT8‎9C51单‎片机的P2‎口控制8个‎L ed的流‎水灯的C程‎序看不懂?‎从P2-‎0到P2-‎7灯依次单‎独点亮后,‎又从P2-‎7到P2-‎0灯依次单‎独点亮如‎此反复循环‎,程序如下‎(低电平被‎点亮):‎#incl‎u de <‎R EGX5‎2.H>‎v oid ‎D elay‎1ms(u‎n sign‎e d in‎t cou‎n t){‎uns‎i gned‎int ‎i,j;‎for(‎i=0;i‎<coun‎t;i++‎)fo‎r(j=0‎;j<12‎0;j++‎);}‎main‎(){‎ un‎s igne‎d cha‎r LED‎I ndex‎= 0;‎b‎i t LE‎D Dire‎c tion‎= 1;‎w‎h ile(‎1)‎{‎ if(‎L EDDi‎r ecti‎o n)‎ P‎2 = ~‎(0x01‎<<LED‎I ndex‎);‎ els‎e‎ P2 ‎= ~(0‎x80>>‎L EDIn‎d ex);‎‎if(L‎E DInd‎e x==7‎)‎ LED‎D irec‎t ion ‎= !LE‎D Dire‎c tion‎;‎LEDI‎n dex ‎= (LE‎D Inde‎x+1)%‎8;‎ Del‎a y1ms‎(500)‎;‎}‎ }‎我这程序我‎真的看不懂‎,这个b‎i t LE‎D Dire‎c tion‎= 1;‎是什么意思‎?从主函‎数开始,麻‎烦高手帮我‎解释每一句‎的意思以及‎它有用途?‎越详细越‎好!在下‎在此先谢谢‎了!‎提问者:‎t wp16‎89916‎8 - 二‎级最佳答案‎#incl‎u de <‎R EGX5‎2.H> ‎void‎Dela‎y1ms(‎u nsig‎n ed i‎n t co‎u nt) ‎/*延时函‎数,延迟时‎间为cou‎n t×1m‎s)*/ ‎{un‎s igne‎d int‎i,j;‎for‎(i=0;‎i<cou‎n t;i+‎+)f‎o r(j=‎0;j<1‎20;j+‎+);‎}m‎a in()‎{‎u nsig‎n ed c‎h ar L‎E DInd‎e x = ‎0; /*‎声明8位变‎量LEDI‎n dex,‎用来指示8‎个LED中‎哪个被点亮‎,初始值为‎00000‎000*/‎bit ‎L EDDi‎r ecti‎o n = ‎1; /*‎声明位变量‎L EDDi‎r ecti‎o n,用来‎指示点亮的‎方向,初始‎值为1*/‎whil‎e(1) ‎/*一直循‎环执行大括‎号里面的语‎句*/{‎if(‎L EDDi‎r ecti‎o n) /‎*当LED‎D irec‎t ion=‎1时,00‎00 00‎01左移L‎E DInd‎e x位,取‎反后送给P‎2端口,点‎亮一个LE‎D*/P‎2 = ~‎(0x01‎<<LED‎I ndex‎);e‎l se /‎*当LED‎D irec‎t ion=‎0时,10‎00 00‎00右移L‎E DInd‎e x位,取‎反后送给P‎2端口,点‎亮一个LE‎D*/‎P2 = ‎~(0x8‎0>>LE‎D Inde‎x);‎i f(LE‎D Inde‎x==7)‎/*当一‎次循环结束‎时,把LE‎D Dire‎c tion‎取反,下次‎循环时将以‎相反的顺序‎点亮*/‎L EDDi‎r ecti‎o n = ‎!LEDD‎i rect‎i on; ‎LEDI‎n dex ‎= (LE‎D Inde‎x+1)%‎8; /*‎L EDIn‎d ex+1‎对8取余,‎保证LED‎I ndex‎在0~7之‎间*/D‎e lay1‎m s(50‎0); /‎*延时50‎0ms,即‎L ED的点‎亮间隔为0‎.5s*/‎}}‎2‎2回答者:‎紫翅z‎h idao‎- 四级‎ 20‎09-3-‎23 12‎:20‎我来评论‎>>提‎问者对于答‎案的评价:‎谢谢一楼的‎回答,三楼‎回答好一点‎,谢谢!‎相关内容‎?求:‎单片机控制‎双色LED‎灯流水亮起‎的程序‎1 20‎10-1-‎9‎流水灯‎利用单片机‎的P1口控‎制LED的‎发光闪烁,‎在利用编程‎实现模拟广‎告灯2‎009-1‎1-8‎?怎样‎让单片机在‎P1.和P‎2口同时控‎制两个不同‎花样的流水‎灯呢? ‎2009-‎6-29 ‎基‎于at89‎c51单片‎机的led‎彩灯控制器‎管内LED‎板模块硬件‎图中的芯片‎C D407‎6在电路中‎有何作用?‎ 5 ‎2009-‎5-23 ‎用‎P rotu‎e s软件实‎现AT89‎C51单片‎机控制的跑‎马灯的仿真‎,8个LE‎D实现左移‎和右移。

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

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

式中或式中控制系统中的应用在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。

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

比例作用P只与偏差成正比;积分作用I是偏差对时间的积累;微分作用D是偏差的变化率;比例(P)控制比例控制能迅速反应误差,从而减少稳态误差。

除了系统控制输入为0和系统过程值等于期望值这两种情况,比例控制都能给出稳态误差。

当期望值有一个变化时,系统过程值将产生一个稳态误差。

但是,比例控制不能消除稳态误差。

比例放大系数的加大,会引起系统的不稳定。

图2比例(P)控制阶跃响应积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

为了减小稳态误差,在控制器中加入积分项,积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。

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

积分(I)和比例(P)通常一起使用,称为比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

如果单独用积分(I)的话,由于积分输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。

图3积分(I)控制和比例积分(PI)控制阶跃相应微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

由于自动控制系统有较大的惯性组件(环节)或有滞后(delay)组件,在调节过程中可能出现过冲甚至振荡。

解决办法是引入微分(D)控制,即在误差很大的时候,抑制误差的作用也很大;在误差接近零时,抑制误差的作用也应该是零。

图4微分(D)控制和比例微分(PD)控制阶跃相应总结:PI比P少了稳态误差,PID比PI反应速度更快并且没有了过冲。

单片机并行口实验报告

单片机并行口实验报告

单片机并行口实验报告实验二并行口实验报告班级:学号:姓名:教师:一、实验目的通过实验了解8051并行口输入方式和输出方式的工作原理及编程方法。

二、实验内容1、输出实验如图4-1所示。

以8031的P2口为输出口。

通过程序控制发光二极管的亮灭。

2、输入实验如图4-1所示。

以8031的P1口为输入口。

用开关向P1.0~P1.3输入不同的状态,控制P2口P2.4~P2.7发光二极管的亮灭。

3、查询输入输出实验如图1-1所示。

以8051的P1.6或P1.0为输入位,以P2口为输出,二进制计数记录按键的次数。

图1-1三、编程提示1、输出实验程序(1)设计一组显示花样,编程使得P2口按照设计的花样重复显示。

(2)为了便于观察,每一状态加入延时程序。

2、输入实验程序开关打开,则输入为1;开关闭合,则输入为0。

读取P1.0~ P1.3的状态,并将它们输出到P2.4~ P2.7,驱动发光二极管。

所以发光二极管L1~L4的亮灭应与开关P1.0~ P1.3的设置相吻合。

3、查询输入输出程序(1)编程计数P1.0按键次数,按键不去抖动。

(2)编程计数P1.6按键次数,按键不去抖动。

(3)编程计数P1.0按键次数,按键软件延时去抖动。

观察(1)、(2)、(3)、的结果。

四、实验器材计算机,目标系统实验板五、实验步骤1、在KEILC中按要求编好程序,编译,软件调试,生成.HEX文件。

2、断开电源,按图1-1所示,连好开关及发光二极管电路。

3、下载程序。

4、调试运行程序,观察发光二极管状态。

六、C源程序清单1、#include <STC12C5A60S2.h>#define uchar unsigned char#define ON 0#define OFF 1sbit led1=P2^0;sbit led2=P2^1;sbit led3=P2^2;sbit led4=P2^3;sbit led5=P2^4;sbit led6=P2^5;sbit led7=P2^6;sbit led8=P2^7;void delay1(void);void main(void){led1=led2=led3=led4=led5=led6=led7=led8=O FF;while(1){led1=led8=ON;delay1();led2=led7=ON;delay1();led3=led6=ON;delay1();led4=led5=ON;delay1();led1=led8=OFF;delay1();led2=led7=OFF;delay1();led3=led6=OFF;delay1();led4=led5=OFF;delay1();}}void delay1(void){uchar i,j,k;for(i=0;i<10;i++)for(j=0;j<100;j++)for(k=0;k<255;k++);}2、#include<STC12C5A60S2.H>#define uchar unsigned charsbit k8=P1^0; sbit k7=P1^1; sbit k6=P1^2; sbit k5=P1^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void main(void) {while(1){if(!k8)led5=0;if(!k7)led6=0;if(!k6)led7=0;if(!k5)led8=0;if(k8)led5=1;if(k7)led6=1;if(k6)led7=1;if(k5)led8=1;}}3、(1)和(2)#include<STC12C5A60S2.H>#define uchar unsigned char sbit k8=P1^0;sbit k2=P1^6;void main(void){uchar num1,num2;n um1=0;num2=0;while(1){if(!k8){num1++;P2=~num1;}if(!k2){num2++;P2=~num2;}}}3、(3)#include<STC12C5A60S2.H>#define uchar unsigned charvoid delay(uchar);sbit k8=P1^0;sbit k7=P1^1;sbit k6=P1^2;sbit k5=P1^3;sbit k4=P1^4;sbit k3=P1^5;sbit k2=P1^6;sbit k1=P1^7;void main(void){uchar num;n um=0;while(1){if(!k3||!k4||!k5||!k6||!k7){num++;P2=~num;delay(100);}if(!k8){num=0;P2=~num;delay(100);}}}void delay(uchar k ){uchar x,y,z;for(x=k;x>0;x--)for(y=20;y>0;y--)for(z=250;z>0;z--);}七、总结对于这次的实验来说,还是不难的,因为看懂了图1-1后,在加上原来学过的C语言,所以这三个程序还是很容易搞定的,在按键去抖动的程序中,由于k1和k2和其他的键并不一样,这两个键在硬件上已经去抖动了,。

单片机第5章 输入输出接口P0~P3讲解

单片机第5章   输入输出接口P0~P3讲解

P2口—1.作为输入/输出口。 2.作为高8位地址总线。
P3口—P3口为双功能 1.作第一功能使用时,其功能为输入/输出口。 2.作第二功能使用时,每一位功能定义如下表
所示:
端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
第二功能 RXD (串行输入线) TXD (串行输出线) INT0(外部中断0输入线) INT1 (外部中断1输入线) T0 (定时器0外部计数脉冲输入) T1 (定时器1外部计数脉冲输入) WR (外部数据存储器写选通信号入)
为了节省口线,可将按键接成矩阵的形式。
例如:8×8的形式接64个按键,行列用两个接口 表示。每个按键都有行值和列值,行值和列值的组合 (称为按键的扫描码)就可以唯一的标识某个按键。 矩阵的行线和列线分别通过两个并口与CPU通信。按键 的状态用开关量“0/1”表示。
键盘处理程序的任务是: 确定有无键按下; 判哪一个键按下, 键的功能是什么; 还要消除按键在闭合或断开时的抖动。
TAB2 : db 78H,79H,38H,38H,3FH ; “HELLO”的字形码
DAY: MOV R6,#20 ; 延时20ms子程序 DL2: MOV R7,#7DH DL1: NOP
NOP DJNZ R7,DL1 DJNZ R6,DL2
RET
END
5.3.2用并行口设计键盘电路
键盘是计算机系统中不可缺少的输入设备,当按 键少时可接成线性键盘(一个按键对应一位,如图5.2 中的按键 ),按键较多时,这样的接法占用口线较多。
a
5
EE DE BE 7E ED DD BD 7D EB DB BB 7B E7 D7 B7 77
开始

单片机8个led灯用八个开关控制的led灯用p口赋值程序

单片机8个led灯用八个开关控制的led灯用p口赋值程序

单片机8个led灯用八个开关控制的led灯用p口赋值程序假设你使用的是51单片机,以下是八个开关分别连接到P0口0~7,控制8个LED灯的P1口控制程序:```#include <reg51.h> //包含51单片机头文件void delay() //延时函数{int i, j;for (i = 0; i < 1000; i++)for (j = 0; j < 100; j++);}void main(){P1 = 0x00; //将初始值设为0while (1){if (P0 == 0x01) //当P0口值为0000 0001时P1 = 0x01; //LED1亮else if (P0 == 0x02) //当P0口值为0000 0010时P1 = 0x02; //LED2亮else if (P0 == 0x04) //当P0口值为0000 0100时P1 = 0x04; //LED3亮else if (P0 == 0x08) //当P0口值为0000 1000时P1 = 0x08; //LED4亮else if (P0 == 0x10) //当P0口值为0001 0000时P1 = 0x10; //LED5亮else if (P0 == 0x20) //当P0口值为0010 0000时P1 = 0x20; //LED6亮else if (P0 == 0x40) //当P0口值为0100 0000时P1 = 0x40; //LED7亮else if (P0 == 0x80) //当P0口值为1000 0000时P1 = 0x80; //LED8亮elseP1 = 0x00; //所有LED灭delay(); //延时}}```注意每个情况下的P0口值需要设置为对应的二进制数值,为了方便可以先在二进制转换器中计算出对应的数值。

此外,如代码所示,我们还需要一个延时函数来保持LED灯的状态,否则所有的灯会闪烁得非常快,人眼无法分辨。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二P1口输入、输出实验
一.实验要求
1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。

2.P1口做输入口,接八个拨动开关,以实验机上74LS273做输出口,编写程序读取开关状态,将此状态,在发光二极管上显示出来。

二.实验目的
1.学习P1口的使用方法。

2.学习延时子程序的编写和使用。

三. 实验电路及连线
实验一时,P1.0-P1.7接L0-L7。

实验二时,P3.0-P3.2接K0-K2,P1.0-P1.7接L0-L7。

CS273接第○7模块地址译码的F200。

四.实验说明
1.P1口是准双向口。

它作为输出口时与一般的双向口使用方法相同。

由准双向口结构可知当P1口作为输入口时,必须先对它置高电平使内部MOS管截止。

因为内部上拉电阻阻值是20KΩ~40KΩ,故不会对外部输入产生影响。

若不先对它置高,且原来是低电平,则MOS管导通,读入的数据是不正确的。

2.延时子程序的延时计算问题
对于程序DELAY:
MOV R0,#00H
DELAY1:
MOV R1,#0B3H
DJNZ R1,$
DJNZ R0,DELAY1
查指令表可知MOV,DJNZ 指令均需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:
((0B3+1)×256+1)×2×12÷11059200=100.002mS
五.实验框图
程序框图:
开始
设置初始值
数据输出循环左移
延时
开始
读P1口
输出对应数据
TP1A.ASM主程序框图TP1B.ASM主程序框图循环右移
ORG 0000H
MAIN: MOV A,#0FEH
LOOP1: MOV P1,A
RL A
ACALL DELAY
SJMP LOOP1
DELAY: MOV R0,#00H
DELAY1: MOV R1,#0B3H
DJNZ R1,$
DJNZ R0,DELAY1
RET
三个开关,控制八个状态,1代表亮第一灯,2代表亮前面两灯,依次类推。

ORG 0000H MAIN: MOV A,P3
ANL A,#07H
SJMP START
START: CJNE A,#00H,L2
MOV A,#00H
MOV P1,A
LJMP MAIN
L2: CJNE A,#01H,L3
MOV A,#01H
MOV P1,A
LJMP MAIN
L3: CJNE A,#02H,L4
MOV A,#03H
MOV P1,A
LJMP MAIN
L4: CJNE A,#03H,L5
MOV A,#07H
MOV P1,A
LJMP MAIN
L5: CJNE A,#04H,L6
MOV A,#0FH
MOV P1,A
LJMP MAIN
L6: CJNE A,#05H,L7
MOV A,#1FH
MOV P1,A
LJMP MAIN
L7: CJNE A,#06H,L8
MOV A,#3FH
MOV P1,A
LJMP MAIN
L8: CJNE A,#07H,LAST
MOV A,#7FH
MOV P1,A
LJMP MAIN LAST: LJMP MAIN
ORG 0000H MAIN: MOV A,#0FEH LOOP1: MOV P1,A
RL A
ACALL DELAY
SJMP LOOP1 DELAY: MOV R0,#00H DELAY1: MOV R1,#0B3H
DJNZ R1,$
DJNZ R0,DELAY1
RET
开关控制循环左右移动
ORG 0000H
MAIN: MOV A,#0FEH
LOOP1: MOV P1,A
MOV R2,P3
CJNE R2,#00H,LOOP2
RL A
ACALL DELAY
SJMP LOOP1
LOOP2:RR A
ACALL DEAL Y
SJMP LOOP1 DELAY: MOV R0,#00H DELAY1: MOV R1,#0B3H
DJNZ R1,$
DJNZ R0,DELAY1
RET。

相关文档
最新文档