智能仪器课程设计波形发生器_第1页
智能仪器课程设计波形发生器_第2页
智能仪器课程设计波形发生器_第3页
智能仪器课程设计波形发生器_第4页
智能仪器课程设计波形发生器_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、智能仪器课程设计班 级:姓 名:学 号:目录一实验目的:3二实验要求:3三硬件原理3单片机最小系统:3数码管4.数码管功能使用:4.数码管说明4数码管原理图5.led灯5矩阵按键61矩阵键盘的功能使用62.矩阵键盘的结构与工作原理6.da/ad转换 pcf85916i2c总线7i2c总线基本结构:82.双向传输的接口特性8数据的传送9.i2c总线的数据传送格式:9.总线竞争的仲裁:10应用领域10四软件原理10动态显示10显示原理10键盘12键盘扫描原理12键盘扫描子程序12五设计心得14六参考文献14七附录15程序15原理图2425波形发生器一实验目的:1. 掌握动态led显示及键盘设计原理

2、,对智能仪器中最基本的输入输出设备具有感性认识2. 熟练掌握hc6800开发板的使用3. 通过一个相当对完整的程序编程,能够将单片机知识和智能仪器的设计融会贯通,同时掌握对智能仪器的软硬件构成及硬件软化方法。二实验要求:1 显示亮度大致均匀。2 按键需去抖3 运行程序首先显示以下内容:hello4 通过按键显示相应的波形,通过输出。5 输出波形时,数码管显示频率,发光管指示波形种类。6 编写实验报告。三硬件原理 单片机最小系统:cpu 为stc89系列增强型8位单片机,频率高达80mhz,可工作于6clock,32i/o,3定时器,内置wdt、eeprom。支持,。晶振采用(可更换)。数码管.

3、数码管功能使用: 有2 组四位动态数码管和1个一位静态数码管。当使用四位动态数码管时,用8位排线将j12与单片机的i/o口脚相连,当使用一位静态数码管时,有两种连接方式:1.用8p排线将jp3与单片机的i/o口脚相连,实现用单片机i/o脚直接控制数码管。2.用8p排线将jp2与jp3相连,然后将jp12用短路冒全部短接,此时为单片机控制74hc595,,7hc595再控制数码管的动态扫描。.数码管说明数码管实际上是由7个发光管组成的8字形构成的,加上小数点就是8个,动态扫描显示接口是单片机中应用最为广泛的一种显示方式。其接口电路是把所有显示器的8个笔划a-h同名端连在一起,而每一个显示器的公共

4、极com是各自独立地接受i/o口线控制。cpu向各字段输出口送出字形码时,所有显示器均接收到相同的字形码,但究竟是那个显示器亮,取决于com端所以就可以自行决定何时显示哪一位了。所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的com端,使各个显示器轮流点亮。每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余晖效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。数码管原理图.led灯jp1为8路led灯的接口,使用此功能时,将jp1与jp8-jp11中任何接口相连,即可实现单片机控制8路led

5、。原理图矩阵按键1矩阵键盘的功能使用jp4为矩阵键盘的接口,p10p13为行,p14-p16为列。使用8p排线把jp4与jp8-jp11中任何接口相连,实现矩阵键盘的功能。2.矩阵键盘的结构与工作原理当键盘中按键数量较多时为了减少i/o口德占用,通常将按键排列成矩阵形式。在矩阵键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样一个端口就可以构成4*4个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数较多时,采用矩阵法来做键盘是合理的。矩阵式的键盘显然比直接法复杂一些,识别也要复杂一些。原理图:.da/ad转换 pcf8591pcf8591

