计数器程序
自编的通用计数器C51程序
自编的通用计数器C51程序在我们在DIY各种制作中,经常会遇到计数问题,比如自行车计程器,又比如有网友问我制作的旋转LED时钟的电机转速是如何得到的?实际上,做一个通用的计数器并不难。
下面是我用洞洞板做的学习开发系统下做的通用计数器实验。
C语言源代码如下:#include <reg52.h>#define DIGPORT P2#define WORDPORT P0#define unit unsigned int#define uchar unsigned char#define uong unsigned longuchar code LED_num[]={0x3f,0x18,0x76,0x7c,0x59,0x6d,0x6f,0x38,0x7f,0x7d};uong m;unit i;void Delay(unit t){while(--t);}void Display_LED(uong num){unit ii;unit jj=0;uong aa,bb;unit xx[6]={0,0,0,0,0,0};do {bb=num/10;aa=num-bb*10;xx[jj]=aa;num=bb;jj++;}while(num>0);DIGPORT=0x40;for(ii=0;ii<6;ii++) {DIGPORT=DIGPORT>>1;WORDPORT=LED_num[xx[ii]];Delay(30);};WORDPORT=0;}void intersvr1(void) interrupt 2 using 0 {m++;}/*演示主程序*/void main(void){m=0;EA=1;IT0=1;EX1=1;for(;;){for(i=0;i<400;i++) Display_LED(m); }}。
PLC教程理论篇之PLC 的计数指令及计数程序设计一
PLC教程理论篇之PLC 的计数指令及计数程序设计一一、计数指令简介计数指令用于计数,以进行计数控制或状态存储。
1.三菱PLC计数器指令:计数指令本质上也是一种逻辑输出指令。
只是,它是计到数后才产生输出。
所以,有的PLC,如三菱公司PLC,起用定时器是用输出(OUT)指令,只是其操作数用计数器,并在使用它时,同时对设定值也作设定。
图7-1是的为三菱PLC调用计数器梯形图程序。
图7-1计数器程序如图,当X001从OFF到ON,则计数器C0线圈工作,计一个数,当C0计到3,则C0的常开触点ON,C0的常闭触点(该图未画出)OFF,使Y003 ON。
这里计数设定值K3 为时数,也可为直接或间接地址。
直接地址时,以该地址的值为设定值。
间接地址时,先算出地址,在以算出的地址的内容为设定值。
三菱的计数器按16进制工作,故K值最大可设为65535(16进制FFFF)。
三菱可逆计数器是双字的。
也是用输出指令调用。
计数的方向由相应的特殊继电器状态决定。
其计数范围为-2,147,483,648到2,147,483,647,并在此范围内循环计数。
即增到最大值时,如再增一个数,则当前值变为最小值。
反之,也类似。
表7-1示的为FX2N机的这些计数器及相应的方向切换特殊继电器。
表7-1FX2N机可逆计数器所使用的特殊继电器图7-2三菱可逆计数器程序图中C200为可逆计数器。
M8200为其方向切换特殊继电器。
M8200 OFF,C200增计数,ON,减计数。
从图知,当X005 OFF,C200接收X004的增计数,当X005 ON,C200接收X006的减计数。
而当X007 ON计数器复位,现值等于0,计数及输出都停止。
图7-3示的为该计数器产生输出的情况。
图7-3可逆计数器产生输出简图。
从图知,只要当前值小于设定值时,增加到大于或等于设定值,计数器即产生输出。
反之,或计数器复位,则停止输出。
2.OMRON PLC减计数指令:它有两个输入端,一为计数端,另一为复位端。
计数器按钮操作程序
3、注意:区解操作只能针对进路内的各个区段完成。操作遵守以下的原则:1)信号开放时,区解操作只能关闭信号。2)信号关闭时,如接近区段有车,系统自动延时,延时的时间分别为:进站及正线出站信号机240秒;其它列车信号机60秒;调车信号机30秒。延时期间区解操作无效,延时结束后方可进行区解操作。3)未设置区段按钮的无岔区段、股道,使用相邻的道岔区段的区解操作带解锁。4)延续进路区解操作只有在延续进路延时解锁计时结束后或接车进路解锁后才有效。5)引导进路区解无效时,需采用引导进路人工解锁方式。
1、确认已登记运统-46;
2、红光带区段必须得到工务签认线路正常;
3、确认进路空闲,无敌对进路;
4、接发车进路道岔位置正确(手摇道岔人工确认位置正确且勾顶锁良好)且道岔位置暂不变动,;
5、处于道岔总锁下的咽喉区,不能办理任何性质的进路及道岔操纵。列车进出站的行车凭证为调度命令。
1、鼠标移动到“X总锁”(或“S总锁”)功能按钮,光标会变成小手状,点击左键弹出密码确认框,输入密码“888”,左键点击“确认”键,对应咽喉区的所有道岔锁闭在现位置,控显机上道岔(无表示的除外)岔尖处显示一个圆圈,定位圆圈为绿色;反位圆圈为黄色,“X总锁”(或“S总锁”)按钮处于按下状态;
4、完成改方后,辅助灯熄灭,鼠标移动到对应发车口处于按下红色状态的“总辅助”按钮,光标会变成小手状,点击左键,“总辅助”按钮恢复白色抬起状态。邻站值班员同样操作抬起接车口的“总辅助”按钮,辅助办理完成。
总辅助、
接车辅助
当方向电路处于“双接”状态,或区间轨道电路因故出现红光带导致方向电路不能正常动作,本站需改变方向电路后接入列车。
单片机计数器设计
单片机计数器的设计可以根据具体的需求进行灵活的选择。
以下是一个简单的单片机计数器的设计:
确定计数范围:根据需求确定计数器的范围,例如0-99或0-999。
选择计数器类型:根据计数范围选择合适的计数器类型,可以是二进制计数器、十进制计数器或BCD码计数器等。
确定计数方式:确定计数的方式,可以是递增计数、递减计数或双向计数等。
确定计数信号源:确定计数信号的来源,可以是外部信号源或内部时钟信号源。
连接计数器到外设:根据需求将计数器的输出连接到外设,例如LED显示器、数码管或继电器等。
编写计数器程序:使用适当的单片机编程语言编写计数器程序,包括计数器的初始化、计数操作和显示操作等。
测试和调试:在硬件连接完成后,对计数器进行测试和调试,确保计数器功能正常。
以上是一个简单的单片机计数器的设计流程,具体的实施可以根据具体的需求和单片机型号进行调整。
VHDL-计数器程序
VHDL-计数器程序十五计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY fiveteencout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END fiveteencout;ARCHITECTURE counter OF fiveteencout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1110") THENcount_int<="0000";ELSEcount_int <= count_int 1;-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;十四计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY fourteencout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END fourteencout;ARCHITECTURE counter OF fourteencout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1101") THENcount_int<="0000";ELSEcount_int <= count_int 1;-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;十三计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY thireteencout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END thireteencout;ARCHITECTURE counter OF thireteencout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1100") THENcount_int<="0000";ELSEcount_int <= count_int 1;-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;十二计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY twelvecout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END twelvecout;ARCHITECTURE counter OF twelvecout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1011") THENcount_int<="0000";ELSEcount_int <= count_int 1;-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;十一计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY elevencout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END elevencout;ARCHITECTURE counter OF elevencout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1010") THENcount_int<="0000";ELSEcount_int <= count_int 1;-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;十计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY count ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic_vector(3 downto 0));END count;ARCHITECTURE counter OF count IS SIGNAL count_int:std_logic_vector(0 to 3); BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1001") THENcount_int<="0000";ELSEcount_int <= count_int 1;--ELSE-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--end if;--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;九计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY ninecout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(3 downto 0));END ninecout;ARCHITECTURE counter OF ninecout ISSIGNAL count_int:std_logic_vector(0 to 3);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="1000") THENcount_int<="0000";ELSEcount_int <= count_int 1;--ELSE-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--end if;--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;八计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY eightcout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(2 downto 0));END eightcout;ARCHITECTURE counter OF eightcout ISSIGNAL count_int:std_logic_vector(0 to 2);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="111") THENcount_int<="000";ELSEcount_int <= count_int 1;--ELSE-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN--q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--end if;--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;六计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY sixcout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(2 downto 0));END sixcout;ARCHITECTURE counter OF sixcout ISSIGNAL count_int:std_logic_vector(0 to 2);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="101") THENcount_int<="000";ELSEcount_int <= count_int 1;--ELSE-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN --q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--ELSIF--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--end if;--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;--end if;-- END PROCESS;END counter;四计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY fourcout ISPORT(clk,reset,enable : IN std_logic; count : OUT std_logic _vector(1 downto 0));END fourcout;ARCHITECTURE counter OF fourcout ISSIGNAL count_int:std_logic_vector(0 to 1);BEGINPROCESS(clk,reset)BEGINWAIT UNTIL rising_edge(clk);IF reset = '1' THENcount_int <= (OTHERS => '0');ELSIF enable = '1' THENIF(count_int="11") THENcount_int<="00";ELSEcount_int <= count_int 1;--ELSE-- NULL ;--IF (count_int="1001") THEN--count_int<="0000";END IF;END IF;END PROCESS;count <= count_int;-- IF (reset='0') then--q<="0000";---ELSIF(clk'event and clk='1') THEN --q<=q 1;--IF (q<="1001") then--q<="0000";---END IF;--IF (reset<='1')THEN--q<="00";--wait until (clk'event and clk='1');--WAIT UNTIL (clk'EVENT AND clk = '1');--WAIT UNTIL (clock'EVENT AND clock = '1'); -- q<=q '1';--end if;--count<=q;-- WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--clock'event and clock='1';--count <= 0;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT riseedge clock = '1';--if (clock'event and clock='1') then--WAIT UNTIL rising_edge(clock);--count <= 1;--WAIT UNTIL (clock'EVENT AND clock = '1'); --WAIT UNTIL clock = '1';--if (clock'event and clock='1')then--WAIT UNTIL rising_edge(clock);--count <= 2;--end if;--end if;-- END PROCESS; END counter;。
51单片机计数器程序c语言
下面是一个51单片机计数器的简单程序,使用C语言编写。
c
#include <reg51.h>
// 定义计数器的值
volatile unsigned int counter = 0;
// 定义外部中断0的服务函数
void INT0_Handler() interrupt 0 {
// 清除外部中断0标志位
EX0 = 0;
// 计数器值加1
counter++;
}
void main() {
// 设置外部中断0触发方式为下降沿触发
IT0 = 1;
// 使能外部中断0
EX0 = 1;
// 全局中断使能
EA = 1;
while(1) {
// 在此处添加处理计数器值的代码,例如:
// if (counter >= 100) {
// // 计数器值达到100,执行某些操作
// counter = 0; // 计数器清零
// }
}
}
此代码实现了51单片机的外部中断0的计数器功能。
当INT0引脚检测到下降沿时,会触发外部中断0,并执行INT0_Handler()函数,使counter值加1。
在main()函数中,可以添加处理counter值的代码。
例如,当counter值达到某个阈值时,可以执行特定的操作。
注意,这只是一个基础的示例,具体的代码可能会因具体硬件和应用需求而略有不同。
用汇编语言处理计数器2字节数据的程序
[[[[MOV A,#0
CJNE A,TH0,HAI0
HAI0:NOP
JC LOOP1
AJMP DIZIJIECHULI
LOOP1:
MOV A,#56
ADD A,40H
CJNE A,#100,HAI1
HAI1:NOP
JC LOOP2
SUBB A,#100
LOOP2:
用汇编语言写计数器数据处理的程序
汇编语言只能直接处理8位2进制数,很多童鞋在使用单片机的计数器些技术程序涉及到用BCD码显示时候都不知怎么处理,我自己谢啦个采用中断处理显示的程序希望能够帮到大家。程序大致是这样些的:如果TH0>表明计数器计数值大于256需要处理TH0中的数据,具体处理过程在第一个四方括号里面处理的数据存放在40H(<100) 41H(<100) 42H(<6) 采用100进制的方法在一字节存储单元中存放<100的数,又由于单片机T0计数器最高只能记到65536,所以最高位42H中的数据最高到6,TH0中的数据处理完要把TL0中的数据加进去(看标号:DIZIJIECHULI)同样把结果存在上面三个单元中,最后进行BCD码转换存储(看标号:BCDZHUANHUAN)BCD码处理后存在50,51H,52H中。不过由于处理程序过长,我写程序时是把这个程序写成中断程序的,采用外部中断触发,希望能帮到广大的童鞋们。(⊙_⊙)
MOV 40H,A
MOV A,#2
JC LOOP3
INC A
LOOP3:
ADD A,41H
CJNE A,#100,HAI2
HAI2:NOP
JC LOOP4
INC 42H
c语言计数器程序代码
c语言计数器程序代码计数器是一种常用的程序功能,可以用来记录某个事件的发生次数或者进行循环计数。
在C语言中,可以使用变量和循环结构来实现一个简单的计数器程序。
下面是一个简单的计数器程序的代码示例:```c#include <stdio.h>int main() {int count = 0; // 初始化计数器变量为0printf("开始计数...\n");// 循环执行计数操作,每次循环计数器加1,直到达到目标计数值while (count < 10) {printf("当前计数:%d\n", count);count++; // 计数器自增1}printf("计数结束。
\n");return 0;}```上述代码使用了一个整型变量 `count` 作为计数器,并将初始值设为0。
然后使用 `while` 循环进行计数操作,每次循环中打印出当前计数值,并使计数器自增1,直到计数器的值达到目标值(此处为10)时结束循环,最后打印出计数结束的提示信息。
通过运行上述代码,我们可以得到如下的输出结果:```开始计数...当前计数:0当前计数:1当前计数:2当前计数:3当前计数:4当前计数:5当前计数:6当前计数:7当前计数:8当前计数:9计数结束。
```上述代码示例只是一个最简单的计数器程序,实际应用中可以根据需要进行扩展和修改。
下面是一些相关参考内容,供进一步学习和开发计数器程序时参考:1. C语言基础知识:了解C语言的基本语法、数据类型、变量和运算符等,是学习和编写计数器程序的基础。
2. 循环结构:掌握C语言中的循环结构,包括 `for` 循环、`while` 循环和 `do-while` 循环等,以及循环控制语句如 `break` 和 `continue`,可以灵活运用于计数器程序的实现。
3. 程序流程控制:了解C语言中的条件语句如 `if-else` 和`switch`,以及逻辑运算符、比较运算符等,可以根据需要在计数器程序中加入条件判断,实现更加灵活的计数器功能。
C51 计数器原程序
if (down==0) delay(10);
if (down==0) num--;
if (num<0) num=0;
x=num;
Display();
goto F2;
F1:
Display();
}
/*设定计数值减*/
/******************************************************************
计数值参数设定:x
********************************************************************/
void set()
{
F2:
if(S==0) goto F1;
if (up==0) delay(10);
// /*设定计数值加*/
if (up==0) num++; if(num>=9999) num=0;
//实例 67:用 LED 数码管显示计数器 T0 的计数值 #include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar i);
sbit S=P3^2; //将 S 位定义为 P3.2 引脚
sbit up=P3^0; //将 S 位定义为 P3.3+_ 引脚
sbit down=P3^1; //将 S 位定义为 P3.4- 引脚
sbit BUZ=P1^5; //将 位定义为 BUZ 引脚
uchar tab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
PLC计数器程序梯形图编程实例
PLC计数器程序梯形图编程实例
在光电传感器检测到10个产品后,机械手将开始收拾行李。
当完成动作,机械手和计数器将被重置。
plc输入时所需的数
X0 –用于计数产品的光电传感器。
在检测产品时, X0=ON。
X1 –机械手动作完成传感器。
在完成填塞,X1=ON ,。
PLC输出所需的数
Y0 –机械手
PLC计数器所需的数
C0 –计数器:16位上数(通用)
plc编程梯形图
PLC编程梯形图描述
当光电传感器检测到产品,X0 从关闭变成打开。
C0作一次计数,当C0达到10,常开触点C0关闭,Y0=ON,机械手开始收拾产品。
当完成包装,检测机械手的传感器启动,X1从关闭变为打开,RST 指令执行,Y0,C0重置,准备下次计数。
fx5u 高速计数器指令
fx5u 高速计数器指令FX5U 高速计数器指令是指在三菱PLC FX5U 系列控制器中使用的一种指令。
这个指令可以用来实现高速计数的功能,可以广泛应用于工业自动化领域。
本文将会一步一步地回答有关FX5U 高速计数器指令的主题,并介绍其使用方法和实际应用。
第一部分:引言在工业自动化领域中,计数是一种常见的操作需求。
通过计数,我们可以追踪工件数量、速度、周期和周期之间的时间等信息。
然而,对于某些高速运动场景,常规的计数方法可能无法满足需求。
幸运的是,三菱PLC FX5U 系列控制器提供了高速计数器指令,可以满足这些更高要求的计数需求。
第二部分:FX5U 高速计数器指令的基本概念FX5U 高速计数器指令是一种在三菱PLC FX5U 系列控制器中使用的特殊指令。
它可以通过读取和操作高速计数器的值来实现高速计数的功能。
FX5U 控制器具有多个高速计数器,可以根据实际需求灵活配置。
第三部分:FX5U 高速计数器指令的使用方法1. 配置高速计数器在使用FX5U 高速计数器指令之前,我们首先需要配置高速计数器。
可以通过GX Works3 软件或GX Developer 软件进行配置。
在配置过程中,我们需要指定高速计数器的参数,如计数模式(上升沿计数或下降沿计数)、计数方向(正向或反向)、计数脉冲源以及计数器的初始值等。
2. 编写程序一旦完成了高速计数器的配置,我们就可以开始编写PLC 程序。
可以使用GX Works3 软件或GX Developer 软件来编辑程序。
在程序中,我们需要使用FX5U 高速计数器指令来读取和操作高速计数器的值。
3. 使用FX5U 高速计数器指令FX5U 高速计数器指令的语法一般如下:C 高速计数器编号, 变量编号其中,“C”是指定高速计数器的指令前缀,高速计数器编号是指要操作的高速计数器的编号,变量编号是用来存储高速计数器值的变量的编号。
通过使用FX5U 高速计数器指令,我们可以实现多种功能,比如读取高速计数器的值、设置高速计数器的值、重置高速计数器的值等。
PLC基本指令-计数器
详细描述
在PLC程序中,使用高速计数器指令可以实 现对高速脉冲信号的快速计数功能。高速计 数器具有较高的计数频率和响应速度,可以 用于对高速脉冲信号进行精确计数和控制。 通过配置高速计数器的参数和设置,可以实
现多种不同的计数和控制方式。
05
计数器的注意事项与维 护
计数器的使用注意事项
计数器应安装在无振动的位置 ,避免强烈冲击和振动。
计数器应避免阳光直射和高温 环境,保持适宜的工作温度。
计数器的输入信号应符合规定 的电压和电流范围,避免过载 或短路。
计数器的输出信号应正确连接 ,避免短路或开路。
计数器的常见故障及排除方法
故障现象
计数器不计数
原因分析
输入信号异常、计数器内部故障
排除方法
检查输入信号是否正常、更换计 数器
排除方法
检查输入信号是否正常、重新设 置计数器参数
减计数器指令
总结词
用于减少计数值的指令
详细描述
当输入信号发生变化时,减计数器指令将使计数值减少。常用于控制流程或条件判断,例如在特定事件发生时减 少计数值。
保持计数器指令
总结词
用于在计数器值发生变化时保持当前 计数值的指令
详细描述
当计数器值发生变化时,保持计数器 指令将使计数值保持不变,直到下一 个输入信号触发。这种指令常用于需 要暂时冻结计数值的情况。
计数器的分类
01
02
03
通用计数器
能够进行加法、减法和保 持计数,适用于各种不同 的应用场景。
高速计数器
具有较高的计数频率,通 常用于高速脉冲的测量和 控制。
可逆计数器
既可以正向计数也可以反 向计数,适用于需要双向 计数的场合。
定时计数器T0T1程序设计-2014(17页)
了解51单片机内部定时器/计数器的基本结 构 、工作原理和工作方式 , 掌握工作在定时器 和计数器两种方式下编程方法。
定时计数器T0/T1程序设计
2 、实验要求
1)采用中断编程 , 利用单片机内部定时器/计数器T0定时, 工作于方式1 , 定时1秒 ,使P1 口接的8只发光二极管LED发 光二极管依次从左到右开始逐个点亮或从右到左开始逐个 点亮。 2) 利用内部定时器/计数器T1 , 按计数器模式工作于方式1, 对P3 .5引脚进行计数 ,每计数5个脉冲 ,使I/O 口线上的LED 反转一次 , 反复循环
START : MOV R0, #8
; 设右移8次
MOV A, #01111111B ; 存入开始点亮灯位置
LOOP: MOV P1, A
; 传送到P1并输出
ACALL DELAY
; 调延时子程序
RR A
; 右移一位
DJNZ R0 , LOOP
; 判断移动次数
JMP START
; 重新设定显示值
DELAY : MOV TMOD,#00000001B ; 设定TO工作在MODE1
5 、程序设计
1) 工作原理
寄存器TMOD为工作方式控制寄存器 , 用来设置定时器/计数器 的工作方式 , 并确定用于定时还是用于计数 。 TMOD中每个定时器 /计数器对应GATE 、C/T 、M1 、M0的4位 , GATE是选通门控位 , 它 决定T0 、T1的开始运行是否要受外部中断输入引脚电平的控制;
本实验只需将1个LED与P1 口相连 。单片机的P0 、P1 、 P2 、P3端口都可以用来控制LED 。 (反过去再看设备)
定时计数器T0/T1程序设计
5 、程序设计
程序计数器的工作原理
程序计数器是用于存放下一条指令所在单元的地址的地方。
当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。
与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。
此后经过分析指令,执行指令。
完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
程序计数器是计算机处理器中的寄存器,它包含当前正在执行的指令的地址(位置)。
当每个指令被获取,程序计数器的存储地址加一。
在每个指令被获取之后,程序计数器指向顺序中的下一个指令。
当计算机重启或复位时,程序计数器通常恢复到零。
在计算时,程序发出特殊的操作命令让计算机执行。
指令通过程序,给计算机处理器发出命令。
在计算机中,地址在存储或者内存中,都有专有的位置。
寄存器是处理器使用的数据存放位置的一小部分。
艾驰商城是国内最专业的MRO工业品网购平台,正品现货、优势价格、迅捷配送,是一站式采购的工业品商城!具有10年工业用品电子商务领域研究,以强大的信息通道建设的优势,以及依托线下贸易交易市场在工业用品行业上游供应链的整合能力,为广大的用户提供了传感器、图尔克传感器、变频器、断路器、继电器、PLC、工控机、仪器仪表、气缸、五金工具、伺服电机、劳保用品等一系列自动化的工控产品。
如需进一步了解相关仪器仪表产品的选型,报价,采购,参数,图片,批发等信息,请关注艾驰商城/。
c语言单片机定时器计数器程序
C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。
定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。
本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。
2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。
通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。
在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。
具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。
3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。
在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。
根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。
4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。
需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。
编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。
通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。
5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。
单片机计数器代码
单片机计数器代码一、前言单片机计数器是单片机常用的功能之一,可以用来计数、计时等。
本篇文章将介绍如何编写单片机计数器代码。
二、单片机计数器的原理单片机计数器是利用定时器模块实现的。
定时器模块有一个内部寄存器,可以通过设置寄存器的值来控制定时时间。
当定时时间到达后,定时器会产生一个中断信号,可以在中断服务程序中进行相应的操作。
三、编写单片机计数器代码的步骤1. 配置定时器模块首先需要配置定时器模块,包括选择计数模式、设置预分频系数和比较值等参数。
这些参数需要根据具体需求进行设置。
2. 编写中断服务程序当定时时间到达后,会触发中断信号,进入中断服务程序。
在中断服务程序中需要进行相应的操作,比如更新显示屏上的数字、清零计数值等。
3. 主函数调用在主函数中需要调用相应的函数来启动定时器,并且需要保证程序不退出,在此基础上可以实现长时间持续计数或者循环计数等功能。
四、示例代码以下是一个简单的单片机计数器代码示例:```c#include <reg52.h> // 引入单片机头文件sbit LED = P1^0; // 定义LED引脚void Timer0Init(); // 定义定时器初始化函数void Timer0ISR() interrupt 1; // 定义定时器中断服务程序unsigned int cnt = 0; // 定义计数器变量void main(){EA = 1; // 开启总中断Timer0Init(); // 初始化定时器while(1){// 程序不退出,保证计数持续进行}}void Timer0Init(){TMOD |= 0x01; // 设置为模式1,16位定时器模式TH0 = 0xFC; // 设置高8位比较值为252TL0 = 0x18; // 设置低8位比较值为24ET0 = 1; // 允许定时器中断}void Timer0ISR() interrupt 1{cnt++; // 计数器加一if(cnt >= 10000) cnt = 0; // 计数到10000后清零重新开始计数LED = ~LED; // 翻转LED状态TH0 = 0xFC; // 再次设置高8位比较值为252TL0 = 0x18; // 再次设置低8位比较值为24}```以上代码实现了一个简单的计数功能,每隔10ms计数一次,并且在P1^0引脚上翻转一个LED灯的状态。
0402计数器控制彩灯闪烁程序设计
计数器应用程序设计
计数器控制彩灯闪烁程序设计
布置任务
利用计数器设计一个彩灯闪烁电路,要求实现以下功能: 启动后,彩灯点亮0.5秒、熄灭0.5秒灭,依次循环。
计数器控制彩灯闪烁程 序设计
任务分析
任务分析
说明 PLC软元件 元件文字符号 元件名称ຫໍສະໝຸດ 输入X0SB1
控制按钮
控制功能 启/停控制
任务实施
› (1)用基本指令设计
当初次按下控制按钮SB1时,PLC执 行[ALT M0]指令,使M0线圈得电。
由于M0常开触点的闭合,使Y0线圈 得电,彩灯HL被点亮,计数器C0和 C1同时开始对0.1秒脉冲进行计数。
当再次按下控制按钮SB1时,PLC执 行[ALT M0]指令,使M0线圈失电, 计数器C0和C1被复位,彩灯HL熄灭 。
当计数器C0计数满5次时,计数器 C0常闭触点断开,使Y0线圈失电, 彩灯HL被熄灭;当计数器C1计数满 10次时,计数器C0和C1被复位,程 序进入循环执行状态。
THANK YOU!
计数器控制彩灯闪烁程序设计
输出
Y0
HL
彩灯 控制彩灯闪烁
知识储备
计数器
通用型
断电保持型
16位加计数器(共200个) 设定值:1~32767
C0~C99(共100个) C100~C199(共100个)
32位加/减计数器(共35个) 设定值:
21474836481~+2147483647
C200~C219(共20个) C220~C234(共15个)
加减控制
加减控制
(M8200~M8219) (M8220~M8234)
知识储备
› 1)16位加计数器
0401计数器控制圆盘转动程序设计
C0~C99(共100个) C100~C199(共100个)
32位加/减计数器(共35个) 设定值:
21474836481~+2147483647
C200~C219(共20个) C220~C234(共15个)
加减控制
加减控制
(M8200~M8219) (M8220~M8234)
知识储备
› 1)16位加计数器
任务实施
› (1)用基本指令设计
在Y0线圈得电期间,计数器C1对传感器 检测信号X2进行计数。
当圆盘正转2圈后,计数器C1动作,C1 的常开触点变为常闭状态,计数器C0被 复位,Y0线圈失电,圆盘停止转动。
在C1的常开触点闭合期间,计数器C2对 秒脉冲信号进行计数。
任务实施
› (1)用基本指令设计
知识储备
› 2)32位加/减计数器
当输入端X001闭合时, M8200为OFF状态时, 计数器C200执行加计数。 当输入端X002闭合时, M8200为ON状态,计数
器C200执行减计数。
加计数时,如果计数器C200 的当前值等于或大于设定值 K10,则计数器C200的输出触 点动作,Y000线圈得电,当 前值还会跟随计数信号的变化 继续增加。
当C0的当前值等于设 定值K10时,C0的当 前值不再增加,同时 计数器C0的输出触点 动作,Y000线圈得电。
计数器C0对脉冲输入端 X000的上升沿进行检测, 每检测到1次上升沿信号, 计数器C0的当前值就执 行1次加1。
在任意时刻,断电(断 电保持型除外)或接通 输入端X001,计数器将 被立即复位,累计值清 零、输出触点复位, Y000线圈失电。
当圆盘再次停留5秒后, 计数器C12动作,Y0线圈 得电,圆盘进入循环工作 状态。