单片机实验指导书自制设备_第1页
单片机实验指导书自制设备_第2页
单片机实验指导书自制设备_第3页
单片机实验指导书自制设备_第4页
单片机实验指导书自制设备_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

单片机原理与应用技术吉林化工学院信控分院测控教研室TOC\o"1—2”\h\z实验二LED数码管动态描显示实验 7HYPERLINK\l”_Toc371018383”实验三外部中断实验 9实验五行列式键盘实验 15HYPERLINK\l”_Toc371018386"实验六D/A转换实验 17实验七A/D转换实验 19实验八AT24C02存储器与I2C总线实验 21实验九串行口通信实验 25HYPERLINK\l”_Toc371018390”实验十DS1302时钟与SPI总线实验 28_Toc371018392”实验十直流电机驱动实验 33一.实验目的1.了解keil软件程序设计与调试方法;2.掌握I/O接口电平输出控制方法;3.掌握延时函数程序的设计原理和调试方法。二.实验要求编写一个延时函数程序,控制接在P1口的八个发光二极管逐次点亮(即每次中断点亮一个),形成“流水灯”效果。三.实验电路连线AT89C51单片机的P1.0~P1。7口接LED显示模块的D0~D7。四.实验说明方法1:采用延时函数的流水灯程序。在单片机中每条语句的执行都是要消耗系统时间的,所以简单的延时程序只需要执行一些语句就可以实现,但这些语句不应该影响到单片机工作状态(例如IO口状态)。因此延时程序通常都是由一些空循环语句来实现,例如空操作的for语句或者while语句实现,为了能够方便的改变延时时间,通常我们可以为延时函数设置一个传递参数,以便在不同情况下调用产生不同的延时时间。实验参考程序如下:#include〈reg51。h>#defineBYTEunsignedcharBYTEIntTimes=0;BYTEt=0x01;voidLed_Loop(){ P1=~t; t=t〈〈1; if(t==0x00) t=0x01;}voidDelay(intmS){BYTEI;While(mS—-){for(i=0;i〈100;i++);}}voidmain(){ while(1){Led_Loop();Delay(500);}}方法2:拓展实验,采用定时计数器的延时流水灯程序。程序设计思路为:主程序将T0初始化为定时器,工作在方式1,定时时间为100ms。同时将立即数0x01赋值给t,并将t的内容送P1口输出。每当定时时间到,在T0的中断服务程序中完成定时初值的重新赋值,同时将t的内容循环左移一次并从P1口输出。运行如下程序后就可以看到流水灯的效果了。程序设计的参考流程如图1所示。(a)主程序流程图(b)T0中断服务子程序流程图图1流水灯程序流程图实验参考程序如下:#include〈reg51。h>#defineBYTEunsignedcharBYTEIntTimes=0;BYTEt=0x01;voidT0_INT()interrupt1{ IntTimes++; if(IntTimes>=10) { IntTimes=0; P1=~t; t=t<〈1; if(t==0x00){ t=0x01;} } TH0=0x4c;TL0=0x00;}Timer_Init(){ TMOD|=0x01; //T0和T1定时模式,方式一 TH0=0x4c;TL0=0x00; //设T0初值,50毫秒,晶振:11。0592MHz ET0=1; //开启T0中断 EA=1; //开启总中断 TR0=1; //启动T0}voidmain(){ Timer_Init(); while(1);}一.实验目的1.了解七段数码管显示的基本原理;2.掌握LED数码管动态显示的基本原理;3.掌握数码管动态显示程序的设计方法。二.实验要求利用动态扫描方法在六位数码管上显示出稳定的123456.三.实验电路连线AT89C51单片机的P0。0~P0。7口接段选a~p,P2。5~P2。0口接位选LD0~LD5.数码管硬件电路如图1所示。图1数码管硬件电路四.实验原理所谓动态扫描显示即轮流向各位数码管送出“段码”和相应的“位选”,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。其电路将所有位数码管的段选线并联在一起,由“位选”控制是哪一位数码管有效,这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路.实验电路中的Led数码管采用共阳型数码管。显示原理:将相应的“位选”信号有效(低电平),相应的数码段置以低电平,对应的段就会变亮。五.实验说明单片机的P0口输出显示段码,P2口输出位码控制,输出6个字符.执行如下程序后,观察LED显示结果。实验参考程序如下:#include〈reg51。h〉#defineSegment_IOP0#defineBit_IOP2unsignedcharseg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};//段码表/*0123456789。*/unsignedcharbit_code[6]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选码,从右到左unsignedcharbuffer[6];//显示数据段码缓存unsignedcharbit_sel;//位选变量voiddelay(void)//延时{unsignedchart0;for(t0=30000;t0〉0;t0--);}voidLedDisplay(floatNUM){buffer[0]=NUM%10;buffer[1]=NUM%100/10;buffer[2]=NUM%1000/100;buffer[3]=NUM%10000/1000;buffer[4]=NUM%100000/10000; buffer[5]=NUM/100000;Bit_IO=0xdf; Segment_IO=seg_code[buffer[bit_sel]]; Bit_IO=bit_code[bit_sel]; bit_sel++; if(bit_sel>5) { bit_sel=0; } delay();}voidmain(void){ bit_sel=0; while(1) { LedDisplay(123456); }}一.实验目的1.了解MCS-51系列单片机中断系统结构;2.掌握MCS—51系列单片机中断地址与中断向量号;3.掌握MCS-51系列单片机外部中断INT0、INT1程序设计方法。二.实验要求用单次脉冲申请外部中断INT0或者INT1,在中断处理程序中使P1.0的输出状态发生反转,并通过发光二极管观察P1。0的电平。三.实验电路连线单片机P1。0口接LED显示模块的D0,INT0(P3。2)或者INT1(P3。3)口接按键模块的K0。四.实验原理AT89C51单片机有5个中断源,有两个中断优先级,高优先级的中断源可以中断低优先级的服务程序,反之不行。当两个同样级别的中断申请同时到来时,则按一个固定的查寻次序来处理中断响应。AT89C51单片机的5个中断源及其优先级次序如表1所示.表1AT89C51单片机的中断源中断源入口地址优先级顺序说明外部中断00003H最高来自P3.2引脚(INT0)的外部中断请求定时/计数器0000BH定时/计数器T0溢出中断请求外部中断10013H来自P3.3引脚(INT1)的外部中断请求定时/计数器T1001BH定时/计数器T1溢出中断请求串行口0023H最低串行口完成一帧数据的发送或接收中断AT89C51单片机没有专门的开中断和关中断指令,中断的开放和关闭是由特殊功能寄存器IE来实现两级控制的.所谓两级控制是指在寄存器IE中有一个总允许位EA,当EA=0时,就关闭了所有的中断申请,CPU不响应任何中断申请。而当EA=1时,对各中断源的申请是否开放,还要看各中断源的中断允许位的状态。中断允许寄存器IE的地址为A8H,其中各位都可以位寻址,位地址为A8H~AFH.总允许位EA和各中断源允许位在IE寄存器中的分布如下:D7D6D5D4D3D2D1D0EA—-ESET1EX1ET0EX0其中各控制位的含义如下:EA:中断总允许位。EA=0时,CPU关闭所有的中断申请,只有EA=1时,才能允许各个中断源的中断申请,但还要取决于各中断源中断允许控制位的状态。ES:串行口中断允许位。ES=1,串行口开中断,ES=0,串行口关中断。ET1:定时/计数器T1的溢出中断允许位。ET1=1允许T1溢出中断,ET1=0则不允许T1溢出中断。EX1:外部中断1(INT1)的中断允许位。ET1=1允许外部中断1申请中断,EX1=0则不允许中断。ET0:定时/计数器T0的溢出中断允许位。ET0=1允许中断,ET0=0不允许中断.EX0:外部中断0(INT0)的中断允许位.EX0=1允许中断,EX0=0不允许中断。AT89C51单片机在复位时,IE各位的状态都为“0”AT89C51单片机的中断优先级控制比较简单,每个中断源的优先级别由特殊功能寄存器IP来管理。IP寄存器的地址为B8H,格式如下:D7D6D5D4D3D2D1D0—--PSPT1PX1PT0PX0其中各位的含义如下:PS:串行口中断优先级控制位.PT1:定时器/计数器T1中断优级控制位。PX1:外部中断INT1中断优先级控制位。PT0:定时器/计数器T0中断优先级控制位。PX0:外部中断INT0中断优先级控制位。IP寄存器中若某一个控制位置“1”,则相应的中断源就规定为高优先级中断,反之,若某一个控制位置“0"外部中断触发方式通过特殊功能寄存器TCON(地址为88H)控制,TCON中各控制位分布如下:D7D6D5D4D3D2D1D0TF1-TF0-IE1IT1IE0IT0其中各控制位的含义如下:IT0:选择外中断INT0的中断触发方式。IT0=0为电平触发方式,低电平有效。IT0=1为负边沿触发方式,INT0脚上的负跳变有效。IT0的状态可以用指令来置“1”或清“0IE0:外中断INT0的中断申请标志。当检测到INT0上存在有效中断申请时,由硬件使IE0置位。当CPU转向中断服务程序时,由硬件清“0"IE0中断申请标志。IT1:选择外中断INT1的触发方式(功能与TI0类似)。IE1:外部中断INT1的中断申请标志(功能与IE0类似)。TF0:定时/计数器T0溢出中断申请标志.当T0溢出时,由内部硬件将TF0置“1",当CPU转向中断服务程序时,由硬件将TF0清“0”TF1:定时器1溢出中断申请标志(功能与TF0相同).可见定时/计数器溢出中断和外部中断的申请标志,在CPU响应中断之后能够自动撤除。AT89C51单片机在接收到中断源发来的中断申请以后,先把这些申请锁定在各自的中断标志位中,然后在下一个机器周期按表2—1规定的内部优先顺序和中断优先级分别来查询这些标志,并在一个机器周期之内完成检测和优先排队。响应中断的条件有三个:(1)必须没有同级或更高级别的中断正在得到响应,如果有的话,则必须等CPU为它们服务完毕,返回主程序并执行一条指令之后才能响应新的中断申请。(2)必须要等当前正在执行的指令执行完毕以后,CPU才能响应新的中断申请.(3)若正在执行的指令是RETI(中断返回)或是任何访问IE寄存器或IP寄存器的指令,则必须要在执行完该指令以及紧随其后的另外一条指令之后才可以响应新的中断申请.CPU响应中断后将自动跳转到中断源的入口地址开始执行程序,每个中断源都有其固定的入口地址,它们的处理过程也有所区别.一般情况下,中断处理包括两个部分:一是保护现场,二是为中断服务。所谓保护现场就是将需要在中断服程序中使用而又不希望破坏其中原来内容的工作寄存器压入堆栈中保护起来,等中断服务完成后再从堆栈中弹出以恢复原来的内容。通常需要保护的寄存器有PSW、ACC以及其他工作寄存器.五.实验说明采用外部中断INT0触发P1。0的输出状态反转。P1.0接LED灯,INTO(P3.2)端接单脉冲发生器。执行如下程序,每按一次单脉冲按钮,注意观察LED的状态。#include〈reg51。h〉sbitLED=P1^0;voidexter0()interrupt0//用外部中断0{ LED=!LED;}voidmain(){ EX0=1;//开外部中断0 IT0=1;//TCON=0x01,IT0=1时下降沿触发,IT0=0时低电平触发EA=1;//开总中断 while(1){}}一.实验目的通过本实验了解MCS-51单片机内部定时/计数器的基本结构,掌握定时/计数器的初始化方法,以及中断处理程序的编程方法。二.实验要求1.定时器模式实验:AT89C51内部定时器T0用中断方式计时,实现每一秒钟使P1.0的输出状态发生一次反转,从而形成方波输出,并点亮发光二极管LED0。2.计数器模式实验:AT89C51内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,计数值通过P1、P2口驱动LED数码管显示出来三.实验电路连线1.AT89C51单片机的P1。0口接发光二极管模块的D0。2.单片机P2.0口接数码管显示模块的位选,P1.0~P1。7口接段选a~p,P3。4口接按键模块的K0。四.实验原理AT89C51单片机内部有两个16位可编程定时/计数器,记为T0和T1。它们的工作方式可以通过指令对相应特殊功能寄存器编程来设定,或作定时器用,或作外部事件计数器用。定时/计数器在硬件上由双字节加法计数器TH和TL组成,作定时器使用时,计数脉冲由单片机内部振荡器提供,计数频率为fosc/12,每个机器周期加1。作计数器使用时,计数脉冲由P3口的P3.4(或P3。5)即T0(或T1)引脚输入,外部脉冲的下降沿触发计数,计数器在每个机器周期期间采样外部脉冲,若一个周期的采样值为1,下一个周期的采样值为0,则计数器加1,故识别一个从0到1的跳变需要2个机器周期,所以对外部计数脉冲的最高计数频率为fosc/24,同时还要求外部脉冲的高低电平保持时间均要大于一个机器周期.定时/计数器的工作方式由特殊功能寄存器TMOD编程决定,定时/计数器的启动运行由特殊功能寄存器TCON编程控制。不论用作定时器还是用作计数器,每当产生溢出时,都会向CPU发出中断申请。方式控制寄存器TMOD的地址为89H,控制字格式如下:D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0低4位为T0的控制字,高4位为T1的控制字,其中各位的具体含义介绍如下。GATE为门控位。它对定时/计数器的启动起辅助控制作用.GATE=1时,定时/计数器的计数受外部引脚P3。2(INT0)或P3.3(INT1)输入电平的控制,此时只有当P3口的P3.2(或P3.3)引脚即INT0(或INT1)上的电平为1才能启动计数;GATE=0时,定时器/计数器的运行不受外部引脚输入电平的控制。表2定时/计数器的方式选择M1M0工作方式00方式0,为13位定时/计数器。01方式1,为16位定时/计数器.10方式2,为自动重装常数的8位定时/计数器。11方式3,仅适用于T0,分成2个8位定时/计数器。C/T为方式选择位。C/T=0为定时器方式,采用单片机内部振荡脉冲的12分频信号作为计数脉冲,若采用12MHz的晶振,则计数频率为1MHz,从计数值便可计算出定时时间。C/T=1为计数器方式,采用外部引脚(T0为P3。4,T1为P3.5)的输入脉冲作为计数脉冲,当T0(或T1)上的输入信号发生从高到低的负跳变时,计数器加1.最高计数频率为单片机晶振频率的1/24。M1、M0二位的状态确定定时/计数器的工作方式,详见表2。定时/计数器控制寄存器TCON的地址为88H,格式如下:D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TF1为定时/计数器T1的溢出标志位。当T1被允许计数以后,T1从初值开始加1计数,计数器的最高位产生溢出时置“1”TF1,并向CPU申请中断,当CPU响应中断时,由硬件清“0”TF1.TF1也可由软件查询清“TR1为定时/计数器的运行控制位,由软件置位和复位.当方式控制寄存器TMOD中的GATE位为0,且TR1为1时允许T1计数,TR1为0时禁止T1计数。当GATE为1时,仅当TR1为1且INT1(P3.2)输入为高电平时才允许T1计数,当TR1为0或INT1输入为低电平时都禁止T1计数。TR0为定时器T0的运行控制位,其功能与TR1类似。TF0为定时器T0的溢出标志位,其功能与TF1类似。五.实验说明51单片机的定时/计数器在进行定时或计数之前要进行初始化编程,通常包括如下几个步骤:(1)确定工作方式,即给方式控制寄存器TMOD写入控制字。(2)计算定时器/计数器初值,并将初值写入寄存器TL和TH。(3)根据需要对中断控制寄存器IE置初值,决定是否开放定时器中断。(4)使TCON中的TR0或TR1置“1”,启动定时器/计数器。在初始化过程中,要设置定时或计数的初始值,则计算初值X的公式如下:计数方式:式中M取决于不同工作方式,可以是213、216或28。定时方式:式中,称为定时周期。1.用T0中断方式定时,每秒钟使P1.0输出状态发生一次反转将T0作定时器定时1秒,由于实验系统,为了实现定时1秒,通过中断服务程序进行定时扩展,即设置T0定时50ms产生一次中断,同时设置一个软件计数器来计数中断次数,当达到中断20次时即完成了定时1秒钟。执行如下程序,注意观察LED的状态的变化。#include<reg51。h〉#defineBYTEunsignedcharsbitLED=P1^0;BYTEIntTimes=0;voidT0_INT()interrupt1{ IntTimes++; if(IntTimes==20) { IntTimes=0; LED=!LED; } TH0=0x4c;TL0=0x00;} Timer_Init() { TMOD|=0x01; //T0定时模式,方式1 TH0=0x4c;TL0=0x00;//设T0初值,50毫秒,晶振:11。0592MHz ET0=1; //开启T0中断 EA=1; //开启总中断 TR0=1; //启动T0}voidmain(){ Timer_Init(); while(1);}2.用T0计数外部脉冲,通过P1口显示计数值采用T0作计数器,外部计数脉冲由P3。4引入,51单片机在每个机器周期采样一次输入信号,因此至少需要两个机器周期才能检测到一次脉冲跳变。这就要求被采样的外部脉冲高低电平保持时间均要大于一个机器周期,以保证电平在变化之前即被采样,并且外部计数脉冲的最高计数频率为fosc/24。程序设计的参考流程如图1示。运行程序,每按一次单脉冲按钮,T0将计数一个脉冲,注意观察数码管的状态。图1序流程图实验参考程序:unsignedintcn=0;voidmain(void){TMOD=0x05;//初始化程序TH0=TL0=0;ET0=0;EA=1;TR0=1;while(1){cn=TH0*256+TL0;//读计数值Display(cn);//调用动态显示函数,函数同实验二}}一.实验目的1.掌握键盘的键输入的基本原理。2.加深对键盘的消抖的理解和认识,掌握如何运用消抖来消除机械触点对实验的影响。3.掌握行列式键盘的键盘扫描方式。二.实验要求用AT89C51的P1口接4×4矩阵键盘,从键盘中按下相应的按钮,数码管会显示出相应的数字0~9,A~F十六种数字。对应的按键的序号排列如图4所示图4按键序号排列图三.实验电路连线AT89C51单片机的P1.0~P1.3口接行线C0~C3,P1.4~P1。7口接列线R0~R3,P0.0~P.7口接LED显示模块的段选a~g,P2.7和P2。6口分别接位选LD4和LD5。四.实验原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.扫描法要逐列扫描查询,当被按下的键处于最后1列时,则要经过多次扫描才能最后获得此按键所处的行列值。而线反转法则显得很简练,无论被按键是处于第1列或最后1列,均只需要经过2步便能获得此按键所在的行列值,线反转法的原理如图5所示。这样,一个端口就可以构成4×4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。图1矩阵键盘电路原理图下面介绍线反转法的2个具体操作步骤:第1步,让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。第2步,再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低所在列为按键所在列。结合上述2步的结果,可确定按键所在行和列,从而识别出所按的键。五.实验说明编写程序,从矩阵键盘中按下按键,观察LED数码管的状态。一.实验目的1.了解D/A转换的基本原理.2.了解D/A转换芯片0832的性能及编程方法.3.了解单片机系统中扩展D/A转换的基本方法。二.实验要求1.DAC0832将数字量转换成模拟电压,并用电压表测量输出电压.2.编制程序产生正弦波、锯齿波、三角波。(需用示波器观察,选作)三.实验电路连线将P0、P2总线开关闭合,使DAC0832的连接至51单片机总线即可。四.实验说明DAC0832在实验箱上是采用外部总线方式连接的,总线地址为9000H,单片机的外部总线扩展电路如图1所示,DAC0832电路图如图2所示,为DAC0832提供电压基准的电路如图3所示。图1单片机外部总线原理图图2DAC0832电路原理图图3实验箱基准电路原理图在电路图2中DAC0832电路是双极性DAC转换电路,实验时仅需要将数字量B由CPU送至9000H端口即可.电压关系:(Vref为2.5V)任意1字节数D/A转换的参考程序如下:#include<reg51.h>#include〈absacc。h〉#defineBYTEunsignedchar#defineDA_ADDR0x9000voidDA_Out(BYTEx){ XBYTE[DA_ADDR]=x;}voidmain(){ DA_Out(128);while(1) { }}一.实验目的1.掌握A/D转换与单片机的接口原理。2.了解A/D芯片ADC0804转换性能及编程。3.通过实验了解单片机如何进行数据采集.二.实验要求编写实验程序,采用ADC0804对电位器产生的模拟电压进行测量,测量结果在数码上进行显示。三.实验电路连线1.模块电位器Vout点接ADC0804的ADIN;2。闭合P0、P2总线开关连接DAC;3。单片机P2。3~P2。0口接数码管显示模块的位选LD2~LD5,P1.0~P1.7口接段选a~p.四.实验说明其中总线电路如图1,A/D转换原理图如图2所示,电位器模拟电压产生电路如图3所示。ADC0804的总线地址8000HADC0804电路的电压基准Vref为VCC,即5V供电电源。电压与测量数据关系为:(D为采用ADC转换结果)图1单片机外部总线原理图图2ADC0804电路原理图图3电位器模拟电压产生电路原理图一.实验目的了解I2C总线协议,器件地址、器件子地址含义,掌握I2C总线控制时序;掌握AT二.实验要求编写调试基于I2C的EEPROM芯片AT24C三.实验电路连线将AT89C51单片机的P1.1和P1。2口分别接EEPROM芯片AT24C02的SCL和SDA。四.实验原理1.信号定义I2C总线的时钟线SCL与数据线SDA均为双向传输线。在总线备用时,这两条线均保持高电平。当时钟线保持高电平,数据线出现由高电平向低电平变化时,启动I2C总线,这就是I2C总线的启动信号。在时钟线保持高电平期间,数据线上出现由低到高的电平变化,将结束I2C总线的数据传输,此信号即为I2C图8I2C起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。对于不具备I2C2.数据传输过程I2C总线上的数据传输如图9所示。由图可见,I2C总线上每一次数据传输均开始于主控器发出的启动信号,传输的每一字节均为8位,但每启动一次I图9I2C与每一字节后的应答信号相对应的时钟(第9个时钟)由主控器产生。数据发送器件必须在这一时钟位上释放数据线,使其处于高电平状态,以便使数据接收器件能在这一位上送出应答信号,如图10所示。若接收器输出低电平,则为应答信号ACK,输出高电平则为非应答信号NOACK。当主控器发送数据时,如果被控器不产生应答信号,主控器就产生一个停止信号来终止传输过程。图10I2C当主控器接收数据时,若不想再接收或接收完最后一个字节,必须给被控器发送一个非应答位,使被控器释放总线,然后主控器再发一个停止信号结束传输过程。当总线上的接收器接收一字节后,如果无法立即接收下一字节数据,可将SCL钳位于低电平,这样总线就进入等待状态,直到接收器准备好接收新数据时再释放时钟线,使数据传输能继续正常进行。I2C总线上的数据传输必须符合一定的格式,每次数据传输均始于主控器发出的启动信号,然后为寻址字节,包括7位的被控器地址和1位方向位。方向位为“0”代表主控器要对被控器进行写入操作,为“五.实验说明根据EEPROM芯片AT24C02的手册,严格按照其时序编写程序。启动I2C、停止I2/*名称:I2C_Start*/voidI2C_Start(){ SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; //钳位I2C}/*名称:I2C_StopvoidI2C_Stop(){ SDA=0; delay(); SCL=1; delay(); SDA=1; delay();}/*名称:Ack功能:应答信号*/voidAck(){ SDA=0; delay(); SCL=1; delay(); SCL=0; delay(); SDA=1; delay();}/*名称:NoAck功能:发送非应答信号*/voidNoAck(){ SDA=1; delay(); SCL=1; delay(); SCL=0; delay(); SDA=0; delay();}/*名称:Test_Ack()功能:检测应答位*/bitTest_Ack(){ SCL=0; SDA=1; //I/O口准备读数据 _nop_();_nop_();_nop_();_nop_(); SCL=1; _nop_();_nop_();_nop_();_nop_(); if(SDA==0) flag=1; else flag=0;SCL=0; return(flag);}/*名称:SendData()功能:发送一字节数据*/voidSendData(BYTEbuffer){ BYTEBitCnt=8; //一字节8位 while(BitCnt>0) { //temp=buffer; SCL=0; delay(); if((buffer&0x80)==0) //判断最高位是0还是1 SDA=0; else SDA=1; delay(); SCL=1; buffer=buffer<<1; BitCnt—-; } SCL=0;}/*名称:BYTEReceiveData()功能:接收一字节数据*/BYTEReceiveData(){ BYTEBitCnt=8,tmp; SDA=1; //IO口读数据 while(BitCnt) { SCL=0; delay(); SCL=1; delay(); if(SDA==1) tmp=tmp|0x01;//低位置1 else tmp=tmp&0x0fe;//低位清0 if(BitCnt-1) { tmp=tmp〈〈1; } BitCnt-—; } SCL=0; returntmp;}一.实验目的1.掌握AT89C51单片机串行口的使用方法。2.掌握串行口工作波特率的设计方法。3.通讯系统编程练习。二.实验要求要求单片机利用串行口方式1向PC机传送数据.三.实验电路连线实验箱通过串口线与PC机RS232COM口相连。实验箱RS232电平与TTL电平转换电路如图11所示.图11RS232电平与TTL电平转换电路四.实验原理MCS—51单片机内部集成了一个全双工串行接口,通过P3口的两个引脚与外部设备进行串行通信,其中P3.1为串行数据发送端TXD,P3.0为串行通信数据接收端TXD,通过串行口,单片机可以方便地与其它计算机实现双机和多机通信,或者与外部设备进行串行数据交换。由寄存器SCON来进行设置,可选择通讯模式,允许接收,检查状态位。SCON的结构如下:串行控制寄存器(SCON)可位寻址SM0SM1SM2RENTB8RB8TIRI其中各控制位的含义如下:SM0:串行模式选择。SM1:串行模式选择。SM2:多机通讯允许位,当模式0时,此位应该为0.模式1时,当接收到停止位时,该位将置位。模式2或模式3时,当接收的第9位数据为1时,将置位。REN:串行接收允许位.TB8:在模式2和模式3中,将被发送数据的第9位。RB8:在模式0中,该位不起作用,在模式1中,该位为接收数据的停止位。在模式2和模式3中,为接收数据的第9位。TI:串行中断标志位,由软件清零。RI:接收中断标志位,由软件清零。UART有一个接收数据缓冲区,当上一个字节还没被处理,下一个数据仍然可以缓冲区接收进来,但如果接收完这个字节如果上个字节还没被处理,上个字节将被覆盖.因此,软件必须在此之前处理数据。当连续发送字节时也是如此。51支持10位和11位数据模式,11位数据模式用来进行多机通讯。并支持高速8位移位寄存器模式.模式1和模式3中波特率可变。工作在模式0时,UART作为一个8位的移位寄存器使用,波特率为fosc/12数据由RXD从低位开始收发.TXD用来发送同步移位脉冲,因此,方式0不支持全双工。这种方式可用来和像某些具有8位串行口的EEPROM之类的器件通讯。当向SBUF写入字节时,开始发送数据。数据发送完毕时,TI位将置位。置位REN时,将开始接收数据,接收完8位数据时,RI位将置位.工作于模式1时,传输的是10位:1个起始位,8个数据位,1个停止位.这种方式可和包括PC机在内的很多器件进行通讯.这种方式中波特率是可调的。而用来产生波特率的定时器的中断应该被禁止.PCON的SMOD位为1时,可使波特率翻倍。TI和RI在发送和接收停止位的中间时刻被置位.这使软件可以响应中断并装入新的数据。数据处理时间取决于波特率和晶振频率.模式2的数据以11位方式发送:1位起始位,8位数据位,第九位,1位停止位。发送数据时,第九位为SCON中的TB8,接收数据的第九位保存在RB8中.第九位一般用来多机通信,仅在第九位为1时,单片机才接收数据.多机通信用SCON的SM2来控制。当SM2置位时,仅当数据的第九位为1时才引发通讯中断,当SM2为0时,只要接收完11位就产生一次中断。第九位可在多机通讯中避免不必要的中断,在传送地址和命令时,第九位置位,串行总线上的所有处理器都产生一个中断,处理器将决定是否继续接收下面的数据,如果继续接收数据就清零SM2.否则,SM2置位,以后的数据流将不会使他产生中断。时,模式2的波特率为1/640sc,时,波特率为1/320sc。因此,使用模式2,当晶振频率为11。0592M时,将有高达345K的波特率。模式3和模式2的差别在于可变的波特率。五.实验说明执行如下程序,观察PC机上串口调试助手的状态。#include<reg51.h〉#defineBYTEunsignedcharBYTEx;voidDelay(intcnt){ while(cnt—-);}voidUART_Init(){ SCON=0x50; //方式1,波特率可变8位异步通信 TMOD=0x20; //定时器1工作方式2,8位自动装载 PCON=0x00; //加倍波特率清”0",可以没有 ES=1; //串口中断使能 EA=1; //全局中断使能}voidT1_Init(){ TH1=0xfd; //115200kbps TL1=0xfd; TR1=1;}voidUART0_Interrupt(void)interrupt4{ if(RI==1) { x=SBUF; }}voidUART_Send(BYTEx){ SBUF=x; while(TI==0); TI=0; }voidmain(){ UART_Init(); T1_Init(); while(1) { UART_Send(0xaa); Delay(1000); }}一.实验目的1.了解实时时钟与SPI总线基本原理;2.掌握SPI总线时序与程序设计方法;3.掌握DS1302的工作原理及编程方法。二.实验要求利用实验箱上基于SPI总线的DS1302芯片制作一个可调时间的万年历,并在LCD12864上显示。三.实验电路连线将AT89C51的P0口与液晶的数据口D0~D7相连,将P2.0、P2。1、P2.4、P2。5、P2。6、P2。7与液晶的RST、CS2、CS1、E、R/W、DI相连,按键key0~key4分别与P2。3、P2。2、P1.0、P1。1相连,P1.4、P1.3、P1。2分别与ds1302的sclk、io、rst相连。四.实验原理SPI接口的基本结构图如图12所示.在图中只给出简化的连接示意图。作为功能相对于设备独立的SPI接口部件,它具有复杂的逻辑控制电路,在图中并未体现。由图可见,SPI的基本结构相当于两个8位移位寄存器的首尾相接,构成16位的环形移位寄存器.信号用于选择设备工作于主方式还是从方式。主设备启动发送并产生SPI移位时钟,从设备被动接收时钟。在时钟的作用下,两个移位寄存器同步移位,在数据从主机移向从机的同时,数据也由从机移向主机。这意味着在一个移位周期内(8个时钟),主机与从机实现数据交换。图12SPI接口的基本结构图SPI总线可在软件的控制下构成各种简单或复杂的系统,例如,1个主MCU和几个从MCU构成的单主机系统;几个MCU相互连接构成的多主机系统(分布式系统);1个MCU和1个或多个I/O设备构成的单主机系统。在多数应用场合,使用1个MCU作为主机,它控制着1个或多个其他外围器件。实现数据在主机与被选器件之间的传输.由SPI总线构成的典型系统结构如图13所示。图13由SPI总线构成的典型系统结构图在SPI总线与几种不同串行芯片相连接时,要注意这些芯片引脚的处理,可用MCU的通用I/O口线来控制它们。对于像AT89C51这样没有SPI接口的MCU来说,可用软件来模拟SPI操作.但此时,在操作速度和资源使用效率上都会降低.五.实验说明有四个键盘key0到key3,key0是修改时间的,首先是秒到分到时到年到月到日到星期,key1是加1,key2是减1,在修改时间状态再按一下key3的时候就退出并修改时间日期,在平时状态按着key3再按着key2

就会打开lcd的灯,单单是只按key3那就是把灯关了。DS1302部分参考程序如下:voidWriteByte(unsignedchardat)//将一个字节数据写入到DS1302{ unsignedchari=0; for(i=0;i〈8;i++) { IO=(bit)(dat&0x01);//最低位数据加载到IO数据线 SCLK=1;//时钟上升沿,数据传送给DS1302 SCLK=0;//时钟下降沿 dat=(dat>>1);//dat右移一位,为下次传送准备 }}unsignedcharReadByte(void)//从DS1302读出一个字节数据{ unsignedchardat=0; unsignedchari=0; for(i=0;i<8;i++) { dat=(dat〉〉1);//dat右移一位,为下次读取做准备,注意:第一次不起作用,一共右移7次 dat|=((unsignedchar)(IO))<〈7;//读取数据线IO的值,送到dat的最高位 SCLK=1;//时钟上升沿 SCLK=0;//时钟下降沿 } returndat;}voidWriteDS1302(unsignedcharaddress,dat)//将两个字节数据写入到DS1302{ RST=0;//复位引脚置低 SCLK=0;//

温馨提示

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

评论

0/150

提交评论