哈尔滨理工大学课程实践题目: 智能仪器原理及设计姓名: xxxxxxxx班级: 测控12-5班学号:**********指导教师:苑惠娟成绩:完成时间:2015年6月18日目录目录 (2)一、实验目的及其意义 (3)1.1 实验目的 (3)1.2 实验意义 (3)二、实验内容 (4)2.1 设计波形 (4)2.2 设计内容 (4)2.3 实验用设备 (4)三、实验要求 (4)3.1 绘制原理图及线路板图 (4)3.2 编写程序完成以下任务 (4)3.3 实验安排 (5)四、硬件电路设计 (5)4.1 单片机电路 (5)4.2 显示及键盘接口电路 (5)4.3 D/A转换电路 (6)4.4 USB串口模块 (7)4.5 时钟电路和复位电路 (7)4.6 8路LED (9)4.7 PCB设计图 (9)五、程序设计 (10)六、软硬件调试 (16)七、波形图 (16)八、心得体会 (17)九、参考文献 (18)一、实验目的及其意义1.1 实验目的(1)设计动态LED显示、键盘,画出原理图及线路板图,使学生对智能仪器中最基本的输入输出方法具有感性认识。
(2)通过一个相对完整的程序编程,使学生能够将单片机知识和智能仪器的设计融会贯通,同时掌握对智能仪器的软件构成及“硬件软化”方法。
1.2 实验意义波形发生器作为一种常用的信号源,是现代测试领域内应用最广泛的通用仪器之一。
波形发生器是能够产生大量的标准信号和用户定义信号,并保证高精度、高稳定性、可重复性和易操作性的电子仪器。
函数波形发生器具有连续的相位变换、和频率稳定性等优点,不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能够与其它仪器进行通讯,组成自动测试系统,因此被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。
在70 年代前,信号发生器主要有两类:正弦波和脉冲波,而函数发生器介于两类之间,能够提供正弦波、余弦波、方波、三角波、上弦波等几种常用标准波形,产生其它波形时,需要采用较复杂的电路和机电结合的方法。
这个时期的波形发生器多采用模拟电子技术,而且模拟器件构成的电路存在着尺寸大、价格贵、功耗大等缺点,并且要产生较为复杂的信号波形,则电路结构非常复杂。
同时,主要表现为两个突出问题,一是通过电位器的调节来实现输出频率的调节,因此很难将频率调到某一固定值;二是脉冲的占空比不可调节。
在70 年代后,微处理器的出现,可以利用处理器、A/D/和D/A,硬件和软件使波形发生器的功能扩大,产生更加复杂的波形。
这时期的波形发生器多以软件为主,实质是采用微处理器对DAC的程序控制,就可以得到各种简单的波形。
90 年代末,出现几种真正高性能、高价格的函数发生器、但是HP公司推出了型号为HP770S的信号模拟装置系统,它由HP8770A任意波形数字化和HP1776A波形发生软件组成。
HP8770A实际上也只能产生8 中波形,而且价格昂贵。
不久以后,Analogic公司推出了型号为Data-2020的多波形合成器,Lecroy 公司生产的型号为9100 的任意波形发生器等。
到了二十一世纪,随着集成电路技术的高速发展,出现了多种工作频率可过GHz 的DDS 芯片,同时也推动了函数波形发生器的发展,2003 年,Agilent的产品33220A能够产生17 种波形,最高频率可达到20M,2005 年的产品N6030A 能够产生高达500MHz 的频率,采样的频率可达1.25GHz。
由上面的产品可以看出,函数波形发生器发展很快近几年来,国际上波形发生器技术发展主要体现在以下几个方面:(1)过去由于频率很低应用的范围比较狭小,输出波形频率的提高,使得波形发生器能应用于越来越广的领域。
波形发生器软件的开发正使波形数据的输入变得更加方便和容易。
波形发生器通常允许用一系列的点、直线和固定的函数段把波形数据存入存储器。
同时可以利用一种强有力的数学方程输入方式,复杂的波形可以由几个比较简单的公式复合成v=f (t)形式的波形方程的数学表达式产生。
从而促进了函数波形发生器向任意波形发生器的发展,各种计算机语言的飞速发展也对任意波形发生器软件技术起到了推动作用。
目前可以利用可视化编程语言(如Visual Basic ,Visual C 等等)编写任意波形发生器的软面板,这样允许从计算机显示屏上输入任意波形,来实现波形的输入。
(2)与VXI资源结合。
目前,波形发生器由独立的台式仪器和适用于个人计算机的插卡以及新近开发的VXI模块。
由于VXI总线的逐渐成熟和对测量仪器的高要求,在很多领域需要使用VXI系统测量产生复杂的波形,VXI的系统资源提供了明显的优越性,但由于开发VXI模块的周期长,而且需要专门的VXI机箱的配套使用,使得波形发生器VXI模块仅限于航空、军事及国防等大型领域。
在民用方面,VXI模块远远不如台式仪器更为方便。
(3)随着信息技术蓬勃发展,台式仪器在走了一段下坡路之后,又重新繁荣起来。
不过现在新的台式仪器的形态,和几年前的己有很大的不同。
这些新一代台式仪器具有多种特性,可以执行多种功能。
而且外形尺寸与价格,都比过去的类似产品减少了一半。
在研制、生产、测试和维修各种电子元件、部件及整机设备时,都需要用信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器、它可以产生多种波形信号,如正弦波、三角波、方波等,因而广泛用于通信、雷达、导航、宇航等领域。
此次课程设计使我们能够学以致用,将自己所学的理论知识用于实践,提高我们动手能力,也使我们初步掌握一些分析问题和解决问题的方法,使我们从中体会到理论问题转化为实际问题所要经过的过程和两者之间的差距。
二、实验内容2.1 设计波形输出方波和正弦波。
2.2 设计内容(1)设计数字式波形发生器,画出硬件电路原理图。
(2)编写程序生成各种波形,而且频率可调。
(3)确定所生成的波形频率范围。
(4)用键盘控制生成的波形及频率。
(5)数码管显示输出波形的类型及频率。
2.3 实验用设备HC6800实验板,示波器,计算机三、实验要求3.1 绘制原理图及线路板图(1)6位数码显示(动态数码管显示方式)。
(2)6个按键,4个发光管显示。
3.2 编写程序完成以下任务(1)键盘识别。
(2)动态LED显示。
(3)使用按键通过D/A输出要求的波形并显示频率。
3.3 实验安排四、硬件电路设计4.1 单片机电路图4-14.2 显示及键盘接口电路功能:LED显示,按键扫描。
由LED数码管显示器和独立按键组成,独立按键与89C51的P1口相连,而单片机的P0口与LED数码管连接。
当某一按键按下一次时,扫描程序扫描到之后,通过P0口将信号发送到LED。
扫描及显示利用程序实现,不断扫描独立按键,当某一按键按下时,随即执行程序段,完成相应的功能。
当按下键1输出正弦波,键2输出方波,键3控制频率调小,键4控制频率调大。
图4-2-1 共阴极数码管图4-2-2 六路独立按键4.3 D/A转换电路功能:将波形样值编码转换成模拟值,输出波形。
由一片PCF8591组成。
PCF8591是具有I2C总线接口的8位A/D及D/A转换器。
有四路A/D转换输入,1路D/A模拟输出,也就是既可以作D/A转换也可以作A/D转换。
PCF8591靠数据线SDA和时钟线SCL和90C51联系。
单片机以I2C协议向PCF8591发送数字编码,产生不同的输出。
利用采样定理对各种波形进行抽样,然后把各种采样值进行编码,收到的数字量存入各个波形表,执行程序时通过查表的方法依次取出,经过D/A转换后输出就可以得到波形。
如N个点构成波形的一个周期,则PCF8591输出N个样点值后,样值点形成运动轨迹,即一个周期。
利用单片机的中断时间控制输出周期的速度,也就是控制输出的波形的频率。
图4-3 D/A转换电路电路图4.4 USB串口模块图4-44.5 时钟电路和复位电路单片机的时钟信号用来提供单片机内各种微操作的时间基准;复位操作则使单片机的片内电路初始化,使单片机从一种确定的状态开始运行。
(1)时钟电路单片机的时钟信号通常用两种电路形式得到:内部振荡和外部振荡方式。
图4-5-1 时钟部分电路图在引脚XTAL1和XTAL2外接晶体振荡器或陶瓷谐振荡器,构成了内部振荡方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自积振荡,并产生振荡时钟脉冲。
晶振通常选用6MHZ、12MHZ、或24MHZ。
单片机的时序单位振荡周期:晶振的振荡周期,又称时钟周期,为最小的时序单位。
状态周期:振荡频率经单片机内的二分频器分频后提供给片内CPU的时钟周期。
因此一个状态周期包含2个振荡周期。
机器周期:1个机器周期由6个状态周期12个振荡周期组成,是计算机执行一种基本操作的时间单位。
指令周期:执行一条指令所需的时间。
一个指令周期由1-4个机器周期组成,依据指令不同而不同.(2)单片机的复位状态当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。
上电复位要求接通电源后,自动实现复位操作。
上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。
上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。
当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
图4-5-2 复位电路单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。
单片机冷启动后,片内RAM 为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。
51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,至于内部RAM内部的数据则不变。
4.6 8路LED发光二极管用于按键检测,检查按键扫描是否成功,以验证程序的有效性。
图4-6 8路LED4.7 PCB设计图五、程序设计#include<reg52.h>#include <I2C.H>#define PCF8591 0x90 //PCF8591 ??unsigned char AD_CHANNEL;unsigned long xdata LedOut[8];unsigned char D=127;unsigned char flag=0,time1=0,timeflag=0,num=1;unsigned char signal=0;float freq;unsigned int frequence,freqtemp=0;float time=1000;unsigned int time0;unsigned char code SinTab[250]={109,112,114,117,119,122,125,127,130,133,135,138,140,143,145,148,150,153,155,15 8,160,162,165,167,169,171,173,176,178,180,182,184,186,187,189,191,193,194,196,197,199,200,202,203,204,20 6,207,208,209,210,211,212,213,213,214,215,215,216,216,216,217,217,217,217,217,217,216,216,216,215,215,21 4,213,213,212,211,210,209,208,207,206,204,203,202,200,199,197,196,194,193,191,189,187,186,184,182,180,17 8,176,173,171,169,167,165,162,160,158,155,153,150,148,145,143,140,138,135,133,130,127,125,122,119,117,11 4,112,109,106,104,101,98,96, 93, 90, 88, 85, 83, 80, 77, 75, 72,70, 67, 65, 63, 60, 58, 55, 53, 51, 49,46, 44, 42,40, 38, 36, 34,32, 30, 29, 27, 25, 23, 22, 20, 19,17, 16, 15, 13,12, 11, 10, 9, 8, 7, 6, 5, 4,4, 3, 3, 2, 2,1, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8,9, 10, 11, 12 ,13, 15, 16, 17, 19,20, 22, 23, 25, 27, 29, 30, 32, 34, 36, 38, 40, 42, 44, 46, 49, 51, 53, 55, 58, 60, 63, 65, 67, 70, 72,75, 77, 80, 83, 85, 88, 90, 93, 96, 98, 101,104,106,109};sbit key1=P1^1;sbit key2=P1^2;sbit key3=P1^3;sbit key4=P1^4;sbit key5=P1^5;sbit key6=P1^6;sbit ssss=P3^4;#define uchar unsigned char#define uint unsigned intuchar dis_buf; //uchar temp;uchar key; //void delay0(uchar x); //x*0.14MSvoid keydown(void);#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};// LED 0 1 2 3 4 5 6 78 9 a b c d e funsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x3 9,~0x5E,~0x79,~0x71};sbit LS138A = P2^2; //??138A??P2.2??sbit LS138B = P2^3; //??138B?P2.3??sbit LS138C = P2^4; //??138C?P2.4??sbit ceshi=P3^4;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};unsigned char flag1=0,flag2=0,flag3=0;/******************************************************************* DAC ??,*******************************************************************/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val){Start_I2c(); //SendByte(sla); //if(ack==0)return(0);SendByte(c); //if(ack==0)return(0);SendByte(Val); //??DACif(ack==0)return(0);Stop_I2c(); //return(1);}/******************************************************************** ******** * * ********************************************************************** *******/void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void keydown(){if(key1==0){delay(1);if(key1==0){TR0=0;TR1=0;signal=1;flag1=1;flag2=0;flag3=0;freq=100000/(0.250*1000*num); frequence=(unsigned int)freq;while(key1==0);TR0=1;TR1=1;}}}if(key3==0){delay(1);if(key3==0){TR0=0;TR1=0;signal=3;flag3=1;flag1=0;flag2=0;freq=10000/(0.002*1000*num);fr equence=(unsigned int)freq;while(key3==0);TR0=1;TR1=1;}if(key4==0){delay(1);if(key4==0){TR0=0;TR1=0;num+=1;if(flag1==1){freq=100000/(0.250*1000*num);frequence=(unsigned int)freq;}if(flag2==1){freq=100000/(0.22*1000*num);frequence=(unsigned int)freq;}if(flag3==1){freq=10000/(0.002*1000*num);frequence=(unsigned int)freq;}while(key4==0);TR0=1;TR1=1;}}if(key5==0){delay(1);if(key5==0){TR0=0;TR1=0;num-=1;if(num==0)num=1;if(flag1==1){freq=100000/(0.250*1000*num);frequence=(unsigned int)freq;}if(flag2==1){freq=100000/(0.22*1000*num);frequence=(unsigned int)freq;}if(flag3==1){freq=10000/(0.002*1000*num);frequence=(unsigned int)freq;}while(key5==0);TR0=1;TR1=1;}}}//******************************************************************/ main()unsigned int i,j,LedNumVal=1 ;unsigned int LedOut[10];DelayCNT=0;EA=1;//ET0=1;//??T0??TMOD=0X01;//1??0.05?TR0=1;//TH0=-1000/256;//TL0=-1000%256;//while(1){DACconversion(PCF8591,0x40, D); //DACkeydown(); //if(freqtemp!=frequence){freqtemp=frequence;LedOut[0]=Disp_Tab[frequence%10000/1000];LedOut[1]=Disp_Tab[frequence%1000/100]|0x80;if(flag1==1|flag2==1)LedOut[2]=Disp_Tab[frequence%100/10];elseLedOut[2]=Disp_Tab[frequence%100/10];LedOut[3]=Disp_Tab[frequence%10];LedOut[4]=Disp_Tab[0]; //??LedOut[5]=Disp_Tab[signal]; //}for( i=0; i<8; i++){ P0 = LedOut[i];switch(i) //??switch 138??? ?????????? ??????????{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 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}for (j = 0 ; j<90 ;j++) { ;} //}time0=(int)time;P0 = 0;}}void Timer0 (void) interrupt 1 using 1//{TH0=(65535-1000)/256;//TL0=(65535-1000)%256;//timeflag++;if(timeflag==num){timeflag=0;if(flag1==1)//{time1++;if(time1==250)time1=0;D=SinTab[time1];}if(flag2==1)//{D++;if(D==220)D=0;}if(flag3==1){flag++;//??flag=flag%100;if(flag<=50)D=0;if(flag>50)D=255;}}}六、软硬件调试在单片机编程中主要出现问题:(1)键盘扫描时,多次扫描的问题,最终加入循环语句,是按键松开时执行,解决。