单片机能否输出变化的高频信号?
时间:10-02
整理:3721RD
点击:
我想通过写程序让单片机定时器0按顺序输出20khz、30khz、40khz、50khz、60khz的高频方波,占空比50%,每个频点持续5秒钟左右,能做到吗?想通过改变定时器初值来做,但这程序该怎么写?用switch 语句么?
大家有没有好的想法?如果能实现这功能?
开始时想改变tc0的值来实现,发现仿真出来的频率相差几倍,不行!
TH0=(65536-tc0)/256; TL0=(65536-tc0)%256;
T0_out=~T0_out;
有没有谁做过?
你用什么单片机?主频多少?输出频率精度要求多少?
stc89c52,12MHZ,精度不需要高,可以做到吗?
这个单片执行单指令时间就要1微妙。60K用定时器做指令要非常简洁。若还要定时切换就更难。建议在要求精度的情况下,采用计算指令周期数的方法做。应该可以。
不要求精度的情况
while(1)
{
for(i = 0; i < n20; i++);
for(i = 0; i < n30; i++);
...
}
可以实现的,首先根据不同的定时时间计算所有的初值,也就5个(20khz、30khz、40khz、50khz、60khz),把初值按顺序放在一个数组里面,然后通过for循环遍历数组给TH0和TL0赋值,再延时5s...
后面的自己写吧!
介绍的很好
请问你那个怎么写呢?我编程很差,搞不清逻辑关系,我写的如下面,但测试不行,不知是哪里出错了?
在方式2下,用下面的那些初始值一个一个测试可以达到那个频率,但加多个if语句就不行了!我的目的就是循环放这几个频率工作,每个频点持续两三秒,该怎么写呢?谢谢回答!
- #include <reg52.H>
- #include <intrins.H>
- #include<math.h>
- #define uint unsigned int
- sbit T0_out = P1^0; //定时器T0输出口
- uint n=0,k=0;
- /**************************************************************
- 函数功能:主函数
- **************************************************************/
- void timer0() interrupt 1
- {
- T0_out=~T0_out;
- n++;
- }
- void main(void)
- {
- EA=1; //开总中断
- TMOD=0x12; //方式2
- ET0=1; //定时器T0中断允许
- TR0=1; //启动定时器0
- while(1)
- {
- if(n>=1000)
- {
- k=k+1;
- n=0;
- }
-
- switch (k)
- {
- case 0:
- TH0=0xf7; //约50khz左右
- TL0=0x7d;
- break;
- case 1:
- TH0=0xff; // 约56khz左右
- TL0=0x4d;
- break;
- case 2:
- TH0=0xf4; // 约40khz左右
- TL0=0xf4;
- break;
- case 3:
- TH0=0xf6; // 约42khz左右
- TL0=0x2c;
- break;
- case 4:
- TH0=0xf2; // 约28khz左右
- TL0=0x30;
- break;
- default:
- TH0=0xee; // 约22khz左右
- TL0=0x48;
- break;
- }
- }
- }
我写成的代码在10楼,但还是出问题了,求帮忙!
谁能帮忙一下修改代码,弄了好久还是实现不了,只怪自己能力太差了
我给你修改了一下,你自己看下,有问题的话一起探讨,我也是菜鸟。嘿嘿。
然后这是我用示波器测得的,好像看不出变化呢!你自己看看吧,有问题一起探讨。
示波器得到的波形
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit T0_Wave = P1^0; //波形输出
- uint table_T0[5]={0xfa,0xfb,0xfc,0xfd,0xfe}; //TH0查表用数据,不是很精确,你要求的频率太高
- uint table_HZ[5]={20000,30000,40000,50000,60000}; //波形频率列表
- uchar i=0;
- uchar Count=0; //中断次数
- void Timer0_Init() //定时器0初始化函数
- {
- TMOD=0x02; //T0工作方式2,8位自动重装
- TL0=TH0=table_T0[i]; //选择数组中的初值
- TR0=1;
- ET0=1;
- EA=1;
- }
- void main()
- {
- T0_Wave=1; //开始输出高电平
- while(1) //循环输出
- {
- Timer0_Init();
- if(Count>=table_HZ[i]*5) //如果到达5S,则中断的次数为5*波形频率时
- {
- i++; //改变波形的频率
- }
- if(i>4)
- {
- i=0;
- }
- }
- }
- void Timer0_Int() interrupt 1 //中断处理函数
- {
- TL0=TH0=table_T0[i];
- T0_Wave=~T0_Wave; //取反
- Count++;
- }