×
单片机 > 单片机程序设计 > 详情

51单片机+DAC0832+LM358放大的单电源函数信号发生器

发布时间:2024-05-19 发布时间:
|

这是之前大二51单片机中的实践项目,分享一下资料
1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机
2.LCD1602液晶显示波形种类和频率值(10-100HZ)。
3.按键设置波形种类和设定频率步进值
4.电位器器改变振幅(2.5V-3.5V稳定)。
5.本设计可产生正弦波、锯齿波、三角波、矩形波。
6.有四个指示灯分别指示发出的是哪种波形,方便明了。
按键说明:
1234
1键:设置步进值按键
2键:加按键
3键:减按键
4键:波形切换按键
开机液晶显示正弦波,频率是10Hz,如果要改变波形,按下4键可以选择波形,波形符号会显示在液晶上,同时4个LED也会指示不同的波形;如果要改变波形的频率,可以按下2键和3键,来加减波形的频率,不过开机默认按一下加减按键,只加减0.1Hz,这在实际用时,会很不方便,此时我们可以按下1键,进入步进值设置界面,步进值可以在0.1-10Hz之间调节,按加减按键调节步进值,步进值设置好后(例如设置1Hz),再按一下1键,退出步进值调节界面,回到正常显示,此时按下加减按键更改频率,会发现,按一下加按键,频率会加1Hz,这就会很方便我们调试了。
图片放上来就显示太大了,只好放在附件

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



函数发生器元件清单
1) 9*15万用板
2) STC89C52单片机
3) DAC0832芯片
4) LM358芯片
5) 8脚IC座
6) 20脚IC座
7) 40脚IC座
8) 1602液晶
9) 16p母座
10) 16p排针
11) 4p排针
12) 102电位器蓝白
13) 10k电阻*2
14) 2.2k电阻*3
15) 100欧姆电阻*2
16) 220欧姆电阻
17) 1k电阻*2
18) 103排阻(10k)
19) 按键*5
20) 5mmLED(红、黄、绿、雾白)*4
21) 10uf电解电容
22) 30pf瓷片电容*2
23) 12M晶振
24) 104独石电容*2
25) 自锁开关
26) DC电源插口
27) 导线若干
28) 焊锡若干
29) USB电源线或电池盒

单片机源程序如下:

#include //包含头文件

#include

#define uchar unsigned char //宏定义

#define uint unsigned int


sbit s1=P3^5; //定义按键的接口

sbit s2=P3^6;

sbit s3=P3^7;

sbit s4=P3^4;


sbit led0=P3^0; //定义四个LED,分别表示不同的波形

sbit led1=P3^1;

sbit led2=P3^2;

sbit led3=P3^3;

sbit lcdrs=P2^7; //液晶控制引脚,还有一个控制脚是RW,因为我们只需要向液晶里写数据系那是就好了,所以,我们直接将RW引脚接地

sbit lcden=P2^6;


char num,boxing,u; //定义全局变量

int pinlv=100,bujin=1,bujin1=1; //频率初始值是10Hz,步进值默认是0.1,显示步进值变量

uchar code table[]="0123456789"; //定义显示的数组

uchar code table1[]="Fout= Wave form:"; //初始化显示字符

unsigned long int m; //定义长整形变量 m

int a,b,h,num1; //定义全局变量


//自定义字符

uchar code zifu[]={ //此数组内数据为液晶上显示波形符号的自定义字符

0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00, //正弦波 0 1


0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00,

0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00, //矩形波 2 3


0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,

0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //三角波 4 5


0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, //锯齿波 6

};

uchar code sin[64]={ //此数组内的数据为,da输出对应电压值对应的数字量,0是0V,255是5V

135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,

146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128

}; //正弦波取码

uchar code juxing[64]={ //一个周期是采样64个点, 所以数组内是64个数据

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,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

}; //矩形波取码


uchar code sanjiao[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

}; //三角波取码

uchar code juchi[64]={

0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,

146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255

}; //锯齿波取码


void delay(uint xms) //延时函数

{

int a,b;

for(a=xms;a>0;a--)

for(b=110;b>0;b--);

}

void write_com(uchar com) //写命令函数

{

lcdrs=0;

P0=com;

delay(1);

lcden=1;

delay(1);

lcden=0;

}


void write_date(uchar date) //写数据函数

{

lcdrs=1;

P0=date;

delay(1);

lcden=1;

delay(1);

[1] [2] [3] [4] [5]
51单片机DAC0832LM358放大单电源函数信号发生器

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会