51单片机接12MHz晶振,定时器0工作方式1,如何设置定时器初值可使频率达到20Hz~20KHz。我是用键盘电路输入频率和占空比,但频率最大只能达到3KHz左右。
求指导,最好能有关于定时器、中断函数的算法参考一下,急求!!!!
51单片机12MHz晶振输出方波
答案:2 悬赏:10 手机版
解决时间 2021-03-02 05:14
- 提问者网友:酱爆肉
- 2021-03-01 21:23
最佳答案
- 五星知识达人网友:空山清雨
- 2021-03-01 22:19
1K T=500us+500us
10K T=50us+50us
20K T=25us+25us
1K以上时,最好不要用定时器0工作方式1,里面涉及到软件延时。
给你提供一个简单的20KHz的方波程序。51单片机接12MHz晶振,定时器0工作方式2。
将程序下载到单片机里,测试一下,试试看。根据实测结果要作调整。
未加按键,略作参考吧。(太晚了,不想写了。)
#include
sbit P10=P1^0;
void Delay25us();
void main()
{
TMOD=0x02;
TH0=(256-25)/256;
TL0=(256-25)%256;
while(1)
{
P10=~P10;
Delay25us();
}
}
void Delay25us()
{
TR0=1;
while(!TF0);
TR0=0;
TF0=0;
}
10K T=50us+50us
20K T=25us+25us
1K以上时,最好不要用定时器0工作方式1,里面涉及到软件延时。
给你提供一个简单的20KHz的方波程序。51单片机接12MHz晶振,定时器0工作方式2。
将程序下载到单片机里,测试一下,试试看。根据实测结果要作调整。
未加按键,略作参考吧。(太晚了,不想写了。)
#include
sbit P10=P1^0;
void Delay25us();
void main()
{
TMOD=0x02;
TH0=(256-25)/256;
TL0=(256-25)%256;
while(1)
{
P10=~P10;
Delay25us();
}
}
void Delay25us()
{
TR0=1;
while(!TF0);
TR0=0;
TF0=0;
}
全部回答
- 1楼网友:第四晚心情
- 2021-03-01 23:10
这个程序你写的太不规范了。
改你的程序.
delay mov r7,#50 ;2 2代表机器周期
d3: mov r6,#50 ;2
d2: mov r5,#200 ;2
d1: djnz r5,d1 ;2
djnz r6,d2 ;2
djnz r7,d3 ;2
ret ;2
其实这个程序来做延迟程序是有误差的,而且很大。
实际延迟时间 t=2us+((2us*200+2us)*60)*50+2us= ...
自己算吧 反正比1s延迟要高,仔细看看计算式子的顺序。以基本2重循环思路来解决3重循环。如果要求不高的话,用它来做1s延迟也可以。
下面来给你写一个通过定时,计数器来做延迟子程序。(精确度很高)
有关知识看定时计数器单元的介绍。
delay: mov tmod,#01h ;选择工作方式1 定时器0
mov th0,#**
mov tlo,#**
setb tr0
loop1: jnb tf0,loop
clr tf0
sjmp main
** 的初始值计算方法 1000 000us=(65535-x)/t
t=12*1/fosc
fosc 即为晶振频率 用x的值除以256,商给th0,余数给tl0
这样,如果需要延迟子程序直接调用。精确度极高。
希望对你有用。不懂继续问
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