6、使用i2c与单片机通信,p2.1(sda)串行数据线,p2.0(scl)串行时钟线。ad0和ad1是两路模拟输入,改变ad0和ad1位置的电位器,实现了两路模拟输入,在数码管中可以看到数值变化。当pcf8591数模端口数据变化时,da位置的led亮度随之改变。pcf8591t介绍:pcf8591是philips生产的8位分辨率d/a、a/d转换集成芯片,有4路模拟输入,1路模拟输出,一个i2cbus接口,3个给硬件编程的脚。通过i2c总线与处理器通信,其价格低廉,接口简单,转换控制容易等优点,在单片机应用系统中得到了广泛的应用。ain0-ain3:模拟输出(a/d转换)aout:模拟输出(d/

7、a转换)a0-a2:硬件设备地址gnd:电源负极地vref:参考电压输入ext:振荡器输入时,内部/外部的切换开关osc:振荡器输入/输出scl:i2c bus时钟输入sda:i2cbus 数据输入输出agnd:模拟地,模拟信号和基准电源的参考地原理图:i2c总线i2c总线是一种基于ic器件之间连接的二线制总线。它通过sda(串行数据线)及scl(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机,存储器,lcd驱动器还是键盘接口。i2c总线基本结构:采用i2c总线标准的单片机ic器件,其内部结构不仅有i2c接口电路,而且将内部各单元电路电路按功能划分为若干

8、相对独立的模块,通过软件寻址实现片选,减少了器件片选的连接。cpu不仅能通过指令将某个功能单元电路挂靠摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。i2c总线接口电路原理图:2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如mcs51系列的txd和rxd。而i2c总线则根据器件的功能通过软件程序使其可工作于发送接收方式。当某个器件向总线上发送信息时,它就是发送器(也称主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。主器件用于启动总线上传送数据并产生时钟,以开放送的器件,此时,任何被寻址的器件均本人为是从器件。i2

9、c总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在在总线上,既没有中心机,也没有优先机。 总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。sda和scl均为双向输入输出线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。;连接总线的器件的输出级必须是集电极或漏极开路,以具有“线”与功能。i2c总线的数据数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s. 在实际应用中,一般只有单片机能够发送clk,因此,只有单片机能够作为主器件,其余i2c器件均为从器件。多单片机系统通常很少应用。i2c总线上的时

10、钟信号在i2c总线上传送信息时的时间同步信号是由挂接在scl时钟器件的逻辑与完成的。scl线上由高电平到低电平的跳变将影响这些器件,一旦某个器件的scl线跳变为低电平,使scl上的所有器件进入低电平期。此时低电平周期短的器件的时钟由低至高的跳变不能影响scl线的状态,于是这些器件将进入高电平等待的状态,当所有器件的时钟信号都跳变为高电平时,低电平期结束。scl线被释放scl 线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将 scl 线拉成低电平。这样就在 scl 线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平 期最长的器件确定,而时钟高电平时

11、间由时钟高电平期最短的器件确定。 数据的传送 在数据传送过程中,必须确认数据传送的开始和结束。在 i2c 总线技术规 范中,开始和结束信号(也称启动和停止信号)的定义如图 所示。当时钟线 scl 为高电平时,数据线 sda 由高电平跳变为低电平定义为开始信号;当 scl 线为高电平时,sda 线发生低电平到高电平的跳变为结束信号。开始和结束信号都是由主器件产生。在开 始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空 闲的。.i2c总线的数据传送格式:在i2c总线开始信号后,送出的第一个字节数据是用来选择器件地址的,其中前七位为地址码,第八位为方向位,方向位为0表示

12、发送,即主器件把信息写到所选择的从器件;方向位为1表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第八位确定。 在i2c总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个认可位,也叫应答位。数据的传送过程:每次都是先传最高位通常从器件在接收到每个字节后都会做出响应,即释放scl线返回高电平,准备接受下一个数据字节,主器件可继续传送。如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这

13、个中断处理完之前就不能接受i2c总线上的数据字节)可以使时钟scl线保持低电平,从器件必须使sda保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时,释放scl线,主器件继续传送。当主器件发送完一个字节的数据时,接着发出对应于scl线上的一个时钟(ack)认可位,在此时钟内主器件释放sda线一个字节传送结束,而从器件的响应信号将sda线拉成低调平,使sda在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,sda线返回高电平,进入下一个传送周期。.总线竞争的仲裁:总线上可能挂接有多个器件,有时会发生两个或多个主器件想同时占用总线的情况,例

14、如:多单片机系统中,可能在某一时刻有两个单片机要同时向总线发送数据,这种情况叫总线竞争。i2c总线具有多主控能力,可对发生在sda线上的总线竞争进行仲裁,其仲裁原则是:当多个主器件同时想占用总线时,如果某个主器件发送高低阿平,而另一个主器件发送低电平,则发送电平与此时sda总线电平不符合的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,从而确保了竞争仲裁的可靠性。由于利用i2c总线上的信息进行仲裁,因此不会造成信息的丢失。应用领域i2c总线接口器件目前在视频处理,移动通信,等领域采用i2c总线接口器件已经比较普遍。另外,通用的i2c总线接口器件,如带i2c总

15、线的单片机,ram,rom,a/d,d/a,lcd驱动器等器件,也越来越多的应用于计算机及自动控制系统中。四软件原理动态显示显示原理的静态显示虽然有编程容易,管理简单等优点,但静态显示所要占用的口资源很多,所以在显示的较多的情况下,一般采用动态显示方式。数码管实际上是由7个发光管组成的8字形构成的,加上小数点就是8个,动态扫描显示接口是单片机中应用最为广泛的一种显示方式。其接口电路是把所有显示器的8个笔划a-h同名端连在一起,而每一个显示器的公共极com是各自独立地接受i/o口线控制。cpu向各字段输出口送出字形码时,所有显示器均接收到相同的字形码,但究竟是那个显示器亮,取决于com端所以就可

16、以自行决定何时显示哪一位了。所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的com端,使各个显示器轮流点亮。每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余晖效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感显示子程序:#include #include sbit ls138a = p22; /定义138译码器的输入a脚由p2.2控制 sbit ls138b = p23; /定义138译码器的输入脚b由p2.3控制sbit ls138c = p24; /定义138译码器的输入脚c由p2.4

17、控制void delay(unsigned int i); /函数声名char delaycnt; /此表为 led 的字模, 共阴数码管 0-9 - unsigned char code disp_tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; main() unsigned int i,lednumval=1 ; unsigned int ledout10; delaycnt=0; while(1) /进入循环状态 if(+delaycnt=50) delaycnt=0; /延时计数 每扫描一次加一次 +lednu

18、mval; /每隔50个扫描周期加一次 ledout0=disp_tablednumval%10000/1000; ledout1=disp_tablednumval%1000/100|0x80; ledout2=disp_tablednumval%100/10; ledout3=disp_tablednumval%10; ledout4=disp_tablednumval%10000/1000; /千位 ledout5=disp_tablednumval%1000/100|0x80; /百位带小数点 ledout6=disp_tablednumval%100/10; /十位 ledout7=

19、disp_tablednumval%10; /个位 for( i=0; i 0; i-) for(j = 200; j 0; j-);键盘键盘扫描原理在键盘中按键数量较多时,为了减少i/o口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列

20、线通过电阻接正电源,并将行线所接的单片机的i/o口作为输出端,而列线所接的i/o口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。键盘扫描子程序#include #include #define uchar unsigned char#define uint unsigned intuchar dis_buf; /显示缓存uchar temp;uchar key; /键顺序吗void delay0(uchar x); /x*0.14ms#define delaynop

21、(); _nop_();_nop_();_nop_();_nop_();unsigned char code led7code = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delay(uchar x) uchar j; while(x-)!=0) for(j=0;j4)|0xf0); if(temp=1) / p1.4 被拉低 key=0; else if(temp=2) / p1.5 被拉低 key=1; else if(temp=4) / p1.6 被拉低 ke

