键盘控制的多种波形发生器要点.docx

上传人:b****3 文档编号:4592788 上传时间:2022-12-07 格式:DOCX 页数:21 大小:396.34KB
下载 相关 举报
键盘控制的多种波形发生器要点.docx_第1页
第1页 / 共21页
键盘控制的多种波形发生器要点.docx_第2页
第2页 / 共21页
键盘控制的多种波形发生器要点.docx_第3页
第3页 / 共21页
键盘控制的多种波形发生器要点.docx_第4页
第4页 / 共21页
键盘控制的多种波形发生器要点.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

键盘控制的多种波形发生器要点.docx

《键盘控制的多种波形发生器要点.docx》由会员分享,可在线阅读,更多相关《键盘控制的多种波形发生器要点.docx(21页珍藏版)》请在冰豆网上搜索。

键盘控制的多种波形发生器要点.docx

键盘控制的多种波形发生器要点

 

课程设计量化评分标准

 

指标

最高分

评分要素

评分

方案设计

35

方案选择合理,分析、设计正确,原理清楚,电路、程序流程图清晰,结构合理,程序简洁、正确。

 

 

调试

15

过程清晰,调试方案设计合理,测试点选择适当,程序编写正确,调试步骤清楚。

 

结果

20

电路和程序运行结果正确,达到预期效果。

 

 

设计报告

20

报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出,报告完全符合规范化要求,用计算机打印成文。

 

工作态度

10

工作态度认真,按时完成设计任务,是否独立完成。

 

 

总评成绩

 

 

设计题目:

键盘控制的多种波形发生器

 

摘要

本文以STC89C52单片机为核心设计了一个低频函数信号发生器。

信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、三角波、三角波、方波和其他任意波形。

本系统以单片机AT89S51为系统的控制核心,结合D/A转换芯片DAC0832设计一个简易低频信号源的设计,通过CH451外接键盘控制选择多种波形发生,用示波器观察输出波形。

关键词:

信号源   STC89C52 DAC0832  CH451

 

一、要求

1、单片机产生多种波形

2、键盘控制选择波形发生(三角波、锯齿波、正弦波、方波)

 

二、设计分析

2.1设计思路

波形发生器设计思路框图如下所示。

波形的产生是通过AT89S51执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。

图1设计思路框图

(1)主控模块

采用ATMEL公司生产的STC89C52单片机作为系统的控制器。

51系列的单片机的使用简单,软件编程灵活。

自由度大,可用软件编程实现各种算法和逻辑控制,并且功耗低、体积小、技术成熟和成本低。

(3)波形产生模块

DAC0832芯片是8位并行、中速(建立时间1us)、CMOS工艺制造的8位单片D/A转,DAC0832换器转换控制容易等优点,在单片机应用系统中得到了广泛的应用。

由于DAC0832输出为电流量,而波形最终需要转换为电压量来显示波形幅度,所以在DAC0832电路后接I/V转换电路,在这里采用LM324集成运放来实现电流/电压的转换。

(4)按键控制模块

可使用矩阵键盘来控制单片机,使用矩阵键盘可使电路的功能大大的提高,同时在单片机编程设计上也会相应困难,可以使用专用芯片CH451通过串口与单片机相连,只需占用单片机少量引脚,这样设计变的更合理。

在一些简单的控制上,就不用使用矩阵键盘的控制了。

2.3设计流程图

主程序设计流程图如图2所示:

图2设计流程框图

子程序设计流程如图3所示:

方波

S4是否

按下?

图3子程序设计流程框图

三、设计思路和模块

3、1控制芯片

设计中主要采用STC89C52型单片机,它具有如下优点:

(1)拥有完善的外部扩展总线,通过这些总线可方便地扩展外围单元、外围接口等。

(2)该单片机内部拥有4K字节的FLASHROM程序存储器空间和256字节的RAM数据存储空间,完全可以满足程序的要求。

由于该芯片可电擦写,故可重复使用。

如果更改程序内容,可将芯片拿下重新烧写。

(3)该单片机与工业标准的MCS-51型机的指令集和输出引脚兼容。

中断系统是使处理器具有对外界异步事件的处理能力而设置的。

当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。

时钟电路。

由于频率较大时,三角波、正弦波、方波等波中每一点延时时间为几微秒,故延时时间还要加上指令时间即可得到指定频率的波形,该电路用11.0592MHz晶振。

图1.1STC89C52的内部结构图

3、2数/模转换电路

由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。

DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以和输入控制电路四部分组成。

但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。

DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。

根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:

直通方式、单缓冲方式和双缓冲方式。

本设计选用直通方式。

DAC0832的数据口和单片机的P0口相连。

CSDA:

片选信号输入线(选通数据锁存器),低电平有效;

WR:

数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。

由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;

图2、1DA转换电路

3、3键盘控制电路

3、3、1、CH451的引脚和功能

CH451是一个整合了数码管显示驱动和键盘扫描控制以和μP监控的多功能外围芯片。

