《单片机的C语言程序设计与运用(第2版)》期末复习题及答案2

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章中断类例4-1P104假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向。#includereg51.hvoidIS0(void)interrupt0{P0=~P0;}//P0端口反向voidIS1(void)interrupt2{P1=~P1;}//P1端口反向voidmain(){P0=0x00;P1=0xFF;IT0=1;IT1=1;EX0=1;EX1=1;EA=1;while(1);}【例4-9】外部中断示例在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。2#includereg51.hsbitP1_7=P1^7;voidinterrupt0()interrupt0using2//外部中断0{P1_7=!P1_7;}voidmain(){EA=1;//开中断IT0=1;//外部中断0脉冲触发EX0=1;//外部中断0P1_7=0;do{}while(1);}如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:#includereg51.hSbitP17=P1^7;unsignedchari=3;voidmain(){EA=1;IT0=1;EX0=1;P17=0;do{}while(1);}voidinterrupt0()interrupt0{i=i-1;if(i==0){P17=!P17;i=3;}}3【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关S0、S1分别接至单片机引脚P3.2()和P3.3()。编写程序控制LED状态。按下S0后,点亮8只LED;按下S1后,变为闪烁状态。#includereg51.hsbitP32=P3^2;voiddelay(unsignedintd)//定义延时子函数{while(--d0);}voidmain(){P0=0xFF;//熄灭LEDIT0=1;IT1=1;//外中断0、1脉冲触发方式EA=1;EX0=1;EX1=1;//开中断for(;;)//延时等待中断发生{;}}voidINT0_ISR()interrupt0//外中断0中断服务函数{P0=0x00;}voidINT1_ISR()interrupt2//外中断1中断服务函数{while(P32!=0)//如果有外部中断0,则退出{delay(5000);P0=0x00;delay(5000);P0=0xFF;}}4定时类【例4-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。要在P1.0上产生周期为2ms的方波,定时器应产生1ms的周期性定时,定时到对P1.0取反。要产生1ms的定时,应选择方式1,定时器方式。TMOD的确定:选择定时器/计数器T0,定时器方式。方式1,GATE不起作用,高4位为0000,TMOD=01H。TH、TL的确定:单片机的fosc=12MHz,则单片机的机器周期为1ms,1ms=1000ms,计数器的计数初值为65536-1000,TH0=(65536-1000)/256,TL0=(65536-1000)%256。①采用查询方式程序如下:#includereg51.hsbitP1_0=P1^0;voidmain(void){TMOD=0x01;TR0=1;for(;;){TH0=(65536-1000)/256;TL0=(65536-1000)%256;do{}while(!TF0);P1_0=!P1_0;TF0=0;}}②采用中断方式程序如下:#includereg51.hsbitP1_0=P1^0;voidtimer0(void)interrupt1using1{P1_0=!P1_0;TH0=(65536-1000)/256;TL0=(65536-1000)%256;}voidmain(void){TMOD=0x01;P1_0=0;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;do{}while(1);}5【例4-17】设系统时钟频率为12MHz,编程实现从P1.1输出周期为1s的方波。要输出周期为1s的方波,应产生500ms的周期性定时,定时到则对P1.1取反即可实现。由于定时时间较长,一个定时器/计数器不能直接实现,一个定时器/计数器最长定时时间为65ms多一点,可以用以下两种方法实现。(1)方法一用定时/计数器T0产生周期性为10ms的定时,然后用一个变量对10ms计数50次。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,选方式1,方式控制字为00000001B(01H),则初值X为X=65536-10000。R1470RR2470RD0D1XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51VCCAB#includereg51.hsbitP1_1=P1^1;6unsignedchari;//定义计数变量voidmain(){i=0;//初始化TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;while(1);}voidtime0_int(void)interrupt1//中断服务程序{TH0=(65536-10000)/256;//重载初始值TL0=(65536-10000)%256;//重载初始值i++;//每发生一次中断,计数变量加1if(i==50)//发生50次中断,定时0.5ms{P1_1=!P1_1;i=0;//计数变量清零}}(2)方法二用定时/计数器T1计数实现,对10ms计数50次。定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入。设定时/计数器T0定时时间到对P1.0取反一次,则T1(P3.5)每10ms产生一个计数脉冲,那么定时500ms只需计数25次,设定时/计数器T1工作于方式2,初值X=256-25=231,TH1=TL1=231。因为定时/计数器T0工作于方式1,定时方式,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。R2470RD1XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51VCCAB#includereg51.hsbitP1_1=P1^1;7sbitP1_0=P1^0;voidmain(){TMOD=0x61;//初始化TH0=(65536-10000)/256;TL0=(65536-10000)%256;TH1=231;TL1=231;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);}voidtime0_int(void)interrupt1//T0中断服务程序{TH0=(65536-10000)/256;//重载初始值TL0=(65536-10000)%256;//重载初始值P1_0=!P1_0;}voidtime1_int(void)interrupt3//T1中断服务程序{P1_1=!P1_1;}【例4-18】设系统时钟频率为12MHz,编程实现:P1.1引脚上输出周期为1s,占空比为20%的脉冲信号根据输出要求,脉冲信号在一个周期内高电平占0.2s,低电平占0.8s,超出了定时器的最大定时间隔,因此利用定时器0产生一个基准定时配合软件计数来实现。取50ms作为基准定时,采用工作方式1,这样这个周期需要20个基准定时,其中高电平占4个基准定时。#includereg51.hsbitP1_1=P1^1;unsignedchari;//定义计数变量voidmain(){i=0;//初始化TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1);}voidtime0_int(void)interrupt1//中断服务程序{TH0=(65536-50000)/256;//重载初始值TL0=(65536-50000)%256;i=i+1;if(i==4)P1_1=0;//高电平时间到变低elseif(i==20)//周期时间到变高{P1_1=1;i=0;//计数变量清零8}}第五章【例5-9】串行口自发自收#includereg51.h#defineucharunsignedchar#defineuintunsignedintvoidmain(){uchari=0x55;uintj=0;TMOD=0X20;//设定定时器1模式2TL1=TH1=0XF4;PCON=0X00;9SCON=0X50;TR1=1;while(1){SBUF=i;//发送数据do()while(!RI)RI=0;TI=0;i=SBUF;//读取接收数据P1=i;i=~i;//将发送数据取反for(j=0;j12500;j++);}}【例5-10】两个单片机串行通信1单片机1的C51源程序代码:#includereg51.h#defineuintunsignedint#defineucharunsignedcharvoidmain(){uchari;TMOD=0x20;TH1=TL1=0xff;SCON=0x50;PCON=0x80;TR1=1;P1=0xff;while(1){P1=0xff;i=P1;SBUF=i;while(TI==0)10{;}TI=0;}}单片机2的C51源程序:#includereg51.h#defineuintunsignedint#defineucharunsignedcharvoidmain(){uchari=0;TMOD=0x20;TH1=TL1=0xff;SCON=0x50;PCON=0x80;TR1=1;while(1){while(RI==0){;}RI=0;i=SBUF;P1=i;}}两个单片机串行通信2C51源程序代码如下:#includereg51.h#defineucharunsignedchar#defineTR1//TR=1,发送ucharidatabuf[10];ucharpf;voidmain(){int();//串行口初始化子函数if(TR==0){send(buf);}//发送else{receive(buf);}//接收}/*串口初始化子函数*/voidinit(void){TMOD=0x20;//T1工作于方式2TH0=0xE8;TL0

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功