单片机基础编程
时间: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;
}
}
这个是我测试的程序,想做一个波形发生器。产生方波时,相位调到最大,会出现图片的情况,调小一点就不会,请问:我的这个问题是放大电路没有设计好,还是程序没有编辑正确?应该如何修改?
若是输入频率过高,我应该如何修改程序?是不是要减小 a 的值?其他应如何改进?
#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指示灯;
下面是现在的代码:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SQU_K =P3^4;
- sbit SAW_K =P3^5;
- sbit TRI_K =P3^6;
- sbit SIN_K =P3^7;
- sbit SQU_L =P1^0;
- sbit SAW_L =P1^1;
- sbit TRI_L =P1^2;
- sbit SIN_L =P1^3;
- uchar code sin_tab[]={0,0,0,0,
- 1,1,2,3,4,5,6,8,
- 9,11,13,15,17,19,22,24,
- 27,30,33,36,39,42,46,49,
- 53,56,60,64,68,72,76,80,
- 84,88,92,97,101,105,110,114,
- 119,123,128,132,136,141,145,150,
- 154,158,163,167,171,175,179,183,
- 187,191,195,199,202,206,209,213,
- 216,219,222,225,228,231,233,236,
- 238,240,242,244,246,247,249,250,
- 251,252,253,254,254,255,255,255,255};
- //方波发生函数
- void square()
- {
- uchar a,b;
- for(a=0;a<255;a++)
- {
- P0=255;
- P2=0xff;
- b=P2;
- b=~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- for(a=255;a>0;a--)
- {
- P0=0;
- P2=0xff;
- b=P2;
- b=~b;
- while(b--);
- }
- }
- //锯齿波发生函数
- void sawtooth()
- {
- uchar a,b;
- for(a=0;a<255;a++)
- {
- P0=a;
- P2=0xff;
- b=P2;
- b= ~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- }
-
- //三角波发生函数
- void triang()
- {
- uchar a,b;
- for(a=0;a<255;a++)
- {
- P0=a;
- P2=0xff;
- b=P2;
- b=~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- for(a=255;a>0;a--)
- {
- P0=a;
- P2=0xff;
- b=P2;
- b=~b;
- while(b--);
- }
- }
- //正弦波发生函数
- void sinwave()
- {
- uchar a,b;
- for(a=0;a<91;a++)
- {
- P0=sin_tab[a];
- P2=0xff;
- b=P2;
- b=~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- for(a=91;a>0;a--)
- {
- P0=sin_tab[a];
- 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;
- if(SAW_K==0)
- {
- SAW_L=0;
- sawtooth();
- }
- SAW_L=1;
- if(TRI_K==0)
- {
- TRI_L=0;
- triang();
- }
- TRI_L=1;
- if(SIN_K==0)
- {
- SIN_L=0;
- sinwave();
- }
- SIN_L=1;
- }
- }
若是输入频率过高,我应该如何修改程序?是不是要减小 a 的值?其他应如何改进?
你先试试P2到多少数值时波形开始失真,这个值可以做为上限值,同时可以算算频率是多少,我总觉得你的相位调节实际是频率不调节,你用示波器看看频率范围是多少,如果你的相位调节真的是频率调节的话,会有最高和最低两个值,最高值会超过开始失真的值,多试验几次,找找规律
感谢你的再次回复,
下面是我截取的图片,
图1是P2口都为高电平,b=0xff;整个周期是8ms;
图2是P2口都为低电平,b=0x00;整个周期是0.8s;
两种极限情况都失真,整个过程都是失真的;
晶振的频率一开始选的是24,后来改为12后,情况并没有改善;
放大器我选的是AD817运放,是否对这个问题有影响?
另外,我输出的波形有方波,锯齿波,三角波,正谐波,但只有方波出现失真情况最为严重,其他的并不明显。
把运放输出端的电容去掉试试