CH451内置RC振荡电路,可以直接动态驱动8位数码管或64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。

CH451内置大电流驱动级,段电流不小于30mA,字电流不小于160mA,并有16级亮度控制功能;在键盘控制方面,该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能;在外部接口方面,CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位两种输出,同时内置看门狗电路Watch-Dog。

CH451提供有28引脚的DIP28与SOP28封装以和DIP24封装形式,28脚与24脚在功能上稍有差别,24的引脚定义如表表3、1所列。

 

表3、1CH451的DIP24封装形式的引脚定义

引脚号

名称

类型

说明

2

VCC

电源

正电源端,持续电流不小于200mA

15

GND

电源

公共接地端,持续电流不小于200mA

4

LOAD

输入

串行接口的数据加载,内置上拉电阻

5

DIN

输入

串行接口的数据输入,内置上拉电阻

3

DOUT

输出

串行接口的数据输出和键盘中断

6

DCLK

输入

串行接口的数据时钟,内置上拉电阻同时用于看门狗的清除输入

1、24~18

SEG7~SEG0

三态输出/输入

数码管的段驱动,高电平有效,键盘扫描输入,高电平有效,内置下拉

7~14

DIG7~DIG0

输出

数码管的字驱动,低电平有效,键盘扫描输出,高电平有效

16

RES

输出

上电复位和看门狗复位,高电平有效

17

N.C.

空脚

未使用,禁止连接

表3、2CH451外接矩阵键盘的按键代码表

按键代码

DIG7

DIG6

DIG5

DIG4

DIG3

DIG2

DIG1

DIG0

SEG0

47H

46H

45H

44H

43H

42H

41H

40H

SEG1

4FH

4EH

4DH

4CH

4BH

4AH

49H

48H

SEG2

57H

56H

55H

54H

53H

52H

51H

50H

SEG3

5FH

5EH

5DH

5CH

5BH

5AH

59H

58H

SEG4

67H

66H

65H

64H

63H

62H

61H

60H

SEG5

6FH

6EH

6DH

6CH

6BH

6AH

69H

68H

SEG6

77H

76H

75H

74H

73H

72H

71H

70H

SEG7

7FH

7EH

7DH

7CH

7BH

7AH

79H

78H

 

图3、1CH451控制键盘电路图

3、4调试说明

STC89C52试验箱板图以和区域划分如图3、1所示。

主要由复位、晶振电路、蜂鸣器、开关、16个发光二极管LED、脉冲发生电路、8155扩展(包括七段LED显示和4*4键盘等)、A/D扩展、D/A扩展、温度传感器、日时钟、16*16的LED点阵、CH451键盘和七段LED扩展、字符LCD、点阵LCD、RS232/485串口等组成,用户可以单独使用每个部分,也可根据实际需要进行不同的组合,以实现功能复杂的系统,本次课程设计还要外加示波器观察波形:

图3、1STC89C52实验箱的俯视图

3、5设计结果和错误分析

3、5、1可以通过键盘控制选择三角波、方波、锯齿波、矩形波的输出,用示波器观察。

3、5、2程序运行没错,但是下载之后没效果,检查之后发现是实验箱上的入口地址没定义。

3、5、3键盘控制不能实现,仔细检查之后发现键盘编码没有对应相应按键,修改之后可以实现。

3、5、4输出波形有点失真,三角波顶部出现一小部分平的失真,检查之后是送入数组有问题,通过送入的数据连续递增和连续递减之后数组有问题,不能用一个数组通过递增递减来实现,之后生成了其他几种波形数组送入DA0832,能产生连续波形。

 

四、总结

基于单片机的信号发生器设计,这个信号发生器的设计中涉和到一个典型的控制过程。

通过单片机控制一个模数转换器DAC0832产生所需要的电流,然后使用运算放大器LM741可以将其电流输出线性地转换成电压输出。

通过程序的控制,可以产生一系列有规律的波形。

这样一个信号发生装置在控制领域有相当广泛的应用范围。

最终做出来的信号发生器满足了题目中的所有要求:

1.产生四种波形。

正弦波、三角波、矩形波、锯齿波。

2.幅度可调,峰峰值在0——5V之间变化。

信号发生器可以生成更多的波形,只需要再加些波形表即可。

在这里得感谢学校为我们提供个这样一个实践的机会,当然还得感谢实验室指导老师们的细心指导。

 

附录一原理图

1、1单片机最小系统原理图

 

1、2DA转换原理图

1、3键盘控制原理图

 

1、4实验箱总体原理图实物图

 

附录二程序清单

 

//**************头文件包含模块****************

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

//*************CH451键盘头文件定义模块*******

#definech451_rest0x0201//复位

#definech451_leftmov0x0300//设置移位方式-左移

#definech451_leftcyc0x0301//设置移位方式-左循

#definech451_rightmov0x0302//设置移位方式-右移

#definech451_rightcyc0x0303//设置移位方式-右循

#definech451_dispkeydog_off0x0400//关显示、键盘、看门狗

