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

下载本文档

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

文档简介

通信工程学院课程设计说明书题目信号发生器的设计课程名称单片机原理及应用A专业电子信息工程目录一、课程设计目的二、课程设计任务三、课程设计要求四、课程设计思路五、课程设计软件仿真结果截图六、课程设计体会七、主要参考文献八、附录:源程序代码课程设计目的:在学习《单片机原理及应用A》课程的基础上,进一步深入理解MCS-51单片机的结构、工作原理和应用技术,提高单片机控制系统设计、研发的能力;按照教学计划的要求,利用一周时间,综合应用所学知识,设计具有一定功能的小型单片机控制系统,培养学生一定的自学能力和独立分析问题、解决问题的能力,要求学生能通过独立思考、查阅工具书、参考文献,提出自己的设计方案,找出设计中遇到问题的解决途径。课程设计要求:1、整个课程设计的各个环节都要自己动手。2、通过TLC5615串行D/A转换芯片完成信号发生器设计,经由示波器观察信号波形;3、采用C语言编程实现;4、其他要求参见“nKDE-51单片机实验教学系统实验指导书;5、基本任务为必做项目,附加任务为选做项目;6、对课程设计进行总结,撰写课程设计说明书。三、课程设计任务:1、基本任务:利用nKDE-51单片机实验教学系统上的硬件资源,实现信号发生器的功能。2、附加任务:通过键盘(1)选择输出信号的波形;(2)调整幅度、频率等参数。3、工作量要求:(1)设计的硬件电路图与程序流程图;(2)源程序代码;(3)系统运行结果符合课程设计要求。四、课程设计思路:TLC56151、TLC5615芯片结构:TLC5615引脚功能:DIN:串行数据输入端OUTSCLKSCLK:串行时钟输入端REFinCSCS:片选端,低电平有效DINOUT:DAC模拟电压输出端DOUTREFin:基准输入端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.5μs,这把更新频率限制在80KHz。当片选信号为低电平时,输入数据读入16bit移位寄存器。SCLK输入的上升沿把数据移入输入寄存器,接着,CS的上升沿把数据传送至DAC寄存器,当CS为高电平时,输入的数据不能由时钟同步送入输入寄存器。所有CS的跳变应发生在SCLK输入为低电平时。DIN只需要输入12位数据,DIN输入的12位数据中,前10位为TLC5615输入的D/A转换数据,并且输入时,高位在前,低位在后,后2位必须写入为0的2位数值,因为TLC5615的DAC输入锁存器为12位宽。总流程图:开始开始键盘扫描(确定是否改变频率、幅度)键盘扫描(确定是否改变频率、幅度)检测按键,确定输出波形检测按键,确定输出波形程序编译及软件仿真电路原理图:元器件列表:元器件名称所属类型AT89C51MicroprocessorICSCRYSTAL晶振MisecllaneousCAP电容CapacitorRESPACK-8ResistorCAP电容CapacitorSWITCH按键Switches&relaysTLC5615C(L)DDataConvertersLM016L液晶显示Display五、课程设计软件仿真结果截图:1、按下三角波键示波器输出三角波,同时液晶屏上显示“sanjiaobo”按下“锯齿波”键示波器输出三角波,同时液晶屏上显示“juchibo”按下“方波”键示波器输出三角波,同时液晶屏上显示“fangbo”按下“正弦波”键示波器输出三角波,同时液晶屏上显示“sine”当无任何键按下时示波器输出直线,同时液晶屏上显示“wave”6、显示字符“三”:课程设计体会:本次课程设计我做的是信号发生器,参考相关书籍和老师给的程序,很快就把三角波、锯齿波、方波、正弦波四种波形显示出来了。后面就是波形显示切换和在液晶屏上显示对应波形说明的问题。在老师同学和自己的努力下,在原程序上利用IF语句和SWITCH语句实现了波形按键切换功能,即想要显示方波按下“方波”键即可。另外我们这组还在LCM1602液晶屏上显示出了汉字,通过参考资料加上自己对汉字显示原理的理解,最终在液晶屏上显示出汉字“三”,虽然只是简单的“三”,但是过程是相当不容易。这次课程设计很有趣,让我实实在在收获了不少东西,知道了DA转换和LCM1602显示的原理,尤其是在LCM1602汉字的显示原理。这次课程设计也提高了我的编程能力和同学的合作能力。主要参考文献:1、《nKDE51单片机实验教学系统实验指导书》南京邮电大学,2021年2、《单片机原理与应用及C51程序设计》(第2版),谢维成等编著,清华大学出版社,2021年3、《单片机原理及应用》(第2版),李建忠,西安电子科技大学出版社,2021年4、《基于protues的51系列单片机设计与仿真》侯玉宝陈忠平李成群等编著,电子工业出版社八、源程序代码:LCM1602.H#ifndefLCM1602_h#defineLCM1602_h#defineBUSYFLAG 0x80#defineBLINK 0x01#defineNOBLINK 0x00unsignedcharLCMReadState(void);voidLCMDelay(int);voidLCMWriteCmd(unsignedchar);voidLCMWriteData(unsignedchar);voidLCMClear(void);voidLCMInit(void);voidLCMGotoXY(unsignedchar,unsignedchar);voidLCMDisplayChar(unsignedchar,unsignedchar,unsignedchar);voidLCMDisplayString(unsignedchar,unsignedchar,unsignedchar*);voidLCMBlink(unsignedchar,unsignedchar,unsignedchar);#endifBOXING.H#include<reg51.h>#include<stdio.h>#include<intrins.h>#include<LCM1602.h>#defineOSC 22118400#defineBAUDRATE 9600sbit DIN=P1^4; //串行数据输入端sbit SCK=P1^5; //串行时钟输入端sbit CS=P1^6; //DA片选端sbit S0 =P2^0; //三角波sbit S1 =P2^1; // 锯齿波sbit S2 =P2^2; // 方波波sbit S3 =P2^3; // 正弦波//正弦波unsignedcharcodetype[256]={ 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};voidDAConvert(unsignedintda) //并行转串行{ inti; da<<=2; da&=0xFFC; SCK=0; CS=0; for(i=0;i<12;i++) { if(da&0x800) DIN=1; elseDIN=0; SCK=1; SCK=0; da<<=1; } CS=1; SCK=1; DIN=1;}voidDelay(unsignedintt){unsignedinti;while(t--){for(i=0;i<100;i++);}}voidling(){ LCMClear(); LCMDisplayString(1,5,"wave"); while(1) {DAConvert(0); if(S0==0||S1==0||S2==0||S3==0)break; }}voidsanjiaobo(){ LCMClear(); LCMDisplayString(1,2,"sanjiaobo"); while(1) {unsignedinti; for(i=0;i<256;i++) {DAConvert(i);} for(i=256;i>0;i--) {DAConvert(i);} if(S0==1)break;}} voidjuchibo(){ LCMClear(); LCMDisplayString(1,2,"juchibo"); while(1) { unsignedinti; for(i=0;i<256;i++) {DAConvert(i);} if(S1==1)break;}} voidfangbo(){ LCMClear(); LCMDisplayString(1,2,"fangbo"); while(1) { DAConvert(40); Delay(50); DAConvert(0); Delay(50); if(S2==1)break;} }voidsine(){ LCMClear(); LCMDisplayString(1,5,"sine"); while(1) { unsignedchari; DAConvert(type[i]); i++; if(S3==1)break;} }voidboxing(void){ intkey=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) {case0:ling(); break; case1:sanjiaobo(); break; case2:juchibo(); break; case3:fangbo(); break; case4:sine(); break; }} } LCM1602.C#include<reg51.h>#include<intrins.h>#include<LCM1602.H>#include<boxing.h>#defineBUSYFLAG 0x80#defineBLINK 0x01#defineNOBLINK 0x00#defineLCM_DB P0sbitLCM_RS =P1^0;sbitLCM_RW =P1^1;sbitLCM_E =P1^2;sbitLCM_BLC =P1^3;unsignedintdataDelayConst=140;/******************************************************************************函数名:LCMDelay功能:通过循环的方式延时参数:int,表示要延时的毫秒数******************************************************************************/voidLCMDelay(intms){ unsignedinti,cnt; cnt=DelayConst*ms; for(i=0;i<cnt;i++);}/******************************************************************************函数名:LCMReadState功能:查询LCM的忙标志/当前AC地址返回:BYTE,最高bit为1表示忙,为0表示闲******************************************************************************/unsignedcharLCMReadState(void){ unsignedcharstate; LCM_E=0; LCM_RS=0; LCM_RW=1; LCM_E=1; _nop_(); _nop_(); state=LCM_DB; LCM_E=0; returnstate;}/*******************************************************************************函数名:LCMClear功能:清屏*******************************************************************************/voidLCMClear(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,命令字节。写入前不判断忙表示(因为初始化过程中不能判断)*******************************************************************************/voidLCMWriteCmd(unsignedcharcmd){ 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,将要写入的数据******************************************************************************/voidLCMWriteData(unsignedchardc){ while(LCMReadState()&BUSYFLAG); LCM_RS=1; LCM_RW=0; LCM_DB=dc; LCM_E=1; _nop_(); _nop_(); LCM_E=0;}/******************************************************************************函数名:LCMInit功能:初始化LCM参数:DWORD,晶振频率(Hz),供计算延时常数******************************************************************************/voidLCMInit(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表示列(横向,取值0~0x0f)******************************************************************************/voidLCMGotoXY(unsignedcharx,unsignedchary) //x:行(0~1)y:列(0~F){ unsignedcharcmd; if(x==0) { cmd=0x80|y; } else { cmd=0x80|0x40|y;//(第1行第0列为40H开始) } LCMWriteCmd(cmd); while(LCMReadState()&BUSYFLAG);}/******************************************************************************函数名:LCMDisplayString功能:从指定的位置开始显示字符串参数:x表示行(0,1),y表示列(横向,取值0~0x0f),*str为指向将要显示的字符串的指针******************************************************************************/voidLCMDisplayString(unsignedcharx,unsignedchary,unsignedchar*str){ unsignedcharptr; ptr=0; while(*(str+ptr)!=0) { LCMDisplayChar(x,(y+ptr),*(str+ptr)); ptr++; }}#include<reg51.h>#include<stdio.h>#defineBUSYFLAG 0x80#defineBLINK 0x01#defineNOBLINK 0x00#defineOSC 22118400unsignedcharucTH,ucTL,Ticks;//*****************************************************************************//函数名:T0ISR//功能:50ms中断服务程序//*****************************************************************************voidT0ISR(void)interrupt1{ TH0=ucTH; TL0=ucTL; TR0=1; Ticks++; if(Ticks==20) { Ticks=0; LCM_BLC=0; }}voidmain(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) {boxing();} }

