键盘控制的多种波形发生器_第1页
键盘控制的多种波形发生器_第2页
键盘控制的多种波形发生器_第3页
键盘控制的多种波形发生器_第4页
键盘控制的多种波形发生器_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、键盘控制多种波形发生器课程设计课程设计量化评分标准 指标最高分评分要素评分方案设计35方案选择合理,分析、设计正确,原理清楚,电路、程序流程图清晰,结构合理,程序简洁、正确。  调试15过程清晰,调试方案设计合理,测试点选择适当,程序编写正确,调试步骤清楚。 结果20电路及程序运行结果正确,达到预期效果。  设计报告20报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出,报告完全符合规范化要求,用计算机打印成文。 工作态度10工作态度认真,按时完成设计任务,是否独立完成。  总 评 成 绩

2、 指导老师评语:设计题目: 键盘控制的多种波形发生器摘要本文以STC89C52单片机为核心设计了一个低频函数信号发生器。信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、三角波、三角波、方波及其他任意波形。 本系统以单片机AT89S51为系统的控制核心,结合D/A转换芯片DAC0832设计一个简易低频信号源的设计,通过CH451外接键盘控制选择多种波形发生,用示波器观察输出波形。关键词:信号源    STC89C52  DAC0832   CH451 一、 要求1、单片机产生多种波形2

3、、键盘控制选择波形发生(三角波、锯齿波、正弦波、方波) 二、 设计分析2.1 设计思路波形发生器设计思路框图如下所示。波形的产生是通过AT89S51 执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。 单片机控制系统Ch451键盘控制模块DAC0832波形输出电路复位、振荡电路I/V转换放大电路 图1 设计思路框图(1)主控模块采用ATMEL公司生产的STC89C52单片机作为系统的控制器。51系列的单片机的使用简单,软件编程灵活。自由度大,可用软件编程实现各种算法和逻辑控制,并且功耗低、体积小、技术成熟和成本低。(3) 波形产生

4、模块DAC0832芯片是8位并行、中速(建立时间1us)、CMOS工艺制造的8位单片D/A转,DAC0832换器转换控制容易等优点,在单片机应用系统中得到了广泛的应用。由于DAC0832输出为电流量,而波形最终需要转换为电压量来显示波形幅度,所以在DAC0832电路后接I/V转换电路,在这里采用LM324集成运放来实现电流/电压的转换。(4) 按键控制模块可使用矩阵键盘来控制单片机,使用矩阵键盘可使电路的功能大大的提高,同时在单片机编程设计上也会相应困难, 可以使用专用芯片CH451通过串口与单片机相连,只需占用单片机少量引脚,这样设计变的更合理。在一些简单的控制上,就不用使用矩阵键盘的控制了

5、。 2.3 设计流程图主程序设计流程图如图2所示:开始初始化按键扫描程序按键处理程序波形输出 结束图2 设计流程框图子程序设计流程如图3所示:方波 S4是否 按下?是否有键按下S1是否按下?S2是否按下?S3是否按下?正弦波三角波锯齿波结束图3 子程序设计流程框图三、 设计思路及模块3、1 控制芯片设计中主要采用STC89C52型单片机,它具有如下优点:(1)拥有完善的外部扩展总线,通过这些总线可方便地扩展外围单元、外围接口等。(2)该单片机内部拥有4K字节的FLASH ROM程序存储器空间和256字节的RAM数据存储空间,完全可以满足程序的要求。由于该芯片可电擦写,故可重复使用。如果更改程序

6、内容,可将芯片拿下重新烧写。(3)该单片机与工业标准的MCS51型机的指令集和输出引脚兼容。中断系统是使处理器具有对外界异步事件的处理能力而设置的。当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。时钟电路。由于频率较大时,三角波、正弦波、方波等波中每一点延时时间为几微秒,故延时时间还要加上指令时间即可得到指定频率的波形,该电路用11.0592MHz晶振。图1.1 STC89C52的内部结构图3、2 数/模转换电路由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易

