程序计数器
- 格式:ppt
- 大小:1.43 MB
- 文档页数:130
单片机计数器C语言练习要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。
该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选真个驱动,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。
图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段亮就取决于P0口的8根线的状态。
编写程序时,首先根据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下:#include "reg51.h"#define uCHAR unsigned CHAR#define uint unsigned intuCHAR code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码uCHAR codeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0 xA1,0x86,0x8E,0xFF}; //字形码uCHAR DispBuf[6]; //显示缓冲区void Timer1() interrupt 3{ uCHAR tmp;uCHAR Count; //计数器,显示程序通过它得知现正显示哪个数码管TH1=(65536-3000)/256;TL1=(65536-3000)%256; //重置初值tmp=BitTab[Count]; //取位值P2=P2|0xfc; //P2与11111100B相或P2=P2&tmp; //P2与取出的位值相与tmp=DispBuf[Count];//取出待显示的数tmp=DispTab[tmp]; //取字形码P0=tmp;Count++;if(Count==6)Count=0;}void main(){ uint tmp;P1=0xff;P0=0xff;TMOD=0x15; //定时器0工作于计数方式1,定时器1工作于定时方式1 TH1=(65536-3000)/256;TL1=(65536-3000)%256; //定时时间为3000个周期TR0=1; //计数器0开始运行TR1=1;EA=1;ET1=1;for(;;){ tmp=TL0|(TH0<<8); //取T0中的数值DispBuf[5]=tmp%10;tmp/=10;DispBuf[4]=tmp%10;tmp/=10;DispBuf[3]=tmp%10;tmp/=10;DispBuf[2]=tmp%10;DispBuf[1]=tmp/10;DispBuf[0]=0;}}这个程序中用到了一个新的知识点,即数组,首先作一个先容。
计算机学科专业基础综合组成原理分类模拟20单项选择题1. 下列寄存器中,汇编语言程序员可见的是______。
A.存储器地址寄存器(MAR)B.程序计数器(PC)C.存储器数据寄存器(MDR)D.指令寄存器(IR)答案:B[解答] 汇编语言程序员可见的是程序计数器(PC),即汇编语言程序员通过汇编程序可以对某个寄存器进行访问。
汇编程序员可以通过指定待执行指令的地址来设置PC的值,如转移指令、子程序调用指令等。
而IR、MAR、MDR是CPU的内部工作寄存器,对程序员不可见。
2. 下列部件不属于控制器的是______。
A.指令寄存器B.程序计数器C.程序状态字寄存器D.时序电路答案:C[解答] 控制器由程序计数器(PC)、指令寄存器(IR)、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、指令译码器、时序电路和微操作信号发生器组成。
而程序状态字寄存器(PSW)属是运算器的组成部分。
3. 通用寄存器是______。
A.可存放指令的寄存器B.可存放程序状态字的寄存器C.本身具有计数逻辑与移位逻辑的寄存器D.可编程指定多种功能的寄存器答案:D[解答] 存放指令的寄存器是指令寄存器,故A错。
存放程序状态字的寄存器是程序状态字寄存器,故B错,通用寄存器并不一定本身具有计数和移位逻辑功能,故C错。
4. CPU中保存当前正在执行指令的寄存器是______。
A.指令寄存器B.指令译码器C.数据寄存器D.地址寄存器答案:A[解答] 指令寄存器用于存放当前正在执行的指令。
51单片机C语言程序定时/计数器中断程序一利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;P1_0=~P1_0;}}程序二利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt,a;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0a=0xfe;while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==2){tt=0;P1=a;a=_crol_(a,1);}}程序三同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;uchar tt;uint fre,flag;void main() //主函数{fre=50000;beep=0;TMOD=0x11;//设置定时器0,定时器1为工作方式1TH0=(65536-fre)/256;TL0=(65536-fre)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断ET1=1;TR1=1;TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1 //定时器0中断{TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256;TL0=(65536-fre)%256;tt++;if(flag<40) //以下几个if分别用来选取不同的频率 if(tt==10){tt=0;fre=50000;beep=~beep;}if(flag>=40&&flag<80){tt=0;fre=50000;beep=~beep;}if(flag>=80&&flag<120){tt=0;fre=10000;beep=~beep;}if(flag>=120&&flag<160){tt=0;fre=5000;beep=~beep;}if(flag>=160&&flag<200){tt=0;fre=2500;beep=~beep;}if(flag>=200&&flag<240){tt=0;fre=1250;beep=~beep;}if(flag>=240&&flag<280){tt=0;fre=625;beep=~beep;}if(flag>=280&&flag<320){tt=0;fre=312;beep=~beep;}if(flag>=320&&flag<360){tt=0;fre=156;beep=~beep;}TR0=1;}void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}}程序四用定时器以间隔500MS在6位数码管上依次显示0、1、2、3....C、D、E、F,重复。
程序计数器名词解释
程序计数器: Program Counter:计算机在计算时,内部有一个专门的“计数器”,它可以自动清零。
但实际上计数器每运行一次都
要清零一次,这样的话就比较麻烦了。
程序计数器名词解释1:*ll port memory:外部存储器或寄存
器名称为:/dev/llport1、外部存储器或寄存器的扩展名为: ll port、寄存器的物理位置为: l/8//8外部存储器的总数/(外部存储器的
字长)。
2: c:///:系统盘,意思是C盘里面的文件会自动存入内存; c://,指该磁盘上文件夹的名称。
程序计数器名词解释1:*ll port memory:外部存储器或寄存
器名称为:/dev/llport1、外部存储器或寄存器的扩展名为: ll port、寄存器的物理位置为: l/8//8外部存储器的总数/(外部存储器的
字长)。
2: c:///:系统盘,意思是C盘里面的文件会自动存入内存; c://,指该磁盘上文件夹的名称。
3: using ll port:用
ll port操作程序计数器名词解释1:*ll port memory:外部存储器或寄存器名称为:/dev/ll port1、外部存储器或寄存器的扩展名为:
ll port、寄存器的物理位置为: l/8//8外部存储器的总数/(外部存储器的字长)。
2: c:///:系统盘,意思是C盘里面的文件会自
动存入内存; c://,指该磁盘上文件夹的名称。
- 1 -。
程序计算器在水文水利计算中的运用问题探讨作者:张媛媛宁毅来源:《硅谷》2014年第19期摘要水文水利计算指的是在水利规划、水利工程设计和运行中,为研究水资源的开发利用、研究水文水利工程对河川径流和水利条件的变化影响,评价水文水利工程的经济和环境效果等所进行的有关分析计算。
水文水利计算是选择河流治理和开发,确定水利工程任务、工程规模、工程开发程序、工程运用方式等的依据。
在水文水利计算的过程中,一般来说水文数据处理工作比较大、比较繁杂,传统的手工计算效率低,而且容易出错。
程序计算器可以通过发出指令让计算机执行来完成计算工作,具有很强的数据分析、统计、模拟计算等功能。
把程序计算机运用到水文水利计算中来可以大大的简化水文水利计算工作,提高计算的效率和精确度。
本文主要分析探讨了程序计算器在水文水利计算中的运用问题。
关键词程序计算器;水文水利;计算中图分类号:P204 文献标识码:A 文章编号:1671-7597(2014)19-0121-011 在水文水利计算中运用程序计算器的工作原理1.1 程序计算器的工作原理程序计数器是计算机处理器中的寄存器,它包含当前正在执行的指令的地址(位置)。
当每个指令被获取,程序计数器的存储地址加一。
在每个指令被获取之后,程序计数器指向顺序中的下一个指令。
当计算机重启或复位时,程序计数器通常恢复到零。
程序计算器可以通过某些手段来确定下一条指令的地址,从而保证程序能够连续地执行下去。
在程序开始执行前,必须将它的起始地址,即程序的第一条指令所在的内存单元地址送入程序计数器,因此程序计数器的内容即是从内存提取的一条指令的地址。
当执行指令时,处理器将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。
由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。
1.2 水文水利计算中运用程序计算器的重要意义水文水利计算指的是在水利规划、水利工程设计和运行中,为研究水资源的开发利用、研究水文水利工程对河川径流和水利条件的变化影响,评价水文水利工程的经济和环境效果等所进行的有关分析计算。
plc中的计数器原理PLC(可编程逻辑控制器)是一种常用的自动化控制设备,广泛应用于工业控制系统中。
其中,计数器是PLC中常用的功能模块之一,用于实现对输入信号的计数和统计。
本文将详细介绍PLC中计数器的原理及其工作流程。
一、计数器的基本概念计数器是PLC中具有计数功能的变址寄存器。
它能够接收一个或多个输入信号,并对这些信号进行计数操作。
计数器可分为两种类型:进位计数器和反馈计数器。
进位计数器是指当计数值达到设定的阈值时,自动清零并触发进位信号;反馈计数器是指当计数值达到设定的阈值时,自动反馈给PLC控制程序。
计数器通常用于需要进行统计计数的场景,如物料计数、生产线计数等。
二、计数器的工作原理1. 输入信号计数器的工作原理首先需要接收一个或多个输入信号。
信号可以是来自传感器、按钮开关、计时器等外部设备。
这些输入信号被PLC的输入模块读取,并发送给计数器模块进行处理。
2. 计数操作计数器接收到输入信号后,开始对其进行计数操作。
计数器根据选择的计数方式进行计数,常见的计数方式有正向计数和反向计数。
正向计数是指计数值递增,一般用于向上计数;反向计数是指计数值递减,一般用于向下计数。
3. 计数器预设值计数器通常具有一个预设值,用于设定计数的终点或起点。
当计数达到预设值时,计数器将触发相应的操作,如清零、进位或反馈给PLC控制程序。
4. 进位或反馈当计数值达到预设值时,进位计数器会自动清零,并触发进位信号。
这个信号可以作为其他设备的输入信号,用于触发其他操作。
反馈计数器则会将计数值反馈给PLC控制程序,供程序进行判断和控制,以实现复杂的逻辑操作。
三、计数器的应用场景计数器作为PLC中常用的功能模块之一,广泛应用于各种自动化控制系统中。
以下是计数器在不同场景下的常见应用示例:1. 物料计数在生产线上,计数器可以用来统计通过传送带的物料数量。
通过设置计数器的预设值,当物料数量达到要求时,触发计数器的进位或反馈信号,从而控制下一道工序的工作。
简述计数器的功能
计数器是一种用于计数和记录次数的装置或程序。
它可以实现多种功能,包括但不限于以下几种:
1. 计数功能:计数器可以记录特定事件的发生次数,比如某个按钮被点击的次数、某个任务执行的次数等。
它可以在特定事件发生时自动增加计数值,或者根据外部信号控制计数值的变化。
2. 累加功能:计数器可以将多个计数值进行累加,得到总计数值。
这个功能常常用于统计某个任务在一段时间内的累计次数,比如网站的访问次数统计。
3. 时钟功能:计数器可以按照固定的时间单位(如秒、分钟、小时等)进行计数,并输出当前的时间值。
这个功能常常用于计时器、倒计时器等应用场景。
4. 分频功能:计数器可以将输入的时钟信号进行分频,得到较低频率的输出信号。
这个功能常常用于数字系统的时序控制,比如频率分频、时钟同步等。
5. 编码功能:计数器可以将计数值转换成二进制编码,输出到指定的引脚或数据总线上。
这个功能常常用于数字系统的地址生成、数据选择等应用。
总的来说,计数器的功能可以根据需求进行灵活配置和扩展,适用于各种计数和记录次数的场合。
PLC入门之计数器你用的是什么类型的计数器?比如,有加法计数器(它们只能正向计数1,2,3,...).它们在英语中被缩写为CTU(count up,升值计数),CNT,C,或者CTR.有减法计数器(它们只能逆向计数9,8,7,...).当它们作为一条独立的指令时,通常被叫做CTD(count down,减值计数).还有双向计数器(它们可双向计数1,2,3,4,3,2,3,4,5,...).当它们作为一条独立的指令时,通常被叫做UDC(up-down down counter,加-减计数器).许多厂家只有一种或两种类型的计数器,但这些计数器应能完成加计数,减计数或双向计数.是不是有些混淆了?难道就没有一相标准吗?不要担心,计数器就是计数器,不要管生产商怎样称呼它们.更容易引起混淆的是,大多数的生产商还加入了一定数量的高速计数器.通常叫它们HSC(high-speed counter),CTH(CounTer High-speed?)或者别的名称.典型的高速计数器是一个"硬件"设备.而上面所列的普通计数器多是"软件"计数器.换句话说,它们并不是真正存在于PLC中,它们只是用软件模拟的计数器.而硬件计数器却是真正存在于PLC中的,它们不依赖PLC的扫描时间.按照拇指理论(rule of thumb),一般情况下多使用普通(软件)计数器,除非所要计数的脉冲比2倍的扫描时间还要快.(例如扫描时间为2ms,而所计脉冲每4ms或更长时间才来一次,那么此时我们使用软件计数器.如果脉冲间隔小于4ms(例如3ms),那么使用硬件(高速)计数器.(2*扫描时间=2*2ms=4ms)要使用计数器,我们必须知道以下三件事情:1.我们要计数的脉冲来自哪里.典型情况下,它来自一个输入端子.(例如将一个传感器接到输入端0000)2.在作出响应前,我们要计多少次.例如计数5个玩具装入后开始打包.3.何时/怎样复位计数器,以便让它重新计数.例如,我们计数5个玩具后,将计数器复位.当程序在PLC上运行时,程序通常会显示当前或"累计"值,以便于我们观察当前的计数值.典型计数器的计数范围为0到9999,-32768到+32767,或0至65535.为什么都是些这么古怪的数字呢?因为大多数PLC都是用的16位计数器.0-9999是16位BCD(binary coded decimal,二进制编码的十进制)码,-32768到32767和0到65535是16位二进制码,我们在以后的章节会解释这是什么意思.下面介绍一些我们将会碰到的指令符号(不同的厂家会有所不同),并说明它们的用法.记住,它们虽然看起来不同,它用法基本都是相同的.如果我们会设置一个计数器,我们就会设置任意的计数了.在这个计数器中,我们需要2个输入.一个接复位线.当该输入端为ON时,当前(累积)计数值将被清零.第二个输入接的是我们要计数的脉冲.例如,我们要对经过传感器前面的玩具计数,我们将传感器接到输入端0001,然后将地址为0001的常开触点接在脉冲线的前面.Cxxx是计数器的名称.如果我们想叫它计数器000,那么在这里我们叫它"C000".yyyyy是我们在要求PLC做出响应前所要计的脉冲数.如果我们在将玩具打包前要计5个玩具,那么我们要该值改为5.如果我们要计100个玩具,那么就将该值改为100,等等.当计数器计数完毕(例如,我们计数了yyyyy个玩具),它将一组独立的触点变为ON,我们也将它标为Cxxx.注意,计数器的累加值仅在脉冲输入的上升沿发生变化.在上面的梯形图中,我们将计数器(叫做计数器000)设置为从输入0001计数100个玩具,然后使输出500变为ON.传感器0002将计数器复位.下面是我们会碰到的一个双向计数器.我们使用于上例相同的缩写(例如UDCxxx和yyyyy).在这个双向计数器中,我们需要使用3个输入端.复位输入的功能与上例相同.但是,对于脉冲输入有两个.一个是加计数,一个是减计数.在这个例子中,我们把这个计数器叫做UDC000,并且给它一个预设值1000.(我们共要计数1000个脉冲)在输入端,我们给输入端0001接上一个传感器,当它检测到目标时,使输入端0001变为ON,给输入端0003也接上一个相同的传感器.当输入端0001变为ON时,PLC正向计数,当输入端0003变为ON时,PLC逆向计数.当计数值到达1000时,输出端500变为ON.再次提醒注意的是,计数器的累计值仅在脉冲输入的下降沿改变.梯形图如下所示.还有一件事要特别注意,在大多数的PLC中计数器和定时器的名称是不一样的.这是因为它们通常使用相同的寄存器.虽然我们还没有学到定时器,但我们必须记住这一点,因为它的确很重要.好了,上面讲的计数器可能有点难以理解,但只要我们用过一次,它们看起来就容易多了.它们的确是一种必要的工具.它们也是"非标准"基本指令之一.但是,有一点要记住,不管是哪个厂家生产的,用法都是一样的.。
PLC调试中常见的定时器和计数器问题及解决方法在PLC(可编程逻辑控制器)的调试过程中,定时器和计数器是经常使用的功能模块。
然而,由于其特殊的工作原理和配置设置,常常会出现一些问题。
本文将介绍PLC调试中常见的定时器和计数器问题,并提供相应的解决方法。
一、定时器问题及解决方法1. 定时器无法正常计时在PLC调试过程中,我们常常会遇到定时器无法正常计时的问题。
造成这个问题的原因可能有多种,其中包括其参数配置错误、输入信号错误、CPU负载过高等。
要解决这个问题,我们可以按照以下步骤进行:首先,检查定时器的参数配置是否正确。
确认定时器的时间基准、预设值、累计值等参数是否符合要求。
其次,检查输入信号的准确性。
确保输入信号的触发时机和频率符合实际需要,避免因为信号错误而导致定时器无法计时。
最后,检查CPU负载情况。
如果CPU负载过高,可能会导致定时器无法正常计时。
我们可以考虑优化程序逻辑,减少CPU负载,或者增加额外的硬件资源来提高性能。
2. 定时器无法复位定时器在完成计时任务后,需要通过复位信号来重新启动。
然而,有时候我们会遇到定时器无法复位的问题。
主要原因可能包括复位信号的触发条件错误、复位信号使用错误等。
解决方法如下:首先,检查复位信号的触发条件是否正确。
确认复位信号的触发时机和触发逻辑是否满足实际需求,避免因为触发条件错误而导致定时器无法复位。
其次,检查复位信号的使用方式。
某些情况下,我们可能会误用了复位信号,导致无法正确复位定时器。
确保在复位信号触发时,能够正确地将定时器的累计值清零,以重新开始计时。
二、计数器问题及解决方法1. 计数器无法正常计数在PLC调试过程中,计数器无法正常计数是一个常见的问题。
这可能是由于计数器的参数配置错误、输入信号问题、程序逻辑错误等原因引起的。
要解决这个问题,可以采取以下措施:首先,检查计数器的参数配置是否正确。
确认计数器的计数范围、触发条件等参数是否正确设置,确保符合实际需求。