如何编程实现51单片机每隔 t 时间发出一个脉冲?求C语言详细编程。。。

2024-10-29 23:24:23
推荐回答(2个)
回答(1):

给你个基本框架,根据你的具体要求再修改吧。使用定时1中断实现,精度比较高。
#include

#define PERIODH (65536l-10000l)/0X100 //设10ms中断1次TH1初值
#define PERIODL (65536l-10000l)%0X100 //设10ms中断1次TL1初值

sbit P1_1 = 0x91; //假设从P1.1输出脉冲

unsigned int iCount; //延时间隔时间变量
unsigned int iPulseCount; //脉冲脉宽时间变量

void timer1() interrupt 3 using 1
{//定时器每0.01秒一次中断

TH1 = PERIODH;
TL1 = PERIODL;

if(iCount)
{//计数未到0,计数器-1
iCount--;
}
if(iPulseCount)
{//计数未到0,计数器-1
iPulseCount--;
}

}
main()
{

TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许
TR1 = 1;//启动定时器1

P1_1 = 0; //脉冲输出端口,假设输出正脉冲,预置为低电平
while(1)
{
iCount = 200;//每间隔200*10ms = 2秒一个脉冲,t值变化改此处
while(iCount);//等待2秒中
P1_1 = 1; //置为高电平,输出正脉冲
iPulseCount = 10;//每间隔10*10ms = 100ms一个脉冲,脉宽变化改此处
while(iPulseCount);//高电平保持100ms
P1_1 = 0; //置为低电平,输出正脉冲结束
}
}

回答(2):

100K的方波对51来说要求太高了,尽量不要用,这个程序如果频率不对,对
“TH0=0XF6;//初始值246”这句里的0xf6调整下,向上增加数值会提高精度。
/**************************
MCU:S52
crystal:24M
****************************/
#include
sbit output=P1^0;//P1.0脚输出100K
void timer0_init()
{
TMOD=0X02;//定时器0方式2
TH0=0XF6;//初始值246
ET0=1;//开中断
EA=1;//开总中断
TR0=1;//开定时器0
}
void main()
{
timer0_init();
while(1);
}
void timer_isvof()interrupt 1
{
output=!output;//中断翻转
}
另外,虚机团上产品团购,超级便宜