微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机能否输出变化的高频信号?

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

时间: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语句就不行了!我的目的就是循环放这几个频率工作,每个频点持续两三秒,该怎么写呢?谢谢回答!

  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. }

复制代码

我写成的代码在10楼,但还是出问题了,求帮忙!

谁能帮忙一下修改代码,弄了好久还是实现不了,只怪自己能力太差了

我给你修改了一下,你自己看下,有问题的话一起探讨,我也是菜鸟。嘿嘿。
然后这是我用示波器测得的,好像看不出变化呢!你自己看看吧,有问题一起探讨。

示波器得到的波形


  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit T0_Wave = P1^0;                                        //波形输出
  6. uint table_T0[5]={0xfa,0xfb,0xfc,0xfd,0xfe};                //TH0查表用数据,不是很精确,你要求的频率太高
  7. uint table_HZ[5]={20000,30000,40000,50000,60000};        //波形频率列表
  8. uchar i=0;                  
  9. uchar Count=0;           //中断次数




  10. void Timer0_Init()                            //定时器0初始化函数
  11. {
  12.         TMOD=0x02;                                    //T0工作方式2,8位自动重装
  13.         TL0=TH0=table_T0[i];            //选择数组中的初值
  14.         TR0=1;
  15.         ET0=1;
  16.         EA=1;

  17. }
  18. void main()
  19. {
  20.         T0_Wave=1;                                    //开始输出高电平       
  21.         while(1)                                        //循环输出
  22.         {
  23.                 Timer0_Init();
  24.                 if(Count>=table_HZ[i]*5)        //如果到达5S,则中断的次数为5*波形频率时
  25.                 {       
  26.                         i++;                            //改变波形的频率
  27.                 }
  28.                 if(i>4)
  29.                 {
  30.                         i=0;                          
  31.                 }
  32.         }
  33. }


  34. void Timer0_Int() interrupt 1        //中断处理函数
  35. {
  36.         TL0=TH0=table_T0[i];
  37.         T0_Wave=~T0_Wave;                        //取反
  38.         Count++;       
  39. }






复制代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top