22、y=2; else if(temp=8) / p1.7 被拉低 key=3; else key=16; p1=0x0f; /低四位输入 列为高电平 行为低电平 delay(1);temp=p1; /读p1口 temp=temp&0x0f; temp=(temp|0xf0); if(temp=2) / p1.1 被拉低 key=key+0; else if(temp=4) / p1.2 被拉低 key=key+4; else if(temp=8)/ p1.3 被拉低 key=key+8; else key=16; dis_buf = key; /键值入显示缓存 dis_buf = dis_buf

23、 & 0x0f; void keydown(void) p1=0xf0;if(p1!=0xf0) /判断按键是否按下 如果按钮按下 会拉低p1其中的一个端口 keyscan(); /调用按键扫描程序 main() p0=0xff; /置p0口 p1=0xff; /置p1口 delay(10); /延时 while(1) keydown(); /调用按键判断检测程序 p0 = led7codedis_buf%16&0x7f; /led7 0x7f为小数点 共阴和共阳此处也是不一样; %16表示输出16进制 五设计心得通过这次课程设计,加深了对知识的理解,也非常的清楚的认识了这门课程的重要性,也意

24、识到了自己在程序设计方面的薄弱性。希望在以后的学习和工作中能进一部的加强自己专业素质和实践动手能力,并在单片机程序设计语言方面要实现从汇编语言到 c 语言的跳转。六参考文献赵新民,王祁智能仪器设计基础。哈尔滨工业大学出版社七附录程序#include #include #define _nop() _nop_() /*定义空指令*/ #define uchar unsigned char#define uint unsigned int uchar code saw_tab= /每隔数字8,采取一次0xc0,0xbc,0xb8,0xb4,0xb0,0xac,0xa8,0xa4,0xa0,0x9c

