‘壹’ 怎么用单片机做一个信号发生器
如果要求频率不是很高,可以采用PWM方式,优点是无需另外加DA,且输出分辨率可灵活调整。考虑到单片机的运算能力不强,你可以用EXCEL编制一个正弦信号在一个周期内的等间隔幅值表,比如说,将一个周期的正弦信号分为64个点,信号的峰值为1000,初始相位为0°,那么,这个表格的第一个点是0,第n点为1000*sin(2πn/64),用EXCEL将64个点的幅值计算完毕,按照需要的格式编制为编程语言能够接受的表格。利用单片机的一个定时器,定时器的溢出值设置为1000,溢出时,某个IO口输出低电平,再用一个寄存器存储输出点序号,序号为n时,根据输出点序号通过查表获取1000*sin(2πn/64)的数值,将定时器的计数值与1000*sin(2πn/64)比较,相等时,IO口输出高电平。不断循环执行上述程序,IO将输出占空比与正弦信号幅值成正比的方波信号,这就是常说的正弦调制PWM信号。设计一个增益可调的有源低通滤波器,PWM信号经过低通滤波器后,输出就是正弦波,调节低通滤波器的增益,即可改变正弦信号的幅值。当然,在设置PWM占空比时,将查表结果先乘以一个设定数值(一般是0~1的小数),也可以调节输出幅值。为了简化运算,可以是先乘以一个整数M,再除以N(N为128、256等2的幂的数值),M取值范围为0~N,因为这种除法可通过移位进行,程序简单,且运算速度快。
‘贰’ 高分求单片机课程设计报告
手边有一些你需要的关于单片机的论文设计资料 需要的话加QQ 晚上7点以后隐身在线,直接加就行,说明要的资料名字就好。嘿嘿 楼主 要是觉的好的话 可别忘了给分哦。
‘叁’ 如何运用单片机原理制作智能信号发生器,要求产生方波、矩形波、三角波、锯齿波和正弦波。
#include<reg51.h>
#include<absacc.h>
#include<MAX72191.h>
#defineDAC XBYTE[0x7fff] //P2.7接CS
sbitkey0 = P3^2;// 增减切换键
sbitkey1 = P3^3;//个位,十位,百位,千位的控制切换
sbitkey2 = P3^4;// 调整位
sbitkey3 = P3^5;// 波形选择正弦、三角、矩形波,锯齿波
unsignedchar i,j;
unsignedint counter,step,flag;
typedefunsigned int uint;
//定时器0初始化
voidInit_Timer0(void)
{
TMOD = (TMOD & 0XF0) | 0X01;//设置工作方式和定时初始值
TH0 = 0xff;
TL0 = 0x00;
TR0 =1; //启动定时器
ET0 =1;
}
//定义输出波形的代码
unsignedchar code type[4][256]={
{ //正弦波代码
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
0x9, 0xb,0xc, 0xd, 0xf, 0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,0x46,0x49,0x4c,
0x4f,0x52,0x55,0x58,0x5b,0x5e,0x61,0x64,0x67,0x6a,0x6d,0x70,0x73,0x76,0x7a,0x7d,
0x80,0x83,0x86,0x89,0x8c,0x8f,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xeb,0xed,0xef,0xf0,0xf1,0xf3,0xf4,
0xf5,0xf6,0xf8,0xf9,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf9,0xf8,0xf6,0xf5,
0xf4,0xf3,0xf1,0xf0,0xef,0xed,0xeb,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,0xda,
0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x8f,0x8c,0x89,0x86,0x83,0x80,
0x7d,0x7a,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,
0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,
0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0xf,0xd, 0xc, 0xb, 0x9,
0x8,0x7, 0x6, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{ //三角波代码
0x2,0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14, 0x16, 0x18, 0x1a,0x1c, 0x1e, 0x20,
0x22,0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30,0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40,
0x42,0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50,0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60,
0x62,0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70,0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80,
0x82,0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90,0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0,
0xa2,0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0,0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc,0xbe, 0xc0,
0xc2,0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0,0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc,0xde, 0xe0,
0xe2,0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc,0xfe, 0xff,
0xfe,0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0,0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4,0xe2, 0xe0,
0xde,0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0,0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4,0xc2, 0xc0,
0xbe,0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4,0xa2, 0xa0,
0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90,0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80,
0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70,0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60,
0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50,0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40,
0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30,0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20,
0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10,0xe, 0xc,0xa, 0x8, 0x6,0x4, 0x2, 0x00
},
{// 矩形脉冲波代码
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
},
{//锯齿波代码
0x00,0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08,0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10,0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,0x18,0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20,0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,0x28,0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38,0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40,0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,0x48,0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50,0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58,0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60,0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,0x68,0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70,0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78,0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80,0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,0x88,0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90,0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,0x98,0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0,0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,0xa8,0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0,0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,0xb8,0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0,0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,0xc8,0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0,0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,0xd8,0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0,0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,0xe8,0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0,0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,0xf8,0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
};
//显示子函数
Disp7219(unsignedlong dat)
{
unsigned char i;
unsigned char led[8];
led[7]=dat%10;
led[6]=dat/10%10;
led[5]=dat/100%10;
led[4]=dat/1000%10;
led[3]=dat/10000%10;
led[2]=dat/100000%10;
led[1]=dat/1000000%10;
led[0]=dat/10000000%10;
for(i=0;i<8;i++)
{
max_7219(i+1, led[i]);
}
}
//延时约1m秒
voiddelay_ms(uint n)
{
uchar j;
while(n--)
for(j=0;j<120;j++);
}
//主函数
main()
{
unsigned int f,n,j;
delay_ms(500);
Init_Max7219();//初始化7219
Disp7219(000);
Init_Timer0();
step=18;
EA = 1;
while(1)
{
if(key0 == 0) n=n+1;
if(n==2)n=0;
if(key1==0) j=j+1;
if(j==4) j=0;
if(n==0 && j == 0 &&key2 == 0) if(step<180) step+=18; //个位增
if(n==1 && j == 0 &&key2 == 0) if(step>18) step-=18; //个位减
if(n==0 && j == 1 &&key2 == 0) if(step<1800) step+=180;//十位增
if(n==1 && j == 1 &&key2 == 0) if(step>180) step-=180; //十位减
if(n==0 && j == 2 &&key2 == 0) if(step<18000) step+=1800;//百位增
if(n==1 && j == 2 &&key2 == 0) if(step>1800) step-=1800;//百位减
if(n==0 && j == 3 &&key2 == 0) if(step<54000) step+=18000;//千位增
if(n==1 && j == 3 &&key2 == 0) if(step>18000) step-=18000;//千位减
if(key3==0)flag=flag+1;if(flag==4)flag=0;
while((!key0)||(!key1)||(!key2)||(!key3));
f=step/18;
Disp7219(f);}//显示频率
}
// 定时中断服务
voidTimer0(void) interrupt 1 using 2
{
TH0 = 0xff;
TL0 = 0x00;
counter = counter + step;
DAC=type[flag][(unsignedint)counter>>8];
}
‘肆’ 求基于单片机50hz正弦波信号发生器原理设计
1,这个线路很容易实现
2,使用单片机发送一个50Hz的方波,然后再做一个50Hz含3次谐波的陷波的低通滤波器输出就是正弦波了。
‘伍’ 基于单片机的信号发生器的设计,输出方波,正弦波,三角波,锯齿波,频率可调。原理是如何哒怎么取点
51单片机硬件有PCA模块的,或者是PWM发生器的型号,也有没有的,你采用的芯片有没有这些硬件?
正弦波:
如果有,以PCA模块为例,可以作为DA使用,使用前根据datasheet配置好PCA。在51头文件中有math.h,里面有sin(X)函数,可以在程序中直接使用,使用前在主函数重要包含math.H这个文件。然后每个点采样输出即可,频率可调可以通过不同方法实现,如果是要做信号发生器,推荐使用一个电位器,通过AD采集电压,将采集值作为你输出函数的系数即可,亦可以通过串口发送指令等方式实现,前提要在使用前将AD或者串口配置好。
如果没有硬件模块,也可以用普通IO口模拟,思路如下,经过y=sinx函数求得的结果,经过算法转化成二进制(主要是将小数转化成二进制的算法),推荐转化成8的整数倍位,比如8位二进制或者16位二进制。转化结束后将结果给IO口输出即可,频率也可采取上述方法设定。
三角波:
如果有DA,将DA的输入值按一定时间自增,到达峰值后按一定时间自减。前文中的“一定时间”设定的足够小,可以近似认为是三角波。三角波输出频率就是周期,在具体到操作层面时,可以将输出函数前加上一个时间系数,还是通过调节正弦波的频率的方式调节。
木有DA···还是和正弦波类似,通过算法将输出值转化成二进制,然后送给IO口
方波:
这个最简单,将IO口定时切换高低电平即可,你定的时间就将成为你输出的频率。
如果有PCA模块,可配置成定时翻转模式,比较方便~
锯齿波是不是和方波类似啊?