8155 LED函数信号发生器.docx_第1页
8155 LED函数信号发生器.docx_第2页
8155 LED函数信号发生器.docx_第3页
8155 LED函数信号发生器.docx_第4页
8155 LED函数信号发生器.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

南京邮电大学实 验 报 告 实验名称 基于8155的8led显示函数信号发生器设计基于8155的8led显示函数信号发生器设计一、实验目的本课程设计是在理论课程的基础上,重点培养学生的动手能力,通过电路设计、理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,并可能结合实际的实验板进行下载测试。学习proteus软件的使用,学习汇编语言以及c语言在51编程上的使用,学习系统测试,自主实验。二、实验设备(1)pc机 一台(2) keil c51单片机仿真软件(3)proteus软件三、实验内容函数信号发生器类:基于8155的8led显示函数信号发生器设计1 用存储器或算法得到信源。2 用da转换器输出一函数信号(正弦、方波、三角、锯齿等,频率1000hz),可以用示波器进行波形观察。3 用数码管或lcd显示输出参数。4 用功能键切换各信号的输出。发挥部分:1 通过键盘,可修改波的频率。每按一次键,频率值进给或后退1倍,频率范围不限。2 通过按键可以修改输出波形的幅度。3 按键时,蜂鸣器发出提示音,表示按键有效。4 数码管或lcd显示的内容可以用频率值和周期值切换表示。 动态显示格式:自定四、实验原理 函数发生器是一种多波形的信号源。它可以产生正弦波、方波、三角波、锯齿波,甚至任意波形。有的函数发生器还具有调制的功能,可以进行调幅、调频、调相、脉宽调制和vco控制。函数发生器有很宽的频率范围,使用范围很广,它是一种不可缺少的通用信号源。可以用于生产测试、仪器维修和实验室,还广泛使用在其它科技领域,如医学、教育、化学、通讯、地球物理学、工业控制、军事和宇航等。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。1. 实现函数发生器的基本方法利用差分放大电路实现三角波正弦波的变换波形变换的原理是利用差分放大器的传输特性曲线的非线性,波形变换过程如图2所示。由图可以看出,传输特性曲线越对称,线性区域越窄越好;三角波的幅度uim应正好使晶体接近饱和区域或者截至区域。方案一:用差分放大电路实现三角波到正弦波以及集成运放组成的电路实现函数发生器。2. 各单元硬件设计说明及计算方法1) 8155中文描述:2048位静态内存与i/o端口和定时器。8155各引脚功能说明如下: rst:复位信号输入端,高电平有效。复位后,3个i/o口均为输入方式。 ad0ad7:三态的地址/数据总线。与单片机的低8位地址/数据总线(p0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。 rd:读选通信号,控制对8155的读操作,低电平有效。 wr:写选通信号,控制对8155的写操作,低电平有效。 ce:片选信号线,低电平有效。 io/m :8155的ram存储器或i/o口选择线。当io/m 0时,则选择8155的片内ram,ad0ad7上地址为8155中ram单元的地址(00hffh);当io/m 1时,选择 8155的i/o口,ad0ad7上的地址为8155 i/o口的地址。 ale:地址锁存信号。8155内部设有地址锁存器,在ale的下降沿将单片机p0口输出的低8位地址信息及 ,io/ 的状态都锁存到8155内部锁存器。因此,p0口输出的低8位地址信号不需外接锁存器。 pa0pa7:8位通用i/o口,其输入、输出的流向可由程序控制。 pb0pb7:8位通用i/o口,功能同a口。 pc0pc5:有两个作用,既可作为通用的i/o口,也可作为pa口和pb口的控制信号线,这些可通过程序控制。 timer in:定时/计数器脉冲输入端。 timer out:定时/计数器输出端。 vcc:5v电源。 2) da转换dac0832是8分辨率的d/a转换集成芯片。与微处理器完全兼容。这个da芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。d/a转换器由8位输入锁存器、8位dac寄存器、8位d/a转换电路及转换控制电路构成。 单片机应用系统中,经常要对一个连续的脉冲波频率进行测量。在实际应用中,对于转速,位移、速度、流量等物理量的测量,一般也是由传感器转换成脉冲电信号,采用测量频率的手段实现。 使用单片机测量频率或周期,通常是利用单片机的定时计数器来完成的,测量的基本方法和原理有两种: 测频法:在限定的时间内(如1秒钟)检测脉冲的个数。 测周法:测试限定的脉冲个数之间的时间。 这两种方法尽管原理是相同的,但在实际使用时,需要根据待测频率的范围、系统的时钟周期、计数器的长度、以及所要求的测量精度等因素进行全面和具体的考虑,寻找和设计出适合具体要求的测量方法。 在具体频率的测量中,需要考虑和注意的因素有以下几点。 系统的时钟。首先测量频率的系统时钟本身精度要高,因为不管是限定测量时间还是测量限定脉冲个数的周期,其基本的时间基准是系统本身时钟产生的。其次是系统时钟的频率值,因为系统时钟频率越高,能够实现频率测量的精度也越高。因此使用avr测量频率时,建议使用由外部晶体组成的系统的振荡电路,不使用其内部的rc振荡源,同时尽量使用频率比较高的系统时钟。 所使用定时计数器的位数。测量频率要使用定时计数器,定时计数器的位数越长,可以产生的限定时间越长,或在限定时间里记录的脉冲个数越多,因此也提高了频率测量的精度。所以对频率测量精度有一定要求时,尽量采用16位的定时计数器。 被测频率的范围。频率测量需要根据被测频率的范围选择测量的方式。当被测频率的范围比较低时,最好采用测周期的方法测量频率。而被测频率比较高时,使用测频法比较合适。需要注意的是,被测频率的最高值一般不能超过测频mcu系统时钟频率的1/2,因为当被测频率高于mcu时钟1/2后,mcu往往不能正确检测被测脉冲的电平变化了。 除了以上三个因素外,还要考虑频率测量的频度(每秒内测量的次数),如何与系统中其它任务处理之间的协调工作等。频率测量精度要求高时,还应该考虑其它中断以及中断响应时间的影响,甚至需要在软件中考虑采用多次测量取平均的算法等。测频法的基本思想,就是采用在已知限定的时间内对被测信号输入的脉冲个数进行计数的方法来实现对信号频率的测量。当被测信号的频率比较高时,采用这种方法比较适合,因为在一定时间内,频率越高,计数脉冲的个数也越多,测量也越准确。 本次实验,采用了测频法,采用在已知限定的时间内对被测信号输入的脉冲个数进行计数的方法来实现对信号频率的测量,用p1或p3口,产生一方波信号,频率分别为100hz,500hz,1000hz,用lcd显示频率以及脉宽参数。五、程序:#include#include#include#define uint unsigned int#define uchar unsigned char#define com8155 xbyte0x7ff8 #define pa8155 xbyte0x7ff9 /8155的pa#define pb8155 xbyte0x7ffa /8155的pb#define pc8155 xbyte0x7ffb /8155的pcuchar code du_code=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; uchar code bit_code=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code sin_tab256= 0x80,0x82,0x85,0x88,0x8b,0x8e,0x91,0x94,0x97,0x9a,0x9d,0xa0,0xa3,0xa6,0xa9,0xac,0xaf,0xb2,0xb6,0xb9,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80;uchar i=0;uchar key_temp=0;uchar countflag=1,count,count2,cou_num,cou_num1;uint t,num,flag=1;uchar add_flag,cut_flag,moment=5;uchar array8=0;void delayms(uint z)uint y;for(;z0;z-)for(y=110;y0;y-);void keyscan() uchar m; m=pc8155; m=m&0x3f; if(m!=0x3f) countflag+; if(countflag=2) pc8155=0x3f; m=pc8155; m&=0x3f; if(m!=0x3f) m=pc8155; m&=0x3f; switch(m) case(0x3e):key_temp=0;break; case(0x3d):key_temp=1;break; case(0x3b):key_temp=2;break; case(0x37):key_temp=3;break; case(0x2f):add_flag=1;break; case(0x1f):cut_flag=1;break; t=0; flag=1; void init0() tmod=0x11;th0=(65536-50000)/256; tl0=(65536-50000)%256;th1=(65536-100)/256;tl1=(65536-100)%256; et0=1; et1=1; tr0=1; tr1=1;ea=1; com8155=0x03; void aa(uchar x) if(x=0) ; else if(x=1) _nop_(); _nop_();_nop_(); else if(x=2) _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); else if(x=3) _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); else if(x=4) _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); else _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); uchar sanjiao() for(i=0;i0;i-) p1=i; aa(moment); if(key_temp!=3) return 0; t+; return 0;uchar juchibo() for(i=0;i255;i+) p1=i; aa(moment); if(key_temp!=2) return 0; t+;return 0;uchar sin() for(i=0;i0;i-);p1= 0; for(i=moment;i0;i-); t+; return 0;void main()init0();while(1) if(key_temp=0) sin(); else if(key_temp=1) fangbo(); else if(key_temp=2) juchibo(); else sanjiao(); void timer0(void)interrupt 1 using 1 th0=(65536-50000)/256;tl0=(65536-50000)%256; keyscan(); if(countflag=2) countflag=1;if(flag=1) count+; if(count=40) count=0; array0=t%10000/1000;array1=t%1000/100;array2=t%100/10;array3=t%10;t=0;flag=0; if(add_flag=1) add_flag=0; if(moment!=5) moment+; if(cut_flag=1) cut_flag=0; if(moment!=0) moment-; pb8155=bit_codecount1;pa8155=du_codearraycount1;count1+;if(count1=5)count1=0; void timer1() interrupt 3th1=(65536-30)/256; tl1=(65536-30)%256; if(cou_num=8)cou_num=0;if(cou_num4) cou_num1=cou_num+4;else cou_num1=cou_num-4;pb8155=bit_codecou_num1; pa8155=0x00; pa8155=du_codearraycou_num;cou_num+; 五、实验过程及其记录通过编程,调试,控制开关,实现了正弦,方波,锯齿波,三角波的输出,下面是仿真图: 六、实验小结目前单片机的应用非常广泛,但是我们都学的不精,拿到这个课程设计毫无办法。在拿到课程设计的题目后,我通过图书馆的资源,还有老师的讲解,帮助,上网查找相关的资料,历时两个星期,终于完成任务。通过本次实验,我学会了keil c51,proteus仿真软件的使用,学习

温馨提示

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

评论

0/150

提交评论