目录
一、项目功能
二、仿真
三、程序
资料下载地址:基于51单片机的信号发生器
一、项目功能 1. 输出矩形波、梯形波、三角波、锯齿波、正弦波五种波形;
2. 每种波形的频率可更改;
3. 采用lcd12864中文显示屏显示波形和相关信息;
二、仿真
文章图片
正弦波
文章图片
三角波
文章图片
方波
文章图片
锯齿波
文章图片
三、程序
#include
#include
#include
#include #define DAC_OUT P2sbit change_wave=P3^2;
//改变波形按键
sbit change_rate=P3^3;
//改变频率按键
uchar mode=0,rate=0,delay_time=0,k,p;
//为波形发生模块提供中间变量
uchar *which_wave,*which_wave2;
uint rate_num;
uchar code Sine_wave[64]=//DA输出对应电压值对应的数字量,正弦波
{
128,114,102,90,78,66,55,45,36,28,20,14,9,5,2,1,1,1,
3,7,11,17,24,32,41,50,61,72,84,96,108,121,133,146,
158,170,182,193,204,213,222,230,237,243,247,251,253,
254,254,252,249,245,240,234,226,218,209,199,188,176,
167,158,145,135
};
uchar code Sawtooth_Wave[64]=//锯齿波
{
255,251,247,243,239,235,231,227,223,219,215,210,206,202,
198,194,190,186,182,178,174,170,166,162,158,154,150,146,
142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,
81,77,73,69,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0
};
uchar code Square_wave[64]=//方波
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,
};
uchar code Triangular_Wave[64]=//三角波
{
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,
144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,
136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};
void wave_delay()//波形延时函数
{
int a,b;
for(a=1;
a>0;
a--)
for(b=122;
b>0;
b--);
}void wave_init()//波形发生模块的初始化(外部中断0、1)
{
EA=1;
IT0=1;
//下降沿触发
EX0=1;
IT1=1;
EX1=1;
}void disp_wave(uchar *wave)//显示波形函数
{
uchar page,i;
uint date;
select(1);
//选择左屏
for(i=32;
i<64;
i++)
{
page=7-(wave[i]/4)/8;
date=7-(wave[i]/4)%8;
date=pow(2,date);
setpos(page,i);
//选择行列
lcd_wdat(date);
}
select(2);
//选择右屏
for(i=0;
i<64;
i++)
{
page=7-(wave[i]/4)/8;
date=7-(wave[i]/4)%8;
date=pow(2,date);
setpos(page,i);
//选择行列
lcd_wdat(date);
}
}void main()
{lcd_init();
clr_screen();
which_wave=&Sine_wave[0];
disp_chinese();
disp_function(chinese_sine);
disp_rate(400);
disp_xy();
disp_wave(which_wave);
wave_init();
while(1)
{
delay_time=rate;
//rate=0时,12mhz下,为400hz的波形。循环一次的时间为0.00025ms
DAC_OUT=*(which_wave+k);
k++;
if(k==64)
k=0;
while(delay_time)
delay_time--;
}
}void int0() interrupt 0//波形选择中断服务程序
{
EX0=0;
wave_delay();
mode++;
if(mode==4)
mode=0;
switch(mode)
{
case 0 ://显示正弦波
which_wave=&Sine_wave[0];
which_wave2=&chinese_sine[0];
break;
case 1 ://显示三角波
which_wave=&Triangular_Wave[0];
which_wave2=&chinese_triangular[0];
break;
case 2 ://显示方波
which_wave=&Square_wave[0];
which_wave2=&chinese_square[0];
break;
case 3 ://显示锯齿波
which_wave=&Sawtooth_Wave[0];
which_wave2=&chinese_sawtooth[0];
break;
}
wave_delay();
clr_screen();
disp_chinese();
disp_rate(400/rate);
disp_function(which_wave2);
disp_xy();
disp_wave(which_wave);
while(!change_wave);
EX0=1;
}
【信号发生器|基于51单片机的信号发生器】
推荐阅读
- proteus|基于51单片机计算器设计
- 单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
- 嵌入式专栏|第一话——开发板功能及使用介绍
- 蓝桥杯|蓝桥杯单片机最全备考资料(真题、代码、原理图、指导手册、资源包)
- 嵌入式专栏|结合自己经历的一场机器人省赛浅谈如何学习单片机
- 嵌入式|网上五花八门的单片机教程,到底应该怎么整理学习过程
- 嵌入式|单片机有没有想象中那么好学,很迷茫有说正面有说负面
- 单片机开发原理|单片机零基础完整攻略-1
- 单片机|自学单片机难吗(单片机编程教学怎么选?)