给你个基本框架,根据你的具体要求再修改吧。使用定时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; //置为低电平,输出正脉冲结束
}
}
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;//中断翻转
}
另外,虚机团上产品团购,超级便宜