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

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
2019-07-17 16:50
  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. }






复制代码

一周热门 更多>