7、并具有8位分辨率的数模转换器DAC0832。DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。本设计选用直通方式。DAC0832的数据口和单片机的P0口相连。CSDA:片选信号输入线(选通数据锁存器),低电平有效;WR:数据锁存器写选通输入线,负脉冲(脉宽

8、应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存; 图2、1 DA转换电路3、3 键盘控制电路3、3、1、CH451的引脚和功能CH451是一个整合了数码管显示驱动和键盘扫描控制以及P监控的多功能外围芯片。CH451内置RC振荡电路,可以直接动态驱动8位数码管或64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。CH451内置大电流驱动级,段电流不小于30mA,字电流不小于160mA,并有16级亮度控制功能;在键盘控制方面,该器件内置64

9、键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能;在外部接口方面,CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位两种输出,同时内置看门狗电路Watch-Dog。CH451提供有28引脚的DIP28与SOP28封装以及DIP24封装形式,28脚与24脚在功能上稍有差别,24的引脚定义如表表3、1所列。 表3、1 CH451的DIP24封装形式的引脚定义引脚号名称类型说明2VCC电源正电源端,持续电流不小于200mA15GND电源公共接地端,持续电流不小于200mA4LOAD输入串行

10、接口的数据加载,内置上拉电阻5DIN输入串行接口的数据输入,内置上拉电阻3DOUT输出串行接口的数据输出和键盘中断6DCLK输入串行接口的数据时钟,内置上拉电阻同时用于看门狗的清除输入1、2418SEG7SEG0三态输出/输入数码管的段驱动,高电平有效,键盘扫描输入,高电平有效,内置下拉714DIG7DIG0输出数码管的字驱动,低电平有效,键盘扫描输出,高电平有效16RES输出上电复位和看门狗复位,高电平有效17N.C.空脚未使用,禁止连接 表3、2 CH451外接矩阵键盘的按键代码表按键代码DIG7DIG6DIG5DIG4DIG3DIG2DIG1DIG0SEG047H46H 45H44H43

11、H42H41H40HSEG14FH4EH4DH4CH4BH4AH49H48HSEG257H56H 55H54H53H52H51H50HSEG35FH5EH5DH5CH5BH5AH59H58HSEG467H66H 65H64H63H62H61H60HSEG56FH6EH6DH6CH6BH6AH69H68HSEG677H76H 75H74H73H72H71H70HSEG77FH7EH7DH7CH7BH7AH79H78H 图3、1 CH451控制键盘电路图 3、4调试说明 STC89C52试验箱板图以及区域划分如图3、1所示。主要由复位、晶振电路、蜂鸣器、开关、16个发光二极管LED、脉冲发生电路、

12、8155扩展(包括七段LED显示和4*4键盘等)、A/D扩展、D/A扩展、温度传感器、日时钟、16*16的LED点阵、CH451键盘和七段LED扩展、字符LCD、点阵LCD、RS232/485串口等组成,用户可以单独使用每个部分,也可根据实际需要进行不同的组合,以实现功能复杂的系统,本次课程设计还要外加示波器观察波形:电源开关电源指示灯复位开关蜂鸣器RS232串口485串口16*16LED点阵时钟CH451键盘及LED控制区按键区A/D转换区D/A转换区8155扩展区时钟源区发光二极管区点阵、字符LCD区STC89c52图3、1 STC89C52实验箱的俯视图3、5 设计结果及错误分析3、5、

13、1 可以通过键盘控制选择三角波、方波、锯齿波、矩形波的输出,用示波器观察。3、5、2 程序运行没错,但是下载之后没效果,检查之后发现是实验箱上的入口地址没定义。3、5、3 键盘控制不能实现,仔细检查之后发现键盘编码没有对应相应按键,修改之后可以实现。3、5、4 输出波形有点失真,三角波顶部出现一小部分平的失真,检查之后是送入数组有问题,通过送入的数据连续递增和连续递减之后数组有问题,不能用一个数组通过递增递减来实现,之后生成了其他几种波形数组送入DA0832,能产生连续波形。四、 总结基于单片机的信号发生器设计,这个信号发生器的设计中涉及到一个典型的控制过程。通过单片机控制一个模数转换器DAC

14、0832产生所需要的电流,然后使用运算放大器LM741可以将其电流输出线性地转换成电压输出。通过程序的控制,可以产生一系列有规律的波形。这样一个信号发生装置在控制领域有相当广泛的应用范围。最终做出来的信号发生器满足了题目中的所有要求:1.产生四种波形。正弦波、三角波、矩形波、锯齿波。 2.幅度可调,峰峰值在05V之间变化。 信号发生器可以生成更多的波形,只需要再加些波形表即可。在这里得感谢学校为我们提供个这样一个实践的机会,当然还得感谢实验室指导老师们的细心指导。附录一原理图 1、1 单片机最小系统原理图1、2 DA转换原理图1、3 键盘控制原理图1、4 实验箱总体原理图实物图 电源开关电源指

15、示灯复位开关蜂鸣器RS232串口485串口16*16LED点阵时钟CH451键盘及LED控制区按键区A/D转换区D/A转换区8155扩展区时钟源区发光二极管区点阵、字符LCD区STC89c52附录二程序清单 /*头文件包含模块* #include <reg51.h> #include<intrins.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int /*CH451键盘头文件定义模块* #define ch451_rest 0x0201 /复位 #define

16、 ch451_leftmov 0x0300 /设置移位方式-左移 #define ch451_leftcyc0x0301/设置移位方式-左循 #define ch451_rightmov0x0302 /设置移位方式-右移 #define ch451_rightcyc 0x0303 /设置移位方式-右循 #define ch451_dispkeydog_off 0x0400 /关显示、键盘、看门狗 #define ch451_disp_on 0x0401 /开显示 #define ch451_dispkey_on 0x0403 /开显示、键盘 #define ch451_dispkey_dog

17、0x0407 /开显示、键盘、看门狗功能 #define ch451_dispmode_16 0x0500 /设置默认显示方式:16进制 #define ch451_dispmode_bcd 0x0580 /设置BCD译码方式 #define ch451_twinkle 0x0600 /设置闪烁控制、低8位分别对应8个LCD,高电平闪烁,低电平不闪烁 #define ch451_dig0 0x0800 / 数码管0显示 #define ch451_dig1 0x0900 / 数码管1显示 #define ch451_dig2 0x0a00 / 数码管2显示 #define ch451_dig3

18、 0x0b00 / 数码管3显示 #define ch451_dig4 0x0c00 / 数码管4显示 #define ch451_dig5 0x0d00 / 数码管5显示 #define ch451_dig6 0x0e00 / 数码管6显示 #define ch451_dig7 0x0f00 / 数码管7显示 #define nop 0x000 /空操作 sbit ch451_dclk=P10; /串行数据上升延激活 sbit ch451_din=P11; /串行数据输出、接451的数据输入 sbit ch451_load=P12; /串行数据加载、上升延激活 sbit ch451_dout

19、=P13; /串行数据输入、接451的数据输出 unsigned char ch451_key;/存放键盘中断读取的键值 unsigned char Disp_buff=0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10; /全部灭 void ch451_init(void); void ch451_write(unsigned int data0); /写命令和数据 void ch451_Enable(void);/使能451 void ch451_Dispkey_enable(void);/显示451显示和按键功能 void Delay_ms(unsigned

20、char n); unsigned char ch451_key_read(void); void ch451_led_write(unsigned char *p); uchar tabArry4; /保存显示数据char flag=1; /按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下int keycount=0; /按键计数uchar waveth,wavetl; /用于对定时器付值uint frecount=100; /频率计数uint mbjs; /码表计数,共采32个点 sbit W=P36;/*程序模块*/=正弦波数据= uchar code sin_ta

21、b256= 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,

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

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

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

25、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, 0x

26、7c, ; /=三角波信号数据表=uchar code thr_tab32= 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; /=锯齿波信号数据表=uchar code jc_tab33= 0x00,0x08,0x0f,0x18,0x1f,0x28,0x2f,0x38,0x3f,0x48,0x4f,0x58,0x5f,0x

27、68,0x6f,0x78, 0x7f,0x88,0x8f,0x98,0x9f,0xa8,0xaf,0xb8,0xbf,0xc8,0xcf,0xd8,0xdf,0xe8,0xef,0xf8,0xff;/*毫秒延时程序*void delayms(int ms) uchar i; while(ms-) for(i=250;i>0;i-); /*定时器函数*void Timerinit() TMOD=0x01; /定时器0方式1 /定时器初值计算公式:X=65536-(T/T0)=65536-(f0/f/32) TH0=waveth=(65536-57603/frecount)/256; /定时

28、器初值 22.1184MHz TL0=wavetl=(65536-57603/frecount)%256; EA=1; /开总中断 ET0=1; /开定时器0中断 TR0=1; /定时器0开始计数/*主函数* void main() unsigned char i; 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-)

29、 Disp_buffi=Disp_buffi-1; Disp_buff0=ch451_key; ch451_key=ch451_key_read(); /读取按键代码 /=波形选择= switch(ch451_key) case 71: P1 = jc_tabmbjs;/输出锯齿波 mbjs+; if(mbjs>=32) mbjs=0; case 70: P1 = sin_tabmbjs;/输出正弦波 mbjs+=8; /256点,每隔8点输出一个数据 if(mbjs>=256) mbjs=0; case 69: P1 = thr_tabmbjs; /输出三角波 mbjs+; if

30、(mbjs>=32) mbjs=0; case 68: /输出方波 mbjs+; if(mbjs>=32) mbjs=0; else if(mbjs<16) P1=0xff; else P1=0x00; /*CH451键盘控制模块函数* void ch451_init(void) ch451_write(ch451_rest); ch451_Enable(); ch451_Dispkey_enable(); ch451_dout=1; /*输出命令程序* void ch451_write(unsigned int command) unsigned char i; ch451_load=0; /命令开始 for(i=0;i<12;i+) /送入12为数据、低位在前 ch451_din=command&1;ch451_dclk=0;command>>=1;ch45

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论