25、,0x98,0x94,0x90,0x8c,0x88,0x84,0x80,0x7c,0x78,0x74,0x70,0x6c,0x68,0x64,0x60,0x5c,0x58,0x54,0x50,0x4c,0x48,0x44,0x40,0x3c,0x38,0x34,0x30,0x2c,0x28,0x24,0x20,0x1c,0x18,0x14,0x10,0x0c,0x08,0x04,0x00;uchar code maichong_tab=255,255,255,255,255,2550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0

26、,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,

27、0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,;uchar dis_buf; /显示缓存uchar temp;uchar key,flag=0; /键顺序吗void delay0(uchar x); /x*0.14ms#define delaynop(); _nop_();_nop_();_nop_();_nop_();sbit ls138a = p22; /定义138译码器的输入a脚由p2.2控制 sbit ls138b = p23; /定义138

28、译码器的输入脚b由p2.3控制sbit ls138c = p24; /定义138译码器的输入脚c由p2.4控制void delay9(unsigned int i); /函数声名char delaycnt; /此表为 led 的字模, 共阴数码管 0-9 - unsigned char code disp_tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; unsigned char code disp_tab1 = 0x76,0x79,0x38,0x38,0x3f;bit ack; /*应答标志位*/sbit scl=p

29、21; /i2c 时钟 sbit sda=p20; /i2c 数据 void start_i2c() sda=1; /*发送起始条件的数据信号*/ _nop(); scl=1; _nop(); /*起始条件建立时间大于4.7us,延时*/ _nop(); _nop(); _nop(); _nop(); sda=0; /*发送起始信号*/ _nop(); /* 起始条件锁定时间大于4s*/ _nop(); _nop(); _nop(); _nop(); scl=0; /*钳住i2c总线,准备发送或接收数据 */ _nop(); _nop();void stop_i2c() sda=0; /*发送

30、结束条件的数据信号*/ _nop(); /*发送结束条件的时钟信号*/ scl=1; /*结束条件建立时间大于4s*/ _nop(); _nop(); _nop(); _nop(); _nop(); sda=1; /*发送i2c总线结束信号*/ _nop(); _nop(); _nop(); _nop();void sendbyte(unsigned char c) unsigned char bitcnt; for(bitcnt=0;bitcnt8;bitcnt+) /*要传送的数据长度为8位*/ if(cbitcnt)&0x80)sda=1; /*判断发送位*/ else sda=0; _

