一个单片机C51定时器发射程序 调不通

一个单片机C51定时器发射程序 调不通,第1张

是发40KHz的

方波

吗,那个I有什么用啊??“

//记录

反向

次数

,达到要求后进行延时

”??发方波没这么麻烦吧,直接定时好25us,来一次中断翻转不就行了吗。

//

根据补充:不知道你的延时时间是多少,以及开通的时间是多少,从你的

代码

中可以简单的看到,你是发了2个

周期

的方波,然后延时了“Delay(1)”(几个us,很短,意义不大)。在这里假设你发2个周期,停止4个周期来写吧。关于延时的时间建议使用

定时器

中断来做,这样方便。

#include<reg52h>

#include<stdioh>

#include<intrinsh>

sbit

out=P1^0;

sbit

bIsStop;

//判断停止发送

波形

的标志

unsigned

int

rStopCount;//

停止的时间

计数

unsigned

int

rSendCount;//发送的时间计数

void

t0(void)

interrupt

1

using

0

//中断发射40KHZ方波

{

TL0=0xe7;//

初始化

定时器

TH0=0xe7;

if

(bIsStop)//需要停止了?

{

out=0;//

端口

置0

rStopCount++;//停止的时间累计,25us一次

if

(

rStopCount

>=

8

)//4个周期到了?

{

rStopCount

=

0;//复位

累加器

bIsStop

=

0;//清标志,允许发送

}

}

else

//

原理

同上

{

rSendCount++;

out=!out;

if

(rSendCount

>=

4)

{

rSendCount

=

0;

bIsStop

=

1;

}

}

}

void

main(void)

{

TMOD=0x12;

TL0=0xe7;

TH0=0xe7;

EA=1;

//开中断

PT0=1;

//to溢出中断为最高

优先级

ET0=1;

//开to溢出中断

out=0;

TR0=1;

//to开始工作

while(1)

{;}

}

注:时间可以通过调整rSendCount

,rStopCount

的比较值来重新定义,这里借用了你的中断25us,

如果时间

不是25us的

倍数

的话,可以通过再开一个定时器中断来计时间(或者软件延时也可以@@)。原理就是这样了,

数字

对不对自己

调下

吧。为了这20分,真累啊~~

不能这样写程序!不要在中断函数中写太长,更不能在中断函数中有延时,中断函数中调用别的函数也是非常不好的。

原因是:如果中断占用时间太多,甚至于下次中断又要来了,但本次中断还没完成,你说程序还能按时执行下去吗?

正确的写法是在中断函数中尽量少 *** 作,只置位变量形式的时间标志,如100ms标志,500mS标志等等,真正的处理(如秒分时日月年处理)放在主函数的主循环中做。这样做的目的是让中断占用时间尽量短。

定时器工作了啊,是你程序里面没写死循环,跑了一遍就不跑了,所以你看不到现象

帮你改下:

。。。。。。

TR0=1;

while(1)

{

if(a==20)

a=0;

。。。。。。。。。。。

}

}

}

注意我加进去的东西,其他地方都是你原来的程序,不用动的

用定时器功能,设置定时器0的工作方式为方式1,然后定时50ms,再设置控制变量,设置变量要为整型,定时器初值设为TH0(65536-50000)/256、TL0=(65536-50000)%256,这种赋初值的晶振要求为12MHz,每次定时器溢出时控制变量加一,当控制变量加到2400时,定时已经达到两分钟这时你需要将控制变量清零然后运行你需要运行的代码即可,我有时间会给你上代码的

代码如下:

#include <reg52h>

unsigned count;

void init();

void program();

void main()

{

init();

while(1)

{

if (count==2400)

{

count=0;

program();

}

}

}

//初始化函数设置定时器0的工作方式

void init()

{

TMOD=0x01; //设置定时器工作在方式0

TH0=(65536-50000)/256; //设置初值使其50ms产生一次中断

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void program()

{

//自定义函数

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //产生一次中断重新赋一次初值

count++; //记录中断的次数,每2400次中断为2分钟

}

以上就是关于一个单片机C51定时器发射程序 调不通全部的内容,包括:一个单片机C51定时器发射程序 调不通、c51定时器0和定时器1同时运行、求教C51单片机用定时器延迟的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9428427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存