汉字显示程序#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitrs=P1^0;sbitrw=P1^1;sbiten=P1^2;sbitLCM_BLC=P1^3;//字符“三”ucharcodetable[]={0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x0F,//“三”左上半部分 0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x7C,//“三”右上半部分 0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,//“三”左下半部分 0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00//“三”右下半部分};voiddelay(uintn) //延时{uintx,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}voidlcd_wcom(ucharcom) //向lcm1602写入命令字{rs=0;rw=0;P0=com;delay(5);en=1;en=0;}voidlcd_wdat(uchardat) //向lcm1602写入数据{rs=1;rw=0;P0=dat;delay(5);en=1;en=0;}voidlcd_init() //lcm1602初始化{lcd_wcom(0x38);lcd_wcom(0x0c);lcd_wcom(0x06);lcd_wcom(0x01);}voidmain(){charm=0; LCM_BLC=0;lcd_init();lcd_wcom(0x40); //设定CGRAM地址for(m=0;m<64;m++) //将代码写入CGRAM中{lcd_wdat(table[m]);}lcd_wcom(0x85); //设定上排的显示位置for(m=0;m<2;m++){lcd_wdat(m);} lcd_wcom(0xc5); //设定下排的显示位置for(m=2;m<4;m++){lcd_wdat(m);}while(1);}

