1、使用T0和T1外部脉冲计数,控制两个电机,到1700个脉冲电机停止,
--统计脉冲个数,用外部中断更好。
--T0和T1,留着定时用。
用四个按键控制,按键1控制电机正转,按键2控制电机反转,按键3控制电机1正转,按键4控制电机2正转。
2、例程:
#include<reg51.h>
sbitk1=?;//自己定义
sbitk2=?
sbitk3=?
sbitk4=?
sbitDIAN1=?
sbitDIAN2=?
sbitDIAN3=?
sbitDIAN4=?
sbitSEN1=?
sbitSEN2=?
voiddelay(unsignedintx)
{
unsignedintm,n;
for(m=x;m>0;m--)for(n=115;n>0;n--);
}
voidmain(void)
{
TMOD=0x55;
IE=0x8a;
while(1){
if(!k1){
delay(10);
if(!k1){
while(!k1);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=0;DIAN2=1;
SEN1=1;
TR0=1;
}
}
if(!k2){
delay(10);
if(!k2){
while(!k2);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=1;DIAN2=0;
SEN1=1;
TR0=1;
}
}
if(!k3){
delay(10);
if(!k3){
while(!k3);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=0;DIAN4=1;
SEN2=1;
TR1=1;
}
}
if(!k4){
delay(10);
if(!k4){
while(!k4);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=1;DIAN4=0;
SEN2=1;
TR1=1;
}
}
}
}
2. 51单片机c语言脉冲计数并显示程序
TMOD=0x05;
TH0=0;TL0=0;
TR0=1;
while(1)
{
a=TH0*256+TL0;
display(a);
}
3. 单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。
看了一下你的要求,单片机里有个GATE位的设置如果你懂得用,编这个程序就不难了。下面是我个人按照你要求刚编的程序:
/***********************
功能:内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。
硬件:单片机用AT89c51,12M晶振。
原理:当门控位GATE为“1”时,TR0/1=1,INT0/1才能启动定时器。
利用这个特性可以测量外部输入脉冲的宽度。
分析:设外部脉冲由(P3.2)输入,T0工作于定时方式1(16位计数),
GATE设为1.测试时,应在INT0低电平时,设置TR0为1(避免检测
到正在进行的脉冲);当INT0为高电平时,就启动计数,INT0再
次变低时,停止计数。此计数值与机器周期的乘积即为被测正脉
冲的宽度。因晶振为12MHz,机器周期为1us.
************************/
#include <reg51.h>
//sbit INT0=P3^2;//INT0在头文件里已定义为P3^2口
#define uint unsigned int
uint pulseWidth[30],num;
void init()
{
num=0;
TMOD=0x09;//选择定时器并设T0为方式1
TH0=0x00; //设计数初会为最大值
TL0=0x00;
}
main()
{
init();
while(1)
{
if(num<30) //记录30个脉冲
{
while(INT0);//等待INT0变低
TR0=1; //应在INT0低电平时,设置TR0为1
while(!INT0);//等待INT0变高,启动定时器开始计数
while(INT0); //等待INT0变低,停止定时器开始计数
TR0=0;
pulseWidth[num]=(uint)TL0;
pulseWidth[num]|=(uint)(TH0<<8);
//因机器周期为1us,故pulseWidth数组里存的数目加上单位us,
//即为所求的脉冲宽度
num++;
}
}
}
4. 基于单片机的脉冲定时计数器C语言程序
#include<reg52.h>
unsigned int ui_n = 0;
void main(void)
{
TR0 = 1; //启动
IE = 0x82;
while(1);
}
void T0_INT(void) interrupt 1
{
ui_n++;
if(ui_n == 7324) ui_n = 0;
}
5. 51单片机对脉冲计数的问题
破题:
“脉冲够10次,"->既然没有时间的限制,则推断应该为连续的10个脉冲。
“点亮一个LED,"->应该有多个LED,每当有连续的十个脉冲,则多点亮一个LED。
"脉冲不够10次,一切回零,”->没有脉冲了,或者说脉冲连续不上了,则熄灭所有LED。
”等待下次脉冲计数。"->既然已经开始等待下次脉冲计数了,就说明,在脉冲消失的同时应该熄灭所有灯,不需要继续向后延续10个周期。
分两个理解:
一、点亮过程:
从第0秒算起,以4秒为一个周期,至第40秒,如果存在“连续”的十个脉冲,点亮LED1。
继续计算,至第80秒,如果存存在“连续”的十个脉冲,点亮LED2。
.......以此类推,直至点亮LEDn。
二、熄灭过程:
只要有一次,在4秒的周期内没有脉冲,则判断为,不够十次!
不知道项目是谁给你的,最好还是问问提出者,否则一旦出了问题,你的工作就白做了!
6. 51单片机的计数器程序
为了使T1能够进行计数,需要在外接P3.5引脚上添加计数脉冲信号。接着,我使用了特定的程序进行模拟,结果显示在下图中,通过数码管显示了TL1等于1的状态。
具体来说,这个程序设计的目的是为了实现外部计数脉冲信号的输入,并通过T1进行计数。当T1接收到计数脉冲信号时,它会根据设定的计数规则进行相应的计数操作。在模拟过程中,我们通过数码管直观地展示了TL1的计数值,以便于观察计数器的工作状态。
在程序中,我们设置了TL1寄存器的初始值为1,以测试计数器的性能。当外部计数脉冲信号被输入到P3.5引脚时,T1会根据计数规则进行递增计数。在模拟结果中,我们可以清晰地看到TL1的计数值变化,从而验证了计数器的工作效果。
此外,为了确保计数器能够稳定工作,我们还进行了多次模拟实验,以验证程序的可靠性和准确性。通过这些实验,我们发现该计数器能够正确地响应外部计数脉冲信号,并且计数结果符合预期。
总之,通过上述程序的实现和模拟,我们成功地验证了51单片机的计数器功能。这一过程不仅展示了计数器的基本工作原理,还为我们提供了宝贵的经验,以便在未来开发更复杂的应用程序时,能够更加灵活地运用计数器功能。
7. 怎么实现mcs-51单片机对外部脉冲的计数功能
外部脉冲接单片机的外部中断或2 个定时/计数器都可以计数的。
8. 用单片机对外来脉冲计数(C语言程序)
要设定16位定时读数器T0或T1,工作方式1、2、3,计数值最大为65536=0xFFFFH,即给高低位分别装入计数初始值TH0(TH1)=FFH,TL0=FFH,可设为中断函数,当计数溢出后自动引发中断,在程序运行时调用即可~
键盘设置到处都有,搜一下就行了