单片机能否输出变化的高频信号?

2019-07-16 02:49发布

本帖最后由 benshao 于 2013-1-9 14:05 编辑

        我想通过写程序让单片机定时器0按顺序输出20khz、30khz、40khz、50khz、60khz的高频方波,占空比50%,每个频点持续5秒钟左右,能做到吗?想通过改变定时器初值来做,但这程序该怎么写?用switch 语句么?
         大家有没有好的想法?如果能实现这功能?
         开始时想改变tc0的值来实现,发现仿真出来的频率相差几倍,不行!       
                TH0=(65536-tc0)/256;                       TL0=(65536-tc0)%256;
                T0_out=~T0_out;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
hughqfb
1楼-- · 2019-07-16 20:24
 精彩回答 2  元偷偷看……
sirius08
2楼-- · 2019-07-16 20:42
介绍的很好
benshao
3楼-- · 2019-07-17 01:49
hughqfb 发表于 2013-1-9 19:21
可以实现的,首先根据不同的定时时间计算所有的初值,也就5个(20khz、30khz、40khz、50khz、60khz),把初 ...

请问你那个怎么写呢?我编程很差,搞不清逻辑关系,我写的如下面,但测试不行,不知是哪里出错了?
在方式2下,用下面的那些初始值一个一个测试可以达到那个频率,但加多个if语句就不行了!我的目的就是循环放这几个频率工作,每个频点持续两三秒,该怎么写呢?谢谢回答!
  1. #include <reg52.H>
  2. #include <intrins.H>
  3. #include<math.h>
  4. #define uint unsigned int
  5. sbit T0_out = P1^0;     //定时器T0输出口         
  6. uint n=0,k=0;

  7. /**************************************************************
  8. 函数功能:主函数
  9. **************************************************************/
  10. void timer0() interrupt 1
  11. {
  12.                 T0_out=~T0_out;
  13.                 n++;

  14. }

  15. void main(void)

  16. {
  17.                     EA=1;                           //开总中断
  18.         TMOD=0x12;                                                //方式2
  19.         ET0=1;                          //定时器T0中断允许
  20.                 TR0=1;                                                        //启动定时器0
  21. while(1)
  22. {
  23.             if(n>=1000)
  24.                 {
  25.                    k=k+1;
  26.                    n=0;
  27.                 }

  28.                 switch (k)
  29.           {
  30.            case 0:
  31.             TH0=0xf7;    //约50khz左右  
  32.                 TL0=0x7d;
  33.             break;
  34.            case 1:
  35.             TH0=0xff;    // 约56khz左右
  36.                 TL0=0x4d;
  37.             break;
  38.            case 2:
  39.             TH0=0xf4;    // 约40khz左右
  40.                 TL0=0xf4;
  41.             break;
  42.            case 3:
  43.             TH0=0xf6;    //  约42khz左右
  44.                 TL0=0x2c;
  45.             break;
  46.            case 4:
  47.             TH0=0xf2;    //   约28khz左右
  48.                 TL0=0x30;
  49.             break;
  50.           default:
  51.             TH0=0xee;    //   约22khz左右
  52.                 TL0=0x48;
  53.                 break;
  54.      }
  55.   }
  56. }
复制代码
benshao
4楼-- · 2019-07-17 06:03
Tiger_Hu 发表于 2013-1-9 17:20
这个单片执行单指令时间就要1微妙。60K用定时器做指令要非常简洁。若还要定时切换就更难。建议在要求精度的 ...

我写成的代码在10楼,但还是出问题了,求帮忙!
benshao
5楼-- · 2019-07-17 09:11
谁能帮忙一下修改代码,弄了好久还是实现不了,只怪自己能力太差了
hughqfb
6楼-- · 2019-07-17 12:38
 精彩回答 2  元偷偷看……

一周热门 更多>