31、nop(); scl=1; /*置时钟线为高,通知被控器开始接收数据位*/ _nop(); _nop(); /*保证时钟高电平周期大于4s*/ _nop(); _nop(); _nop(); scl=0; _nop(); _nop(); sda=1; /*8位发送完后释放数据线,准备接收应答位*/ _nop(); _nop(); scl=1; _nop(); _nop(); _nop(); if(sda=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ scl=0; _nop(); _nop();unsigned char rcvbyte() unsigned char

32、 retc; unsigned char bitcnt; retc=0; sda=1; /*置数据线为输入方式*/ for(bitcnt=0;bitcnt8;bitcnt+) _nop(); scl=0; /*置时钟线为低,准备接收数据位*/ _nop(); _nop(); /*时钟低电平周期大于4.7s*/ _nop(); _nop(); _nop(); scl=1; /*置时钟线为高使数据线上数据有效*/ _nop(); _nop(); retc=retc 0; i-) for(j = 200; j 0; j-);bit dacconversion(unsigned char sla,un

33、signed char c, unsigned char val) start_i2c(); /启动总线 sendbyte(sla); /发送器件地址 if(ack=0)return(0); sendbyte(c); /发送控制字节 if(ack=0)return(0); sendbyte(val); /发送dac的数值 if(ack=0)return(0); stop_i2c(); /结束总线 return(1);void delay(uint x) uchar j; while(x-)!=0) for(j=0;j4)|0xf0); if(temp=1) / p1.4 被拉低 key=0;

34、else if(temp=2) / p1.5 被拉低 key=1; else if(temp=4) / p1.6 被拉低 key=2; else if(temp=8) / p1.7 被拉低 key=3; else key=16; p1=0x0f; /低四位输入 列为高电平 行为低电平 delay(1);temp=p1; /读p1口 temp=temp&0x0f; temp=(temp|0xf0); if(temp=2) / p1.1 被拉低 key=key+0; else if(temp=4) / p1.2 被拉低 key=key+4; else if(temp=8)/ p1.3 被拉低 ke

35、y=key+8; else key=16; dis_buf = key; /键值入显示缓存 dis_buf = dis_buf & 0x0f; void keydown(void) p1=0xf0;if(p1!=0xf0) /判断按键是否按下 如果按钮按下 会拉低p1其中的一个端口 keyscan(); /调用按键扫描程序 void delay5(unsigned int time) for(time;time0;time-); void bmain() uint h=50; p0=0xff; /置p0口 p1=0xff; /置p1口 delay(10); /延时 while(h-) unsi

36、gned int i; unsigned int ledout10;ledout0=disp_tabkey%10000/1000; ledout1=disp_tabkey%1000/100|0x80; ledout2=disp_tabkey%100/10; ledout3=disp_tabkey%10; ledout4=disp_tabkey%10000/1000; /千位 ledout5=disp_tabkey%1000/100|0x80; /百位带小数点 ledout6=disp_tabkey%100/10; /十位 ledout7=disp_tabkey%10; /个位 for( i=0; i9; i+) /实现8位动态扫描循环 p0 = ledouti; /将字模送到p0口显示 switch(i) /使用switch 语句控制位选 case 0:ls138a=0; ls138b=0; ls138c=0; break; case 1:ls138a=1; ls138b=0; ls138c=0; break; case 2:ls138a=0; ls138b=1; ls138c=0; break; case 3:ls138a=1; ls138b=1; ls138c=0; break; case

温馨提示

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

评论

0/150

提交评论