中断与AD以及DA转换实验讲解51单片机中断系统EX0EAPX001ET0PT001EX1PX101ET1PT101ESPS01≥1RITISCONTCONIE0TF0IE1TF110101IT0IT1INT0INT1T0T1RXTXIEIP111111110硬件查询自然优先级自然优先级中断入口中断入口高级低级中断源中断源此表需记住01234(汇编)实验五、外部中断外部中断源的引入(IT0/IT1)0:低电平触发1:负边沿触发外部中断源的服务程序编写voidI0()interrupt0/2主程序中中断允许与启用设置EA=1;EX0=1;/EX1=1;PX0=0;PX1=1;//中断优先设置以及嵌套选作第(3)题:INT0、INT1同时存在,P1为输出口,INT1优先级高于INT0,均为电平触发。要求:主程序8个发光二极管左、右移动2轮,再闪烁2次,INT0的中断服务程序控制P1口的8个发光二极管闪烁5次,INT1的中断服务程序控制P1口的8个发光二极管左、右移动3轮。外部中断请求信号的撤除负边沿触发方式;自动撤除低电平触发方式:需要中断撤除电路voidmain(){EA=1;//全局中断允许打开EX0=1;//打开外部中断0EX1=1;//打开外部中断1PX1=1;//设外部中断1为高优先中断PX0=0;//设外部中断0为低优先中断IT0=0;//设外部中断0为电平触发IT1=0;//设外部中断1为电平触发……}voidI0()interrupt0//外部中断0中断程序{if(P3^2==0)//键盘去抖{delay(10);if(P3^2==0){//具体的功能}}}实验六、定时器中断定时器定时的基准:机器周期=12*震荡周期定时器外部计数工作方式引脚连接TMOD和TCON的使用计数初始值的计算:工作方式不同,计算方法不同主程序中中断允许与启用设置EA=1;ET0=1;/ET1=1;PT0=0;PT1=1;//中断优先设置1)用内部定时器/计数器0的定时功能,实现周期为400us的方波输出。晶振12MHz/11.0592Mhz,定时周期200us选择何种定时方式?初始值多少?TMOD=0x01;//定时器0方式1(00000001)TH0=(65536-200)/256;//赋初值200usTL0=(65536-200)%256;EA=1;ET0=1;TR0=1;voidT0_time()interrupt1{TH0=(65536-200)/256;//重新赋初值200usTL0=(65536-200)%256;……}方式2如何改?2)用内部定时器/计数器1的定时功能,在P3.0引脚上产生周期为10ms的方波输出,定时器采用查询和中断两种方式实现。定时器采用查询(TF0和TF1)中断方式实现:中断服务程序TMOD=0x10;//定时器1方式1(00010000)TH1=(65536-5000)/256;//赋初值5msTL1=(65536-5000)%256;TR1=1;//定时器1开启while(1){if(TF1==1)//查询是否溢出{TF1=0;//溢出标志位取回0led1=~led1;//取反TH1=(65536-4608)/256;//重新赋初值5msTL1=(65536-4608)%256;}}3)用内部定时器/计数器0的方式2,在P3.0引脚上产生矩形波,高电平为50us,低电平为300us。方式2的最大定时时间:12Mhz的晶振,256us定时50us,再加一个软件计数器numTMOD=0x02;//定时器0方式2(00000010)TH0=256-50;//赋初值50usTL0=256-50;voidT0_time()interrupt1//定时器0中断程序{led1=0;//P3^7为低电平num++;if(num==7)//中断6次为300us{led1=1;//P3^7位高电平num=0;}选作1)用内部定时器/计数器1的计数功能,工作在方式2,实现计数10次产生中断使P1.7所接发光二极管点亮。技术模式下,计数初始值如何定:256-10TMOD=0x60;//定时器0方式2(01100000)TH1=256-10;TL1=256-10;voidT0_time()interrupt3//定时器0中断程序{led1=0;//灯亮delayms(500);//延时led1=1;//灯灭}现象如何?用查询方式可以吗?实验七、按键扫描按键的检测以及去抖按键的释放检测独立按键检测矩阵键盘扫描怎样从矩阵键盘中分离出独立按键AD转换时序实验八、AD转换电路图(一)实验八、AD转换电路图(二)实验八、AD转换程序----软件模拟时序sbitTT=P2^0;sbitdsst=P3^6;sbitdsoe=P3^7;sbiteoc=P3^2;sbitALE373=P2^2;voidmain(){ucharA1,A2,A3,adval;ALE373=1;//选择通道并锁存,下降沿锁存P0=0x02;ALE373=0;P0=0xff;//为什么要给全1给P0?TCON=0x00;//串口工作方式设定为方式0,方式1也可以,参考P135EA=1;ES=1;//开串口中断dsoe=0;//关闭adc0809的输出dsst=0;//启动ad转换,给adc0809的start和ale一个正脉冲,模拟启动时序dsst=1;_nop()_;dsst=0;实验八、AD转换程序----软件模拟时序while(1){if(eoc==0)//查询方法读取结果{dsoe=1;//打开adc0809的输出允许,允许读取转换结果adval=P0;//从P0口读取转换结果P1=adval;//结果送P1口发光二极管显示A1=adval/100;//处理转换结果,求出个十百位A2=adval%100/10;A3=adval%10;display(A1,A2,A3);//显示结果dsoe=0;//关闭adc0809的输出dsst=1;//启动ad转换,为下一次转换准备_nop()_;dsst=0;}}}实验八、串口发送显示子程序voiddisplay(ucharbai,ucharshi,ucharge){SBUF=table[ge];//串行发送一个字节数据,可以参考P135的说明while(!TI);//等待发送完毕,不需要中断处理,只需知道发送完毕即可TI=0;//下次发送前,给TI=0,引文TI需软件清零SBUF=table[shi];//为什么要按个十百位这样的顺序发送?while(!TI);TI=0;SBUF=table[bai];while(!TI);TI=0;SBUF=0x5e;//发送的是什么???while(!TI);TI=0;SBUF=0x77;while(!TI);TI=0;delayms(1500);}实验八、串口发送显示原理74LS164为8位串入并出移位寄存器,其引脚如图所示;1、2为串行输入端,Q0~Q7为并行输出端,CLK为移位时钟脉冲,上升沿移入一位;MR为清零端,低电平时并行输出为零。DA转换时序直通方式注意ile,cs,wr1,wr2和xfer信号满足高低低低低的要求即可实验九选作:利用da生成一个类似鱼的图形DA转换时序voidmain(){ucharval,y;P2=0;while(1){if(val%2==0)//这里如何要分{y=80*sin(1.48*val/100)+140;//为什么要选这些参数??P2=y;if(val127)val+=5;//为何这里要有两个增量if(val127)val+=3;if(val=255)val=0;delayms(3);}DA转换时序(续)else{y=80*sin(1.48*val/100+3.14)+140;P2=y;if(val127)val+=5;if(val127)val+=3;if(val=255)val=0;delayms(5);}}}建议与要求大家课后一定要多发时间用点心思来做课题没有办不成的事情,只要我们用心去做拿出实际的行动来,今天就动起来