微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机基础编程

单片机基础编程

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit SQU_K  =P3^4;
sbit SQU_L  =P1^0;
//延时函数
//方波发生函数
void square()
{
   uchar a,b;
   for(a=0;a<255;a++)
   {
    P0=0xff;
    P2=0xff;
    b=P2;
    b=~b;
    while(b--);    //调节相位,b的变化越大,相位变化越小
}
for(a=255;a>0;a--)
{
    P0=0x00;
    P2=0xff;
    b=P2;
    b=~b;
    while(b--);
}
}
//主函数
void main()
{
P1=0xff;
P2=0xff;
P3=0xff;
while(1)
{
  P0 = 0;
  if(SQU_K==0)
  {
   SQU_L=0;
   square();
  }
  SQU_L=1;
}
}
这个是我测试的程序,想做一个波形发生器。产生方波时,相位调到最大,会出现图片的情况,调小一点就不会,请问:我的这个问题是放大电路没有设计好,还是程序没有编辑正确?应该如何修改?



输入频率过高会导致运放失真,没看出是哪个引脚输出波形的,没看出怎么调节相位的,波形里也没看出当前波形的频率,波形的频率怎么调节也没看出来,你确定是在调节相位,而不是调节频率,信息太少

有没有大神给一点提示呢,我现在在写毕业论文设计,请大家帮帮忙

感谢你的回复,
P0口与DA转换器相连,DA转换器输出口与运放相连;
P3口是波形按键切换,P1口是波形LED指示灯;
下面是现在的代码:

  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit SQU_K  =P3^4;
  5. sbit SAW_K  =P3^5;
  6. sbit TRI_K  =P3^6;
  7. sbit SIN_K  =P3^7;
  8. sbit SQU_L  =P1^0;
  9. sbit SAW_L  =P1^1;
  10. sbit TRI_L  =P1^2;
  11. sbit SIN_L  =P1^3;
  12. uchar code sin_tab[]={0,0,0,0,
  13.                       1,1,2,3,4,5,6,8,
  14.         9,11,13,15,17,19,22,24,
  15.         27,30,33,36,39,42,46,49,
  16.         53,56,60,64,68,72,76,80,
  17.         84,88,92,97,101,105,110,114,
  18.         119,123,128,132,136,141,145,150,
  19.         154,158,163,167,171,175,179,183,
  20.          187,191,195,199,202,206,209,213,
  21.         216,219,222,225,228,231,233,236,
  22.         238,240,242,244,246,247,249,250,
  23.          251,252,253,254,254,255,255,255,255};

  24. //方波发生函数
  25. void square()
  26. {
  27.    uchar a,b;
  28.    for(a=0;a<255;a++)
  29.    {
  30.            P0=255;
  31.            P2=0xff;
  32.            b=P2;
  33.            b=~b;
  34.            while(b--);                  //调节相位,b的变化越大,相位变化越小
  35.    }
  36.    for(a=255;a>0;a--)
  37.    {
  38.            P0=0;
  39.            P2=0xff;
  40.            b=P2;
  41.            b=~b;
  42.            while(b--);
  43.    }
  44. }

  45. //锯齿波发生函数

  46. void sawtooth()
  47. {
  48.    uchar a,b;
  49.    for(a=0;a<255;a++)
  50.    {
  51.            P0=a;
  52.            P2=0xff;
  53.            b=P2;
  54.            b= ~b;
  55.            while(b--);                  //调节相位,b的变化越大,相位变化越小
  56.    }
  57. }          
  58.          
  59. //三角波发生函数

  60. void triang()
  61. {
  62.    uchar a,b;
  63.    for(a=0;a<255;a++)
  64.    {
  65.            P0=a;
  66.            P2=0xff;
  67.            b=P2;
  68.            b=~b;
  69.            while(b--);                  //调节相位,b的变化越大,相位变化越小
  70.    }
  71.    for(a=255;a>0;a--)
  72.    {
  73.                 P0=a;
  74.                 P2=0xff;
  75.                 b=P2;
  76.                 b=~b;
  77.                 while(b--);
  78.    }   
  79. }                                  

  80. //正弦波发生函数

  81. void sinwave()
  82. {
  83.    uchar a,b;
  84.    for(a=0;a<91;a++)
  85.    {
  86.            P0=sin_tab[a];
  87.            P2=0xff;
  88.            b=P2;
  89.            b=~b;
  90.            while(b--);                  //调节相位,b的变化越大,相位变化越小
  91.    }
  92.    for(a=91;a>0;a--)
  93.    {
  94.            P0=sin_tab[a];
  95.            P2=0xff;
  96.            b=P2;
  97.            b=~b;
  98.            while(b--);
  99.    }  
  100. }

  101. //主函数

  102. void main()
  103. {
  104.   P1=0xff;
  105.   P2=0xff;
  106.   P3=0xff;
  107.   while(1)
  108.   {
  109.           P0=0;
  110.           if(SQU_K==0)
  111.             {
  112.                         SQU_L=0;
  113.                         square();
  114.                 }
  115.                 SQU_L=1;

  116.                 if(SAW_K==0)
  117.                 {
  118.                         SAW_L=0;
  119.                         sawtooth();
  120.                 }
  121.                 SAW_L=1;
  122.                 if(TRI_K==0)
  123.                 {
  124.                         TRI_L=0;
  125.                         triang();
  126.                 }
  127.                 TRI_L=1;
  128.                 if(SIN_K==0)
  129.                 {
  130.                         SIN_L=0;
  131.                         sinwave();
  132.                 }
  133.                 SIN_L=1;
  134.           }
  135. }

复制代码


若是输入频率过高,我应该如何修改程序?是不是要减小 a 的值?其他应如何改进?


你先试试P2到多少数值时波形开始失真,这个值可以做为上限值,同时可以算算频率是多少,我总觉得你的相位调节实际是频率不调节,你用示波器看看频率范围是多少,如果你的相位调节真的是频率调节的话,会有最高和最低两个值,最高值会超过开始失真的值,多试验几次,找找规律

感谢你的再次回复,
下面是我截取的图片,
图1是P2口都为高电平,b=0xff;整个周期是8ms;
图2是P2口都为低电平,b=0x00;整个周期是0.8s;
两种极限情况都失真,整个过程都是失真的;
晶振的频率一开始选的是24,后来改为12后,情况并没有改善;
放大器我选的是AD817运放,是否对这个问题有影响?
另外,我输出的波形有方波,锯齿波,三角波,正谐波,但只有方波出现失真情况最为严重,其他的并不明显。



把运放输出端的电容去掉试试

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

网站地图

Top