课程设计--基于51单片机的信号发生器的设计.doc_第1页
课程设计--基于51单片机的信号发生器的设计.doc_第2页
课程设计--基于51单片机的信号发生器的设计.doc_第3页
课程设计--基于51单片机的信号发生器的设计.doc_第4页
课程设计--基于51单片机的信号发生器的设计.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

通信工程学院课程设计说明书题 目 信号发生器的设计 课 程 名 称 单片机原理及应用A 专 业 电子信息工程 目 录一、课程设计目的二、课程设计任务三、课程设计要求四、课程设计思路五、课程设计软件仿真结果截图六、课程设计体会七、主要参考文献八、附录:源程序代码1、 课程设计目的:在学习单片机原理及应用A课程的基础上,进一步深入理解MCS-51单片机的结构、工作原理和应用技术,提高单片机控制系统设计、研发的能力;按照教学计划的要求,利用一周时间,综合应用所学知识,设计具有一定功能的小型单片机控制系统,培养学生一定的自学能力和独立分析问题、解决问题的能力,要求学生能通过独立思考、查阅工具书、参考文献,提出自己的设计方案,找出设计中遇到问题的解决途径。2、 课程设计要求:1、整个课程设计的各个环节都要自己动手。2、通过TLC5615串行D/A转换芯片完成信号发生器设计,经由示波器观察信号波形;3、采用C语言编程实现; 4、其他要求参见“nKDE-51单片机实验教学系统实验指导书;5、基本任务为必做项目,附加任务为选做项目;6、对课程设计进行总结,撰写课程设计说明书。三、课程设计任务:1、基本任务:利用nKDE-51单片机实验教学系统上的硬件资源,实现信号发生器的功能。2、附加任务:通过键盘(1)选择输出信号的波形; (2)调整幅度、频率等参数。3、工作量要求:(1)设计的硬件电路图与程序流程图; (2)源程序代码; (3)系统运行结果符合课程设计要求。四、课程设计思路:TLC56151、TLC5615芯片结构:引脚功能:DIN:串行数据输入端 OUT SCLK SCLK:串行时钟输入端 REFin CS CS:片选端,低电平有效 DIN OUT:DAC模拟电压输出端 DOUT REFin:基准输入端2、TLC5615芯片工作原理:TLC5615由16位转换寄存器、控制逻辑、10位DAC寄存器、上电复位、DAC、外部基准放大器、基准电压倍增器等部分组成。TLC5615通过固定增益为2 的运放缓冲电阻串接网络,把10位数字数据转换成模拟电压。上电时,内部电路吧10DAC寄存器复位至全0,其输出具有与基准输入相同的极性。(1)数据输入。由于DAC是12位寄存器,所以在写入10位数据后,最低2位写入2个“0”。(2)输出缓冲器。输出缓冲器具有满电源电压幅度输出,它带有短路保护并能驱动有100pF负载电容的2k负载。(3)外部基准。外部基准电压输入经过缓冲,使得DAC输入电阻与代码无关。因此,REFin的输入电阻为10M,输入电容典型值为5pF,它们与输入代码无关。基准电压决定DAC的满度输出。(4)逻辑接口。逻辑输入端可使用TTL或CMOS逻辑电平。使用满电源电压幅度时,CMOS逻辑可得到最小的功耗。使用TTL逻辑电平是,功耗需求增加约2倍。(5)串行时钟和更新速率。TLC5615的最大串行时钟频率近似为14MHz。通常,数字更新速率受片选周期的限制。对于满度输入阶跃跳变,10位DAC的建立时间约为12.5s,这把更新频率限制在80KHz。当片选信号为低电平时,输入数据读入16bit移位寄存器。SCLK输入的上升沿把数据移入输入寄存器,接着,CS的上升沿把数据传送至DAC寄存器,当CS为高电平时,输入的数据不能由时钟同步送入输入寄存器。所有CS的跳变应发生在SCLK输入为低电平时。DIN只需要输入12位数据,DIN输入的12位数据中,前10位为TLC5615输入的D/A转换数据,并且输入时,高位在前,低位在后,后2位必须写入为0的2位数值,因为TLC5615的DAC输入锁存器为12位宽。3、 总流程图:开始键盘扫描(确定是否改变频率、幅度)检测按键,确定输出波形4、 程序编译及软件仿真电路原理图:元器件列表:元器件名称所属类型AT89C51Microprocessor ICSCRYSTAL 晶振MisecllaneousCAP 电容CapacitorRESPACK-8ResistorCAP电容CapacitorSWITCH按键Switches&relaysTLC5615C(L)DData ConvertersLM016L液晶显示Display五、课程设计软件仿真结果截图:1、按下三角波键示波器输出三角波,同时液晶屏上显示“san jiao bo”2、 按下“锯齿波”键示波器输出三角波,同时液晶屏上显示“ju chi bo”3、 按下“方波”键示波器输出三角波,同时液晶屏上显示“fang bo”4、 按下“正弦波”键示波器输出三角波,同时液晶屏上显示“sine”5、 当无任何键按下时示波器输出直线,同时液晶屏上显示“wave” 6、显示字符“三”:6、 课程设计体会:本次课程设计我做的是信号发生器,参考相关书籍和老师给的程序,很快就把三角波、锯齿波、方波、正弦波四种波形显示出来了。后面就是波形显示切换和在液晶屏上显示对应波形说明的问题。在老师同学和自己的努力下,在原程序上利用IF语句和SWITCH语句实现了波形按键切换功能,即想要显示方波按下“方波”键即可。另外我们这组还在LCM 1602液晶屏上显示出了汉字,通过参考资料加上自己对汉字显示原理的理解,最终在液晶屏上显示出汉字“三”,虽然只是简单的“三”,但是过程是相当不容易。这次课程设计很有趣,让我实实在在收获了不少东西,知道了DA转换和LCM1602显示的原理,尤其是在LCM 1602汉字的显示原理。这次课程设计也提高了我的编程能力和同学的合作能力。7、 主要参考文献:1、nKDE51单片机实验教学系统实验指导书南京邮电大学,2011年2、单片机原理与应用及C51程序设计(第2版),谢维成等编著,清华大学出版社,2009年3、单片机原理及应用(第2版),李建忠,西安电子科技大学出版社,2008年4、基于protues的51系列单片机设计与仿真侯玉宝 陈忠平 李成群等编著,电子工业出版社八、源程序代码: LCM1602.H#ifndef LCM1602_h#define LCM1602_h#define BUSYFLAG0x80#define BLINK0x01#define NOBLINK0x00unsigned char LCMReadState(void);void LCMDelay(int);void LCMWriteCmd(unsigned char);void LCMWriteData(unsigned char);void LCMClear(void);void LCMInit(void);void LCMGotoXY(unsigned char,unsigned char);void LCMDisplayChar(unsigned char,unsigned char,unsigned char);void LCMDisplayString(unsigned char,unsigned char,unsigned char*);void LCMBlink(unsigned char,unsigned char,unsigned char);#endifBOXING.H#include #include #include #include #define OSC22118400#define BAUDRATE9600sbitDIN = P14; /串行数据输入端sbitSCK = P15; /串行时钟输入端sbitCS = P16; /DA片选端sbit S0= P20; / 三角波sbit S1= P21; /锯齿波sbit S2= P22; /方波波sbit S3= P23;/正弦波 /正弦波unsigned char code type256= 0x80,0x83,0x86,0x89,0x8c,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xeb,0xed,0xef,0xf0,0xf1,0xf3,0xf4,0xf5,0xf6,0xf8,0xf9,0xfa,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xfa,0xf9,0xf8,0xf6,0xf5,0xf4,0xf3,0xf1,0xf0,0xef,0xed,0xeb,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8c,0x89,0x86,0x83,0x80,0x7d,0x7a,0x77,0x74,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,0x4d,0x4a,0x47,0x44,0x41,0x3f,0x3c,0x39,0x37,0x34,0x32,0x2f,0x2d,0x2b,0x28,0x26,0x24,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0f,0x0d,0x0c,0x0b,0x0a,0x08,0x07,0x06,0x06,0x05,0x04,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x0a,0x0b,0x0c,0x0d,0x0f,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2b,0x2d,0x2f,0x32,0x34,0x37,0x39,0x3c,0x3f,0x41,0x44,0x47,0x4a,0x4d,0x4f,0x52,0x55,0x58,0x5b,0x5e,0x61,0x64,0x67,0x6a,0x6d,0x70,0x74,0x77,0x7a,0x7d;void DAConvert(unsigned int da)/并行转串行int i;da = 2;da &= 0xFFC;SCK = 0;CS = 0;for(i=0;i12;i+)if(da & 0x800) DIN = 1;else DIN = 0;SCK = 1;SCK = 0;da = 1;CS = 1;SCK = 1;DIN = 1;void Delay(unsigned int t) unsigned int i; while(t-) for(i=0;i100;i+);void ling () LCMClear() ; LCMDisplayString(1,5,wave ); while(1) DAConvert(0); if(S0=0|S1=0|S2=0|S3=0)break;void sanjiaobo() LCMClear() ; LCMDisplayString(1,2,san jiao bo);while(1) unsigned int i;for(i=0;i0;i-) DAConvert(i);if(S0=1)break; void juchibo() LCMClear() ; LCMDisplayString(1,2,ju chi bo);while(1)unsigned int i;for (i=0;i256;i+) DAConvert(i); if(S1=1)break;void fangbo() LCMClear() ; LCMDisplayString(1,2,fang bo);while (1)DAConvert(40);Delay(50);DAConvert(0);Delay(50);if(S2=1)break; void sine() LCMClear() ; LCMDisplayString(1,5,sine); while(1) unsigned char i;DAConvert(typei);i+; if(S3=1)break;void boxing(void) int key=0; while(1) if ( S0=1&S1=1 & S2=1 &S3=1 ) key=0; if ( S0=0) key=1; if ( S1=0) key=2; if ( S2=0) key=3; if ( S3=0) key=4;switch (key)case 0: ling(); break; case 1: sanjiaobo(); break; case 2: juchibo(); break; case 3: fangbo(); break; case 4: sine(); break;LCM1602.C#include #include #include #include #define BUSYFLAG0x80#define BLINK0x01#define NOBLINK0x00#define LCM_DBP0sbit LCM_RS= P10;sbit LCM_RW= P11;sbit LCM_E= P12;sbit LCM_BLC= P13;unsigned int data DelayConst = 140;/*函数名:LCMDelay功 能:通过循环的方式延时参 数:int,表示要延时的毫秒数*/void LCMDelay(int ms)unsigned int i,cnt;cnt = DelayConst * ms;for(i=0;icnt;i+);/*函数名:LCMReadState功 能:查询LCM的忙标志/当前AC地址返 回:BYTE,最高bit为1表示忙,为0表示闲*/unsigned char LCMReadState(void)unsigned char state;LCM_E = 0;LCM_RS = 0;LCM_RW = 1;LCM_E = 1;_nop_();_nop_();state = LCM_DB;LCM_E = 0;return state;/*函数名:LCMClear功 能:清屏*/void LCMClear(void)LCMDelay(1);LCM_E = 0;LCM_RS = 0;LCM_RW = 0;LCM_DB = 0x01;LCM_E = 1;_nop_();_nop_();LCM_E = 0;LCMDelay(1);/*函数名:LCMWriteCmd功 能:向LCM写入控制字参 数:BYTE,命令字节。写入前不判断忙表示(因为初始化过程中不能判断)*/void LCMWriteCmd(unsigned char cmd)LCMDelay(1);LCM_E = 0;LCM_RS = 0;LCM_RW = 0;LCM_DB = cmd;LCM_E = 1;_nop_();_nop_();LCM_E = 0;/*函数名:LCMWriteData功 能:向LCM写入数据参 数:BYTE,将要写入的数据*/void LCMWriteData(unsigned char dc)while(LCMReadState() & BUSYFLAG);LCM_RS = 1;LCM_RW = 0;LCM_DB = dc;LCM_E = 1;_nop_();_nop_();LCM_E = 0;/*函数名:LCMInit功 能:初始化LCM参 数:DWORD,晶振频率(Hz),供计算延时常数*/void LCMInit(void)LCMDelay(60);/ 延时60ms,等待LCM复位LCMWriteCmd(0x38);/ 功能设置:8位接口,2行,5x7字符点阵LCMDelay(5);/ 延时LCMWriteCmd(0x38);/ 第二次LCMDelay(1);/ 延时LCMWriteCmd(0x38);/ 此后可以通过监测忙标志判断指令执行情况while(LCMReadState() & BUSYFLAG);LCMWriteCmd(0x08);/ 关闭显示 while(LCMReadState() & BUSYFLAG);LCMWriteCmd(0x01);/ 清屏while(LCMReadState() & BUSYFLAG);LCMWriteCmd(0x06);/ 显示地址自动增量,整体不移位while(LCMReadState() & BUSYFLAG);LCMWriteCmd(0x0e);/ 开显示,开光标,不闪烁while(LCMReadState() & BUSYFLAG);/*函数名:LCMGotoXY功 能:移动光标到X行,Y列参 数:BYTE,x表示行(0,1),y表示列(横向,取值00x0f)*/void LCMGotoXY(unsigned char x,unsigned char y)/ x:行(01) y:列(0F)unsigned char cmd;if(x=0)cmd = 0x80 | y;elsecmd = 0x80 | 0x40 | y; /(第1行第0列为40H开始)LCMWriteCmd(cmd);while(LCMReadState() & BUSYFLAG);/*函数名:LCMDisplayString功 能:从指定的位置开始显示字符串参 数:x表示行(0,1),y表示列(横向,取值00x0f),*str为指向将要显示的字符串的指针*/void LCMDisplayString(unsigned char x,unsigned char y,unsigned char* str)unsigned char ptr;ptr = 0;while(*(str+ptr) != 0)LCMDisplayChar(x,(y+ptr),*(str+ptr);ptr+;#include #include #define BUSYFLAG0x80#define BLINK0x01#define NOBLINK0x00#define OSC22118400unsigned char ucTH,ucTL,Ticks;/*/ 函数名:T0ISR/ 功 能:50ms中断服务程序/*void T0ISR(void) interrupt 1TH0 = ucTH;TL0 = ucTL;TR0 = 1;Ticks +;if(Ticks = 20)Ticks = 0; LCM_BLC = 0;void main(void)/ 初始化EA = 0;/ 停止所有中断Ticks = 0;ucTH = (65536-OSC/12/20)/256;/ 计算50ms定时的时间常数ucTL = (65536-OSC/12/20)%256;TMOD = 0x01;/ T0:模式1,16位定时器TH0 = ucTH;TL0 = ucTL;ET0 = 1;/ T0允许中断TR0 = 1;/ 启动定时器EA = 1;/ 打开总中断允许LCMInit();LCMClear(); while(1) boxi

温馨提示

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

评论

0/150

提交评论