基于51单片机数字示波器设计
基于单片机的简易数字示波器源程序

}
}
}
if(ye>d2)
{
for(q=0;q<7;q++)
{
shu=shu|(shu>>1);
lei=0x70;
for(r=0;r<16;r++)
{
shu=t[2*r+32*k];
shuju();
lei++;
}
}
while(1)
{
uchar d1,d2,d3,d4,d5,d6;
while(jia==0)
{
while(jia==0);
{
adc();
}
for(j=0;j<90;j++) //AD采样
{
adc();
a[j]=AD;
delay_5Байду номын сангаасus(g);
}
lei=0x41;
for(r=0,j=0;r<90;r++,j++)
{
if(j<63) i=1;
writecommand(0x3f);
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void qing()
{
uchar i;
for(i=0xb9;i<=0xbe;i++)
基于51单片机的波形发生器的设计讲解

目录1 引言 (1)1.1 题目要求及分析 (1)1.1.1 示意图 (1)1.2 设计要求 (1)2 波形发生器系统设计方案 (2)2.1 方案的设计思路 (2)2.2 设计框图及系统介绍 (2)2.3 选择合适的设计方案 (2)3 主要硬件电路及器件介绍 (4)3.1 80C51单片机 (4)3.2 DAC0832 (5)3.3 数码显示管 (6)4 系统的硬件设计 (8)4.1 硬件原理框图 (8)4.2 89C51系统设计 (8)4.3 时钟电路 (9)4.4 复位电路 (9)4.5 键盘接口电路 (10)4.7 数模转换器 (11)5 系统软件设计 (12)5.1 流程图: (12)5.2 产生波形图 (12)5.2.1 正弦波 (12)5.2.2 三角波 (13)5.2.3 方波 (14)6 结论 (16)主要参考文献 (17)致谢....................................................... 错误!未定义书签。
1引言1.1题目要求及分析题目:基于51单片机的波形发生器设计,即由51单片机控制产生正弦波、方波、三角波等的多种波形。
1.1.1示意图图1:系统流程示意图1.2设计要求(1) 系统具有产生正弦波、三角波、方波三种周期性波形的功能。
(2) 用键盘控制上述三种波形(同周期)的生成,以及由基波和它的谐波(5次以下)线性组合的波形。
(3) 系统具有存储波形功能。
(4) 系统输出波形的频率范围为1Hz~1MHz,重复频率可调,频率步进间隔≤100Hz,非正弦波的频率按照10次谐波来计算。
(5) 系统输出波形幅度范围0~5V。
(6) 系统具有显示输出波形的类型、重复频率和幅度的功能。
2波形发生器系统设计方案设计并制作一个波形信号发生器,能够产生正弦波、方波、三角波的波形,其中不使用DDS和一些专用的波形产生芯片。
并让系统的频率范围在1Hz~1MHZ可调节,在频率范围在1HZ~10KHz时,步进小于或等于10Hz,在频率范围在10KHz~1MHz时,步进小于或等于100Hz,并且电压在0~5V范围,能够实时的显示波形的类型、频率和幅值。
利用Proteus实现51单片机的数字滤波设计

利用Proteus实现51单片机的数字滤波设计
宣俊伟;王海峰;姜京元;孙中义;张利年
【期刊名称】《青岛大学学报(自然科学版)》
【年(卷),期】2016(029)003
【摘要】使用Proteus仿真软件,提出了数字滤波器的设计方法.以51单片机为核心,先进行滤波算法的C语言编程,使单片机转变为数字滤波器,然后将基波信号与干扰波叠加后送到滤波器进行处理,将滤波后的信号和原始的基波信号在Proteus提供的示波器和液晶显示器上显示对比,直观的展现整个滤波的过程.
【总页数】4页(P93-96)
【作者】宣俊伟;王海峰;姜京元;孙中义;张利年
【作者单位】青岛大学机电工程学院,青岛266071;青岛大学机电工程学院,青岛266071;青岛大学机电工程学院,青岛266071;青岛大学机电工程学院,青岛266071;青岛市北中联混凝土有限公司,青岛266100
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.基于proteus的C51单片机I2C总线的实现 [J], 王九龙;郑贵金
2.通过PROTEUS软件实现ICL7135与51单片机串口仿真 [J], 王忠远;张凤桐;
3.Proteus下的51单片机源码调试的实现方法 [J], 毕万新;孟晓明;宋国平
4.用Proteus实现51单片机的动态仿真调试 [J], 王文海;周欢喜
5.基于AT89C51单片机的简易五路抢答器的Proteus仿真设计与实现 [J], 马亦男
因版权原因,仅展示原文概要,查看原文内容请购买。
基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计引言:波形发生器是一种可以生成特定频率、特定波形的电子设备。
它广泛应用于科研、教学和产业生产等领域,可以用于信号发生、信号测试、信号仿真等各种任务。
本文将介绍一个基于51单片机的波形发生器的设计方案。
一、系统硬件设计1.系统框架该波形发生器系统采用51单片机作为主控芯片,主要包括三个部分:信号生成模块、显示模块和控制模块。
其中,信号生成模块负责产生各种特定频率、特定波形的信号;显示模块用于展示信号参数等相关信息;控制模块负责接收用户输入并对波形发生器进行控制。
2.硬件连接信号生成模块与主控芯片之间通过I/O接口相连,用于传输数据和控制信号。
显示模块通过串口与主控芯片相连,用于显示相关信息。
控制模块通过按键、旋钮等输入设备与主控芯片相连,用于接收用户输入。
二、系统软件设计1.系统初始化在系统初始化阶段,主控芯片需要完成引脚、定时器、串口等相关资源的初始化工作。
同时,还需要设置一些全局变量和参数的初始值。
2.信号生成模块信号生成模块通过定时器产生特定频率的时钟信号,并根据用户输入的参数生成相应的信号波形。
主控芯片利用定时器中断函数进行波形生成,并将生成的信号数据存放在缓冲区中。
3.显示模块显示模块负责将信号波形显示在液晶屏上,并显示相关参数,如频率、幅度等。
主控芯片将信号数据从缓冲区中读取,并通过串口发送给显示模块进行显示。
4.控制模块控制模块负责接收用户输入的控制指令,并通过按键、旋钮等输入设备完成用户交互。
主控芯片通过中断函数实时读取用户输入并进行相应的控制操作。
三、系统功能设计1.频率设置功能用户可以通过控制模块设置波形发生器的频率,可以选择固定频率或者可调频率。
利用定时器时钟频率与定时器中断的时间间隔来控制波形的频率。
2.波形选择功能用户可以通过控制模块选择不同的波形类型,如正弦波、方波、三角波、脉冲波等。
主控芯片根据用户指令设置波形参数,并生成相应的波形信号。
51单片机 c语言 12864 st7920 完美液晶示波器

void lcd_init()
{
delayms(3);
lcd_wcmd(0x30);
delayms(1); //选择基本指令集
lcd_wcmd(0x30); //选择8bit数据流
show_str(" ");
lcd_wcmd(0x98);
show_str(" ");
}
/*------------------清整个GDRAM空间----------------------------*/
void clr_gdram()
{ unsigned char x,y; //1.5s
}
for (i=0;i<8;i++)
{
AD_OUT=1;
AD_CLK=1;
al<<=1;
if (AD_OUT) al|=0x01;
AD_CLK=0;
}
AD_CS=1;
ad=(unsigned int)ah;ad<<=8;ad|=al;
return (ad);
a++;
}
if(a==0)
new_lie[t]=lie[t];
}
}
a=0;
}
void sure_lie() //p=temp
{
uchar a=0;
if(t<8)
{
sure_newlie();
return (0x80+y);
基于51单片机的波形发生器的设计讲解

基于51单片机的波形发生器的设计讲解波形发生器是电子设备中常见的一种电子设备,它可以产生各种不同形状的波形信号。
在这篇文章中,我们将会详细介绍基于51单片机的波形发生器的设计。
一、波形发生器的原理及分类波形发生器的原理是利用电子元件、电路以及控制信号源,将一定幅度的电压信号变化成为需要的各种形状的波形信号。
根据波形的形状分类,可以将波形发生器分为以下几种类型:1.正弦波发生器:产生正弦波信号的发生器,常用于音频设备中。
2.方波发生器:产生方波信号的发生器,常用于数字电路中,也可用于频率测量和脉冲调制等应用。
3.三角波发生器:产生三角波信号的发生器,常用于音频设备以及频率测试等领域。
4.锯齿波发生器:产生锯齿波信号的发生器,常用于音频设备、测试仪器以及数据采集和测量等领域。
二、基于51单片机的波形发生器设计下面我们将详细介绍基于51单片机的波形发生器的设计步骤。
1.硬件设计:在基于51单片机的波形发生器设计中,我们需要准备的硬件元件有:-51单片机控制芯片-芯片烧录器-液晶显示屏-按键开关-电源模块-杜邦线等电子连接线2.硬件连接:根据电路原理图进行将电子元件进行正确的电路连接。
其中,51单片机作为核心控制芯片,负责生成波形信号,液晶显示屏用于显示波形信号,按键开关用于控制波形发生器的启动、停止以及参数调整等操作。
3.软件设计:利用Keil C编译软件进行51单片机的软件设计,根据控制芯片的指令集编写相应的程序代码,实现以下几个功能:-波形信号的产生:根据选择的波形类型(正弦波、方波、三角波或锯齿波),利用特定的算法生成相应形状的波形信号。
-参数调节:通过按键开关控制波形的频率、幅度以及相位等参数的调节,使波形发生器能够产生不同特性的波形信号。
-波形信号显示:通过LCD显示屏将生成的波形信号进行实时显示,以方便观察和调试。
4.软硬件的调试与优化:三、波形发生器的应用1.音频设备:波形发生器可以生成不同频率的正弦波信号,用于音频信号的发生和测试等应用。
基于单片机的数字存储示波器设计

ABS TRACT : r q e c aa me s r y tm s c mp s d o T8 C 1 a d p f h rl.b sn e b a d ,i i F e u n y d t- au e s s e i o o e f A 9 5 n e p e as y u i g k y o r s t s i u e o r aie t e s e e d t c urn ,p c s i g tr g a d d s l yn t te s me t ,u e s c n g t a d r c c s d t e l h c n a a a q i g z i o r e sn ,so n n ip a i g a h a i i me s r a e i ta - e k o l d e w ih i aa a q i d i o g r n e t n w e g h c t d t c r n a ln - a g i s u e me , rh r r , a e s o d b v - h w a p ia in u e s f t e mo u e i c n b h we y wa e s o p l t s,s r t c o pa a e p r i a h se f t e d t c u r g ,r c s ig  ̄r g a d d s ly n .T i y tm al d s l y t e s e e n t k a t n e c t p o h aa a q i n p o e sn ,s i n ipa i g h s s se c l ip a h c H i n
d t wt e a dsl i ut ̄ cuete sn nu hme r i t a A 8 C 1 oWe ne ol gri r・ a i sr l i a c c i eas r i Oeo g mo n i e l T 9 5  ̄ ed t a e t po a h i py r he y nr n r s
基于51单片机简易存储示波器的设计课件

A/D模块-转换器的主要技术指标4
(4) 实时采样
实时采样是在信号存在期间对其采样采样率必 须满足采样定理。对于正弦信号而言,每个周期内 应该超过二个采样点才能给出足够的信号细节,同 时也要考虑实际因素的影响,按照所采用的信号的 恢复方式选取相应的采样点数。实时采样中,A/D 转换器必须以高于最高采样率才能正确地工作,因 此 A/D 转换器的转换速率决定最高采样率。
A/D模块-转换器的主要技术指标5
处理过的模拟信号需要经过 A/D 转换器进行量 化编码。通常为了防止转换期间信号电压发生变化, 在进行 A/D 转换之前要加上采样保持电路。对于A/ D转换器参数的选取叶需要考虑多方面的因素,A/D 转换器的采样频率取决于待测信号的频率范围,或 者简易示波器对扫描速度的要求。而 A/D 转换器的 编码位数与垂直分辨率相关。根据两个条件选择合 适的A/D转换器芯片。
•方案二:单片机方式。
方案一:FPGA/CPLD或带有IP核的FPGA/CPLD方式
即用FPGA/CPLD完成采集,存储,显示及A/D,D/ A等功能,由IP核实现人机交互及信号测量分析等功 能。其优点在于系统结构紧凑,可以实现复杂测量 与控制,操作方便;缺点是此方案由纯硬件实现, 设计复杂,系统庞大,调试过程繁琐。
•80C51的微处理器 •80C51的片内存储器 •80C51的I/O口及功能单元 •80C51的特殊功能寄存器(SFR)
80C51的内部结构-微处理器
80C51单片机的微处理器是一个8位的高性能中 央处理器(CPU).它主要由运算器和控制器两部分 构成。它的作用是读入并分析每条指令,根据各指 令的功能控制单片机的各功能部件执行指定的运算 或操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCON=0x50; //串口工作在方式 1,异步模式 PCON=0x80; //波特率翻倍
TMOD=0x20; //定时器 1 工作在方式 2
TH1=0xff; //波特率 115200bps,单片机时钟晶振为 22.1184MHz
TL1=0xff;
TR1 = 1; //开启时钟
RI = 0; SEG_Q = 0xbf;//"-" SEG_B = 0xbf; SEG_S = 0xbf; SEG_G = 0xbf; } } 以上演示源程序 keil 工程请参考附件【串口调试 1】
这里我再介绍两款串口绘图软件【MyOsc】和【ComCalWave】,可以直接把串口接收到的数据 按 X-Y 轴绘图,显示结果更直观。
for(i=0;i<128;i++) { uart_put_uchar(dot[i%30]); delay_ms(1);//此处延时当于调节了采样率
} } } 用以上调试软件同样可以看到漂亮的正弦信号图形。 以上调试成功后,是不是感觉很棒,如果你是第一次亲自完成 ADC 将数据采集,再用软件绘图 显示还原信号波形图,一定是一件特别令人激动的事情。
第 6 页,共 34 页
2 图形液晶 LCD12864 绘图驱动设计基础
下面我们学习如何在 LCD12864 上显示同样的正弦波形。 关于 LCD 的硬件接口电路,在前面的教程中有详细介绍,涉及单片机总线知识和 CPLD 内部电 路,需要专门学习,这里我们借助现成的驱动函数,重点讲解 LCD 绘图程序设计。 LCD12864 的电路接口在【mini51b.h】头文件中定义。 #define LCD_LCW XBYTE[0xf4ea] //左屏命令写入 #define LCD_LDW XBYTE[0xf5ea] //左屏数据写入 #define LCD_LCR XBYTE[0xf6ea] //左屏命令读出 #define LCD_LDR XBYTE[0xf7ea] //左屏数据读出 #define LCD_RCW XBYTE[0xf8ea] //右屏命令写入 #define LCD_RDW XBYTE[0xf9ea] //右屏数据写入 #define LCD_RCR XBYTE[0xfaea] //右屏命令读出 #define LCD_RDR XBYTE[0xfbea] //右屏数据读出 后面所有对 LCD 的编程操作都是基于以上接口定义(总线编址)进行的读写操作。 首先来看 LCD 点阵结构图,这里以不带字库的 LCD12864 来讲解,如图 2-1 所示。
涉及 LCD 驱动问题,需要花费很大篇幅才能完成。 最初调试我们可以选用串口来做,借助他人现成的工具软件。下面介绍基于串口和上位机工具
软件的波形显示程序设计。
串口初始化函数 rs232_port_init(void)。 void rs232_port_init(void) //串口初始化
{
第 1 页,共 34 页
基于 Mini51 板硬件资源,构思数字示波器的方案已经思考很久了,总是没有集中的时间,一个 稍微复杂的设计完成创作需要集中的时间才能完成,这次利用学期结束的一段集中时间,完成了基 于 LCD12864 显示的数字示波器程序设计,现在将文档写出来供大家交流学习用。在此声明,这个 教程是写给初学者看的,我会从简单到复杂一步一步详细介绍设计过程,甚至是调试的过程,还包 括一些经验总结,特别是提供了完整的 keil 工程附件。希望读者立足示波器项目,学到更多关于软 硬件开发的一些经验技巧。
第 2 页,共 34 页
图 1-2 串口调试 ADC 调试 ADC 还有一种更方便的方法,结果直接在 Mini51 板上的数码管上显示出来,不管你对数 码管硬件熟悉不熟悉,只要使用模板程序提供的数码管驱动函数 led_disp(uint number)即可。 Mini51 板数码管驱动函数 led_disp(unsigned int)。 void led_disp(uint number) //Mini51 板数码管显示函数,传入整数 0~9999 {
unsigned char code tab1[20]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; unsigned char temp,flag=0; if(number < 10000) {
temp = number/1000%10; //千位数码管 if (temp) {
图 1-3 串口绘图软件示例
第 4 页,共 34 页
运行【ComCalWave】,选择正确的串口号和波特率,“Open COM”,再设置“Wave Show”,看 到了什么?图形!在图形窗口尝试用鼠标右键操作,还可选择特定范围显示,如图 1-4 所示。
图 1-4 串口绘图软件示例 2 要看到以上漂亮的波形,还有一些硬件连接要做,需要将信号发生器和 Mini51 板上 ADCin 接 口连接,注意,TLC1549 只能进行 0 到 5V 之间的信号转换,你还需要调整信号发生器,产生满足 条件的信号才行。 以上演示源程序 keil 工程请参考附件【串口调试 2】 实际在调试程序中,缺少必要硬件设备的,还可以用正弦表代替实际 ADC,这里再介绍一款正 弦表生成器软件【正弦表发生器】,软件界面如图 1-5 所示。
0x80,0x9a,0xb4,0xcb,0xdf,0xee,0xf9,0xff,0xff,0xf9, 0xee,0xdf,0xcb,0xb4,0x9a,0x80,0x65,0x4c,0x34,0x21, 0x11,0x6,0x0,0x0,0x6, 0x10,0x20,0x34,0x4b,0x65, }; void main() { unsigned char i; rs232_port_init(); delay_ms(1); while(1) {
主程序这样改: #include "mini51b.n" //所有与硬件相关的接口函数定义 #include "uart.h" void main() {
rs232_port_init(); read_adc(); delay_ms(1); while(1) {
uart_put_uchar(read_adc()/4); //seg7_disp(read_adc()); delay_ms(1); //这里的延时起到调节采样率的作用 } } 运行【MyOsc】,设置串口和波特率后“OPEN”,适当调节输入信号频率后可以看到如图 1-3 所 示的图案。
ADC_CK = 0;
temp <<= 1;
if(ADC_DA) temp++;
ADC_CK = 1;
}
ADC_CS = 1;
return(temp);
}
注:带背景色的源码都是直接从演示程序中拷贝的。
以上是是驱动 TLC1549 的函数,如果你还想彻底弄清 TLC1549 的各种参数,请参考数据手册 TLC1549.pdf,使用该函数需要注意的是,两次调用该函数之间的间隔要超过 21us,AD 转换是要一
图 1-1 简易数字示波器流程图
read_adc(void)。
unsigned int read_adc(void)
{
unsigned char i;
unsigned int temp=0; ADC_CS = 0; //开启控制电路,使能 DA 和 CK IO 引脚 for(i=0;i<10;i++) { //采集 10 次 ,即 10bit
while(1) {
if(uart_get_uchar()==0x55) uart_put_uchar(read_adc()/4); //10bit/4 变 8bit
}
}
在主程序循环中,接收到上位机下发的数据 0x55 后,读取 ADC 数据并发送一次,在串口调试
助手(例如 SSCOM)里,设置相关端口和波特率后,发送 0x55,注意 HEX(十六进制格式)选项, 就可以看到 ADC 的结果,如图 1-2 所示。
图 2-1 LCD 点阵分布结构图 此 LCD 屏由水平 128 列,垂直 64 行组成。水平 128 列分左右各 64 列两个半屏构成。垂直 64 行又分 8 页,每页 8 行(1 列 8 点刚好 1 字节)。程序每次对 LCD 的绘图操作就是以最小单位 1 字 节进行操作的。理解这点至关重要。也就是每次只能针对 8 点进行操作,而不是 1 点进行操作。左 右屏由单独地址线控制(前面的接口定义就是分左右屏定义的)。实际打点只需往指定“位置”写入 数据,“1”亮,“0”暗。 LCD 驱动函数:忙检测函数 void loop_lcd12864_is_busy(unsigned char right)。 void loop_lcd12864_is_busy(unsigned char right) {
图 1-5 正弦表发生器
第 5 页,共 34 页
【量化阶数】就是 ADC 位数,例如 tlc1549 是 10 阶,ADC0809 是 8 阶; 【采样点数】就是在一个正弦周期内,均匀分布多少个采样点,例如在 128 点的 lcd 上显示 2 个以上周期的话,采样点数要小于 64 点,这里选用 30 点数来举例,源程序如下。 #include "mini51b.h" //所有与硬件相关的接口函数定义 #include "uart.h" unsigned char code dot[30]={ //正弦表,注意数据类型是“code”,存放在 rom 当中
便。有了以上 4 个函数,再建一个 keil 工程,添加一个主函数,就可以演示了。
#include "mini51b.h" //所有与硬件相关的接口函数定义
#include "uart.h"