历史上的今天

今天是:2024年09月07日(星期六)

2020年09月07日 | 51单片机+DAC0832+LM358放大的单电源函数信号发生器

发布者:CrystalBreeze 来源: 51hei关键字:51单片机  DAC0832  LM358放大  单电源  函数信号发生器 手机看文章 扫描二维码
随时随地手机看文章

这是之前大二51单片机中的实践项目,分享一下资料
1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机
2.LCD1602液晶显示波形种类和频率值(10-100HZ)。
3.按键设置波形种类和设定频率步进值
4.电位器器改变振幅(2.5V-3.5V稳定)。
5.本设计可产生正弦波、锯齿波、三角波、矩形波
6.有四个指示灯分别指示发出的是哪种波形,方便明了。
按键说明:
1  2  3  4
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);

        lcden=0;

}


//自定义字符集

void Lcd_ram()      

{

        uint i,j,k=0,temp=0x40;

        for(i=0;i<7;i++)

        {

           for(j=0;j<8;j++)

           {

            write_com(temp+j);

            write_date(zifu[k]);

            k++;

           }

           temp=temp+8;

        }

}


void init_lcd()                                        //初始化函数

{

        uchar i;                                                                  

        lcden=0;                                        //默认开始状态为关使能端,见时序图  

        Lcd_ram();

        write_com(0x0f);

        write_com(0x38);                        //显示模式设置,默认为0x38,不用变。

        write_com(0x01);                        //显示清屏,将上次的内容清除,默认为0x01.

[1] [2] [3] [4] [5]
关键字:51单片机  DAC0832  LM358放大  单电源  函数信号发生器 引用地址:51单片机+DAC0832+LM358放大的单电源函数信号发生器

上一篇:基于51单片机函数信号发生器
下一篇:单片机波形发生器 (正弦、三角、方波、锯齿波)

推荐阅读

为推进日本大阪市中小学 STEAM 教育进程,日本大阪商工会议所向大阪市教育委员会捐赠200台 Makeblock 最新推出的 AI 智能教育机器人程小奔 (Codey Rocky),作为大阪市立小学教师研修计划的教学器材。捐赠仪式在大阪市政府举行,大阪商工会议所尾崎裕会长和大阪市长吉村洋文出席并参与本次捐赠活动,Makeblock 亚太区负责人也出席此次捐赠仪式。 ...
今天在画原理图的时候,发现了一个问题,无线模块是3.3v的,而在这个板子上我还要连着5v的点阵屏,为此我想到分电源,让P0口接3.3v,其他的口接5v。但是我用的是AT89C51的芯片,只有一个VCC端,引脚图如下:经过查阅资料之后,在经过稳压电路之后,电压变成了3.3V,这时候就可以通过一个排针来设置电压这样,P2口就接的电压是3.3v,其他的I/O口的电压是5v。
具体实现功能:①LCD1602实时显示噪声分贝值,精度为0.1db;②可以按键设置报警值,实现声光报警;三个按键:设置键、加键、减键;③当噪声分贝值未超过阀值时,绿灯闪烁;当超过阈值时,红灯闪烁并蜂鸣器报警。单片机介绍51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编...

史海拾趣

问答坊 | AI 解惑

定时器为什么不中断了

  各位哥哥哥姐这个程序第一次启动定时器可以正常运行,第二次启动定时器就不中断了,小弟初学单片机,实在是找不出原因了。   ORG 0000H   LJMP START   MORG 000BH   LJMP TIMER1 ;定时器1的中断处理   ORG 30H START: &nbs ...…

查看全部问答∨

读《把时间当作朋友》(一):所有人的困境

虽说越来越多的人把时间花在网络上,但静静地读一本好书,从中获得的不仅仅是书本身,而是一种心灵暂时的宁静。 李笑来,这个名字对于那些考过托福、GRE的人并不陌生,这位前新东方的老师著有一些应试的畅销书。而对于我这个从没想过出国的人来说 ...…

查看全部问答∨

下述代码用VC能编译通过,用ads1.2编译器则不行,错误提示:Serious error: C2432E: non-constant initialiser

#define BYTE unsigned char #define WORD unsigned short int #define DWORD unsigned int #define SDWORD signed int #define SBYTE signed char #define SWORD signed short int static SWORD neg_pow2[17]={0,-1,-3,-7,-15,-31,-63,-12 ...…

查看全部问答∨

怎么读出单片机里的代码?

SynCmos公司的 SM8958AC25P单片机。我要读出里面的代码。什么编程器支持这块芯片的代码读取?各位推荐一些好吧。…

查看全部问答∨

EVC中动态改变静态文本控件颜色

请教一个EVC中动态改变静态文本控件颜色的问题;     现在正在开发一个基于WinCE.net4.2平台的应用程序,用EVC开发一个MFC应用程序。 碰到的问题是:我在对话框中依次排列了四个静态文本控件,ID分别为IDC_STATIC1,IDC_STATIC2,IDC_STA ...…

查看全部问答∨

想用STM32的FSMC挂普通单色液晶遇到的问题?

                                 液晶的数据线不是三态的,所以直接挂在FSMC的总线上是肯定不行了,不知道要怎么处理才即可以保持FSMC总线上其他器 ...…

查看全部问答∨

请教版主,STM8S103F单片机AD采样扫描模式

                                 请教版主,STM8S103F单片机AD的模拟输入通道为AIN2~AIN6,如果需要使用AD扫描采样的话,能不能从AIN2开始扫描。…

查看全部问答∨

【问TI】 C6713中MCBSP实现SPI模式的具体步骤有哪些?求教

【问TI】 C6713中MCBSP实现SPI模式的具体步骤有哪些?求教…

查看全部问答∨

ADC检测值异样问题

我的单通道多次转换AD,已经有软件的平滑滤波,但是检测大于1V的信号是显示低于1V接近1V              检测200mV的信号显示0.956~0.542之间不断波动,总之是与实际值相差较大,检测2V以上信号时 ...…

查看全部问答∨

电子大赛往届题目方案分析及讲解

本帖最后由 paulhyde 于 2014-9-15 03:36 编辑 电子大赛往届题目方案分析及讲解    …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved