单片机做脉冲信号发生器问题
答案:2 悬赏:10 手机版
解决时间 2022-01-01 12:43
- 提问者网友:两耳就是菩提
- 2021-12-31 21:39
救助:用单片机做脉冲信号发生器,能做输出10/3Hz和80/9Hz这样的频率吗?是带无限不循环小数的频率吗?
最佳答案
- 五星知识达人网友:梦中风几里
- 2021-12-31 22:08
毕竟单片机的晶振频率很高,控制好话,可以获得的时间精度很高
频率 10/3Hz不在话下,因其周期 3/10=0.3秒=300000us,假设时钟频率是12M一个计时脉冲是1us,0.3秒是定时器计时脉冲的整数倍 可以定时3000US 累计100 次
对于80/9Hz 其周期 9/80=0.1125秒=112500 US,也是定时器计时脉冲的整数倍 ,就比较好办 可以定时 1125 US,累计100次
反过来,你想得到周期为1/3秒的信号只能取近似值了
可以取 0.333333,可以一次定时10101 us,33次完成,但想要占空比50%,又不够整分了
频率 10/3Hz不在话下,因其周期 3/10=0.3秒=300000us,假设时钟频率是12M一个计时脉冲是1us,0.3秒是定时器计时脉冲的整数倍 可以定时3000US 累计100 次
对于80/9Hz 其周期 9/80=0.1125秒=112500 US,也是定时器计时脉冲的整数倍 ,就比较好办 可以定时 1125 US,累计100次
反过来,你想得到周期为1/3秒的信号只能取近似值了
可以取 0.333333,可以一次定时10101 us,33次完成,但想要占空比50%,又不够整分了
全部回答
- 1楼网友:风格不统一
- 2021-12-31 22:56
是用89s51单片机
程序如下:
刚刚写的,测试了一下大体可以
精确度不是很高
波形输出引脚是p2.1
听过修改n值来改变方波周期
#include
float n=1;
sbit p=p2^1;
char flag;
char cnt;
void time() interrupt 3
{
flag=0;
}
main()
{
char x;
x=15;
x=(char)(x*n);
p=0;
cnt=0;
loop:ea=0;
ea=1;
et1=1;
tmod=0x12;
th1=0x00;
tl1=0x00;
flag=1;
tr1=1;
while(flag);
cnt++;
if(cnt==x) {cnt=0;p=~p;}
goto loop;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