教师见习报告总结期待已久的见习已经结束了,在龙岩三中高中部见习听课,虽然只是短短的两个星期,但感触还是蛮深的,以前作为一名学生坐在课室听课,和现在作为一名准教师坐在课室听课是完全不同的感受,感觉自己学到了一些在平时课堂上学不到的东西。在这里,我获得的不仅是经验上的收获,更多是教学管理,课堂教学等的理念,以及他们带给我的种种思考。教育见习实践过程:听课。教育见习的主要目的是让学生在指导教师的引导下,观摩教师上课方法、技巧等。听课是教育见习的主要内容。我院规定在一周的见习中需完成至少6课的见习任务。我在教师的安排指导下,分别对高一、高二物理专业课型为主,其他课型齐头的方式,积极主动的完成了听课任务,收到良好的效果。我听的第一节课是高二(8)班,这是一个平衡班,水平不如实验班高。在上课前。科任老师已经跟我说了这个班的纪律是比较差的,而且成绩也不是很好。在我听课期间,确实有几个学生在课堂上说话,但是我发现了一个有趣的现象,这个现象我在往后的几个班都发现了,就是绝大部分的学生的学习热情都好高涨,积极举手发言,积极参与课堂活动。我跟老师们提起这个现象的时候,科任老师就跟我说,一个班里不可能所有的学生都能全神贯注地听完一节课,所以作为一名教师,应该想办法吸引学生的注意力,调动的积极性,比如可以以小组为单位,以抢答计分的形式调动学生的积极性,这样课堂气氛就会活跃起来了。

在为期两周的见习工作中,我真的有很大的感触,我第一次感受到自己已经从一名学生向一名教师靠近,走在校园里,每当有学生叫我一声老师,我在感到无比自豪的同时,还感受到了自己的责任。见习工作结束了,我要回到学校继续我的学习了,但是我会好好记住我从**中学学到的一切,并应用于我的专业学习中去。一、教学管理理念

在龙岩三中,从领导阶层到一位普通的科任老师,都秉承以学

温馨提示

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

评论

0/150

提交评论