仪器社区
登录
首页
找仪器
社区
百科
新品
供应商
品牌
应用
资料
仪企号
展会
标准
求购
招中标
单片机C语言版正弦波信号发生器怎么做?
苦丁茶09112
2012-01-02
要有C语言班程序,并且能够改变正弦波的频率... 要有C语言班程序,并且能够改变正弦波的频率
评论
全部评论
FyfyY5H1h1
#include
//unsigned char TIME0_H=0xec,TIME0_L=0x78; //定时器0的初值设置;全局变量
#include
#include<0832.h>
void main()
{
TMOD=0X01;
TH0=0xff;
TL0=0xd9;
IT0=1; //设置中断触发方式,下降沿
EA=1;
EX0=1;
ET0=1;
IP=0X01; //键盘中断级别高
TR0=1;
while(1)
{
// square();
;
}
}
#ifndef __0832_h__
#define __0832_h__
//#define INPUT XBYTE[0xbfff] //即cs 与xfer 轮流低电平。
//#define DACR XBYTE[0x7fff] //单通道输出,单缓冲就行了。
unsigned char i,sqar_num=128; //Z大值100,默认值50
unsigned char cho=0; //0:正弦波。1:方波。2:三角波。3:锯齿波。
unsigned char num=0;
unsigned char TIME0_H=0xff,TIME0_L=0xd9; //定时器0的初值设置;全局变量.对应正弦波,锯齿波50HZ
sbit chg= P1^0; //三角波100Hz.
sbit freq_u=P1^1;
sbit freq_d=P1^2;
sbit duty_u=P1^3;
sbit duty_d=P1^4;
sbit cs =P3^7;
bit flag=0;
unsigned int FREQ=50;//初始化频率,50HZ
//调节部分——频率
void freq_ud(void)
{
unsigned int temp;
if(freq_d==0)
{ FREQ--; }
else if(freq_u==0)
{ FREQ++; }
if(cho==1|cho==3) //锯齿波256次中断一周期,特殊处理下。否则他的频率是100(+\-)n*2Hz.
{
temp=0xffff-3906/FREQ; //方波,三角波默认为100hz,切换后频率也为50HZ 65336-10^6/(256*FREQ)
TIME0_H=temp/256;
TIME0_L=temp%256;
}
else if(cho==0|cho==3){ //正弦波 三角波默认周期50hz 65536-10^6//(512*FREQ)
temp=0xffff-1953/FREQ;
TIME0_H=temp/256;
TIME0_L=temp%256;
}
}
//调节部分——方波的占空比
void duty_ud(void) //方波也采用512次中断构成一个周期。
{
if(duty_d==0&sqar_num>0)
sqar_num--;
else if(duty_u==0&sqar_num<255)
sqar_num++;
}
//波形发生函数
void sint(void)
{
if(!flag)
{
cs=0;P2=sin_num[num++];cs=1;
if(num==0){num=255;flag=1;}
}
else if(flag)
{
cs=0;P2=sin_num[num--];cs=1;
if(num==255){num=0;flag=0;}
}
}
void square(void)
{
if(i++
else{cs=0;P2=0X00;cs=1;}
}
void triangle(void)
{
cs=0;P2=num++;cs=1;
}
void stw(void)
{
if(~flag)
{
cs=0;P2=num++;cs=1;
if(num==0){num=255;flag=1;}
}
else if(flag)
{
cs=0;P2=num--;cs=1;
if(num==255){num=1;flag=0;}
}
}
//按键中断处理程序。
void it0() interrupt 0
{
if(chg==0) { if(++cho==4) {cho=0;num=0;} } //num=0;所有数据从新开始,保证波形的完整性
else if(freq_u==0|freq_d==0)
{freq_ud();}
else if (cho==1&(duty_d==0|duty_u==0))
{duty_ud();}
else ;
}
//定时器中断处理程序。
void intt0() interrupt 1
{
//TH0=0x00;TL0=0x00;sinx();
switch(cho)
{
case 0:{TH0=TIME0_H;TL0=TIME0_L;sint() ;break;} //正弦波//每半周期256取样。
case 1:{TH0=TIME0_H;TL0=TIME0_L;square(); break;} //方波 //为了提高方波的Z高频率,只有牺牲占空比的Z小可调值。分100份 每次1%。
case 2:{TH0=TIME0_H;TL0=TIME0_L;triangle();break;} //三角波
case 3:{TH0=TIME0_H;TL0=TIME0_L;stw(); break;} //锯齿波
default: ;
}
}
#endif
//正弦表;每半个周期256个取值,Z大限度保证波形不失真。
//各个值通过MATLAB算出,并四设五如取整。具体程序如下
#ifndef __sinx_h__
#define __sinx_h__
unsigned char code sin_num[]={
0,0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2,
2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,
10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21,
22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37,
38, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56,
57, 59, 60, 61, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78,
80, 81, 83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101,102,
104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 120, 121, 123, 124, 126, 128,
129, 131, 132, 134, 135, 137, 139, 140, 142, 143, 145, 146, 148, 149, 151, 153,
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169, 171, 172, 174, 175, 177,
178, 180, 181, 182, 184, 185, 187, 188, 189, 191, 192, 194, 195, 196, 198, 199,
200, 201, 203, 204, 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218,
219, 220, 221, 223, 224, 225, 226, 227, 228, 229, 230, 230, 231, 232, 233, 234,
235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 245, 246,
246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253,
253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
#endif
//MATLAB程序:
//x=linspace(-pi/2,pi/2,255);%如果过采用1位采用,很多值是重的。虽然实际中并不会。
//y=(sin(x)+1)/2.0*255;
//%uint32(y)%强制类型转换。
//%fprintf('%.f\n',uint32(y));%控制输出类型
//round(y)%四舍五入函数
11
0
2017-09-21
0条评论
回复
飥諼谟714
单片机外你有什么资源?可用的外围设备不一样,程序也就不一样。比如,用DA和用DDS做的程序肯定是不一样的。
2
0
2012-01-03
0条评论
回复
您可能感兴趣的社区主题
multisim
信号发生器
输入的频率和示波器测出频率不一样
685
示波器
低频
信号发生器
输出的是什么???
931
信号发生器/信号源
Z全的
信号发生器
选型攻略
605
南京某院校安捷伦E4428C
信号发生器
维修案例
576
信号发生器/信号源
函数
信号发生器
的使用方法及说明
2026
信号发生器/信号源
矢量
信号发生器
与射频
信号发生器
的区别是什么?
993
单一信号的
信号发生器
经过功放放大接到传感器时,产生的超声波的问题
532
超声波传感器
空气中声速的测量实验中,如果
信号发生器
的频率不稳定,对哪些测量方
599
空气发生器
射频分析和频谱分析仪什么区别,
信号发生器
和射频发生器什么区别。
588
频谱分析仪
怎样使用频谱分析仪、前置放大器和
信号发生器
测量噪声系数?
583
频谱分析仪
加载中...
已显示全部信息
评论
选购仪器 上yiqi.com
仪器网络推广
品牌网上传播
长按识别二维码查看信息详情