#definech451_disp_on0x0401//开显示

#definech451_dispkey_on0x0403//开显示、键盘

#definech451_dispkey_dog0x0407//开显示、键盘、看门狗功能

#definech451_dispmode_160x0500//设置默认显示方式:

16进制

#definech451_dispmode_bcd0x0580//设置BCD译码方式

#definech451_twinkle0x0600

//设置闪烁控制、低8位分别对应8个LCD,高电平闪烁,低电平不闪烁

#definech451_dig00x0800//数码管0显示

#definech451_dig10x0900//数码管1显示

#definech451_dig20x0a00//数码管2显示

#definech451_dig30x0b00//数码管3显示

#definech451_dig40x0c00//数码管4显示

#definech451_dig50x0d00//数码管5显示

#definech451_dig60x0e00//数码管6显示

#definech451_dig70x0f00//数码管7显示

#definenop0x000//空操作

sbitch451_dclk=P1^0;//串行数据上升延激活

sbitch451_din=P1^1;//串行数据输出、接451的数据输入

sbitch451_load=P1^2;//串行数据加载、上升延激活

sbitch451_dout=P1^3;//串行数据输入、接451的数据输出

unsignedcharch451_key;//存放键盘中断读取的键值

unsignedcharDisp_buff[]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};

//全部灭

voidch451_init(void);

voidch451_write(unsignedintdata0);//写命令和数据

voidch451_Enable(void);//使能451

voidch451_Dispkey_enable(void);//显示451显示和按键功能

voidDelay_ms(unsignedcharn);

unsignedcharch451_key_read(void);

voidch451_led_write(unsignedchar*p);

uchartabArry[4];//保存显示数据

charflag=1;//按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下

intkeycount=0;//按键计数

ucharwaveth,wavetl;//用于对定时器付值

uintfrecount=100;//频率计数

uintmbjs;//码表计数,共采32个点

sbitW=P3^6;

//*************程序模块**********************

//=============正弦波数据====================

ucharcodesin_tab[256]=

{

0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,

0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,

0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,

0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,

0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,

0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,

0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,

0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,

0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,

0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,

0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,

0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,

0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c,};

//===========三角波信号数据表================

ucharcodethr_tab[32]=

{

0x00,0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f,0xaf,0xbf,0xcf,0xdf,0xef,

0xff,0xef,0xdf,0xcf,0xbf,0xaf,0x9f,0x8f,0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f

};

//===========锯齿波信号数据表================

ucharcodejc_tab[33]=

{

0x00,0x08,0x0f,0x18,0x1f,0x28,0x2f,0x38,0x3f,0x48,0x4f,0x58,0x5f,0x68,0x6f,0x78,

0x7f,0x88,0x8f,0x98,0x9f,0xa8,0xaf,0xb8,0xbf,0xc8,0xcf,0xd8,0xdf,0xe8,0xef,0xf8,

0xff};

 

//**********毫秒延时程序********************

voiddelayms(intms)

{

uchari;

while(ms--)

{

for(i=250;i>0;i--);

}

}

//********定时器函数*********************

voidTimerinit()

{

TMOD=0x01;//定时器0方式1

//定时器初值计算公式:

X=65536-(T/T0)=65536-(f0/f/32)

TH0=waveth=(65536-57603/frecount)/256;//定时器初值22.1184MHz

TL0=wavetl=(65536-57603/frecount)%256;

EA=1;//开总中断

ET0=1;//开定时器0中断

TR0=1;//定时器0开始计数

}

//**********主函数************************

voidmain()

{

unsignedchari;

Timerinit();//定时器初始化

W=0;

while

(1)

{

 

if(ch451_dout)//如果没有按键、out有效是一短暂脉冲

{

ch451_led_write(Disp_buff);

}//如果没有按键

else

{

ch451_key=ch451_key_read();//读取按键代码

for(i=7;i>0;i--)

{

Disp_buff[i]=Disp_buff[i-1];

}

Disp_buff[0]=ch451_key;

ch451_key=ch451_key_read();//读取按键代码

//===========波形选择==================

switch(ch451_key)

{

case71:

P1=jc_tab[mbjs];//输出锯齿波

mbjs++;

if(mbjs>=32)

{

mbjs=0;

}

case70:

P1=sin_tab[mbjs];//输出正弦波

mbjs+=8;//256点,每隔8点输出一个数据

if(mbjs>=256)

{

mbjs=0;

}

case69:

P1=thr_tab[mbjs];//输出三角波

mbjs++;

if(mbjs>=32)

{

mbjs=0;

}

case68:

//输出方波

mbjs++;

if(mbjs>=32)

{

mbjs=0;

}

elseif(mbjs<16)

P1=0xff;

elseP1=0x00;

}

}

}

}

 

//*************CH451键盘控制模块函数*****************

voidch451_init(void)

{

ch451_write(ch451_rest);

ch451_Enable();

ch451_Dispkey_enable();

ch451_dout=1;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1