8155 LED函数信号发生器.docx

上传人:b****4 文档编号:3383585 上传时间:2022-11-22 格式:DOCX 页数:17 大小:647.82KB
下载 相关 举报
8155 LED函数信号发生器.docx_第1页
第1页 / 共17页
8155 LED函数信号发生器.docx_第2页
第2页 / 共17页
8155 LED函数信号发生器.docx_第3页
第3页 / 共17页
8155 LED函数信号发生器.docx_第4页
第4页 / 共17页
8155 LED函数信号发生器.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

8155 LED函数信号发生器.docx

《8155 LED函数信号发生器.docx》由会员分享,可在线阅读,更多相关《8155 LED函数信号发生器.docx(17页珍藏版)》请在冰豆网上搜索。

8155 LED函数信号发生器.docx

8155LED函数信号发生器

南京邮电大学

实验报告

实验名称基于8155的8LED显示函数信号发生器设计

 

基于8155的8LED显示函数信号发生器设计

一、实验目的

本课程设计是在理论课程的基础上,重点培养学生的动手能力,通过电路设计、理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,并可能结合实际的实验板进行下载测试。

学习proteus软件的使用,学习汇编语言以及C语言在51编程上的使用,学习系统测试,自主实验。

二、实验设备

(1)PC机一台

(2)Keilc51单片机仿真软件

(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口均为输入方式。

 AD0~AD7:

三态的地址/数据总线。

与单片机的低8位地址/数据总线(P0口)相连。

单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。

 RD:

读选通信号,控制对8155的读操作,低电平有效。

 WR:

写选通信号,控制对8155的写操作,低电平有效。

 CE:

片选信号线,低电平有效。

 IO/M:

8155的RAM存储器或I/O口选择线。

当IO/M=0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/M=1时,选择8155的I/O口,AD0~AD7上的地址为8155I/O口的地址。

  ALE:

地址锁存信号。

8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及,IO/的状态都锁存到8155内部锁存器。

因此,P0口输出的低8位地址信号不需外接锁存器。

  PA0~PA7:

8位通用I/O口,其输入、输出的流向可由程序控制。

  PB0~PB7:

8位通用I/O口,功能同A口。

  PC0~PC5:

有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。

  TIMERIN:

定时/计数器脉冲输入端。

  TIMEROUT:

定时/计数器输出端。

  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

#defineuintunsignedint

#defineucharunsignedchar

#defineCOM8155XBYTE[0X7FF8]

#definePA8155XBYTE[0X7FF9]//8155的PA

#definePB8155XBYTE[0X7FFA]//8155的PB

#definePC8155XBYTE[0X7FFB]//8155的PC

ucharcodedu_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

ucharcodebit_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsignedcharcodesin_tab[256]={

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

};

uchari=0;

ucharkey_temp=0;

ucharcountflag=1,count,count2,cou_num,cou_num1;

uintt,num,flag=1;

ucharadd_flag,cut_flag,moment=5;

uchararray[8]={0};

voiddelayms(uintz)

{

uinty;

for(;z>0;z--)

for(y=110;y>0;y--);

}

voidkeyscan()

{

ucharm;

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;

}

}

}

}

voidinit0()

{

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;

}

 

voidaa(ucharx)

{

if(x==0)

;

elseif(x==1)

{

_nop_();_nop_();_nop_();

}

elseif(x==2)

{

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

}

elseif(x==3)

{

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

}

elseif(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_();

}

}

ucharsanjiao()

{

for(i=0;i<125;i++)

{

P1=i;

aa(moment);

if(key_temp!

=3)

return0;

}

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

{

P1=i;

aa(moment);

if(key_temp!

=3)

return0;

}

t++;

return0;

}

ucharjuchibo()

{

for(i=0;i<255;i++)

{

P1=i;

aa(moment);

if(key_temp!

=2)

return0;

}

t++;

return0;

}

ucharsin()

{

for(i=0;i<255;i++)

{

P1=sin_tab[i];

aa(moment);

if(key_temp!

=0)

return0;

}

t++;

return0;

 

}

ucharfangbo()

{

uchari;

P1=0xff;

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

P1=0;

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

t++;

return0;

}

voidmain()

{

init0();

while

(1)

{

if(key_temp==0)

sin();

elseif(key_temp==1)

fangbo();

elseif(key_temp==2)

juchibo();

else

sanjiao();

}

}

voidtimer0(void)interrupt1using1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

keyscan();

if(countflag==2)

countflag=1;

if(flag==1)

{

count++;

if(count==40)

{

count=0;

array[0]=t%10000/1000;

array[1]=t%1000/100;

array[2]=t%100/10;

array[3]=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_code[count1];

PA8155=du_code[array[count1]];

count1++;

if(count1==5)

count1=0;

}

voidtimer1()interrupt3

{

TH1=(65536-30)/256;

TL1=(65536-30)%256;

if(cou_num==8)

cou_num=0;

if(cou_num<4)

{cou_num1=cou_num+4;}

else

cou_num1=cou_num-4;

PB8155=bit_code[cou_num1];

PA8155=0x00;

PA8155=du_code[array[cou_num]];

cou_num++;

}

五、实验过程及其记录

通过编程,调试,控制开关,实现了正弦,方波,锯齿波,三角波的输出,下面是仿真图:

 

六、实验小结

目前单片机的应用非常广泛,但是我们都学的不精,拿到这个课程设计毫无办法。

在拿到课程设计的题目后,我通过图书馆的资源,还有老师的讲解,帮助,上网查找相关的资料,历时两个星期,终于完成任务。

通过本次实验,我学会了Keilc51,Proteus仿真软件的使用,学习了51单片机的编程技术。

并且根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的原理图,在此基础上编写相对应的程序,实现其功能。

这使我对proteus软件的使用有了一定的了解,其中包括原理图器件的选取、原理图的连接、程序的编写编译以及运行,并能查出其部分错误。

并通过电路设计、理论计算、实际编程、调试、测试、分析查找故障,解决了在实际设计中的问题,使设计好的电路能正常工作。

关于多所用到的一些硬件,也有了一些的了解,譬如说DA转换器,通过差分放大得到所需要的波形。

也知道该单片机内有哪些资源;完成一个完整的设计必须要有一个清晰的思路和一个完整的的软件流程图。

设计中也会遇到各种各样的问题,通过老师,同学不断的排忧,解疑,都一一克服,在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用于实践。

由于使用的是C语言编程,使功能实现更加方便。

但由于基础薄弱,本次课程设计只完成了基本要求,感觉很是遗憾。

不过看到自己画出的电路、编写的程序在一次次失败中不断进步,逐步提高,最终可以运行成功确实很有意义。

很感谢老师在实验过程中给予的讲解和帮助,让我及时更正、受益匪浅。

通过这次设计,我懂得了学习和合作的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。

另外,要非常感谢我的指导老师和同组一起合作的同学,帮我克服了一个又一个的困难,让我学会耐心面对困难,以及解决问题的思路。

这次课程设计总体来说完成的还可以。

通过本次课程设计,我提高了我的专业知识和动手能力,为即将走向工作岗位的我们打下了良好的基础,也希望在以后的工作、学习中可以学以致用,熟练运用单片机设计出更多更好的电路,并做成实物,真正得到应用。

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

当前位置:首页 > 高等教育 > 院校资料

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

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