单片机的C语言程序设计与运用第2版期末复习题及答案2.docx
- 文档编号:9087856
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:49
- 大小:1.23MB
单片机的C语言程序设计与运用第2版期末复习题及答案2.docx
《单片机的C语言程序设计与运用第2版期末复习题及答案2.docx》由会员分享,可在线阅读,更多相关《单片机的C语言程序设计与运用第2版期末复习题及答案2.docx(49页珍藏版)》请在冰点文库上搜索。
单片机的C语言程序设计与运用第2版期末复习题及答案2
中断类
例4-1P104
假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电
平反向
interrupt0
〃P0端口反向
interrupt2
〃P1端口反向
#include
voidIS1(void){P1=~P1;}
voidmain()
{P0=0x00;P仁0xFF;
IT0=1;IT仁1;
EX0=1;EX仁1;EA=1;
while
(1);
}
【例4-9】外部中断示例
在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。
U1AT89C61
GND
#include
sbitP1_7=P1A7;
voidinterrupt0()interrupt0using2//外部中断0
{P1_7=!
P1_7;}
voidmain()
{EA=1;//开中断
IT0=1;//外部中断0脉冲触发
EX0=1;//外部中断0
P1_7=0;
do{}while
(1);
}
如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:
#include
SbitP17=P1A7;
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;
}
}
【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关SO、S1
分别接至单片机引脚P3.2()和P3.3()。
编写程序控制LED状态。
按下S0
#include
sbitP32=P3A2;
voiddelay(unsignedintd)//定义延时子函数
{while(--d>0);
}
voidmain()
{P0=0xFF;//熄灭LED
IT0=1;IT仁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-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。
要在P1.0上产生周期为2ms的方波,定时器应产生1ms的周期性定时,定时到对P1.0取反。
要产生1ms的定时,应选择方式1,定时器方式。
TMOD的确定:
选择定时器/计数器TO,定时器方式。
方式1,GATE不起作用,高4位为0000,TMOD=01H。
TH、TL的确定:
单片机的fosc=12MHz,则单片机的机器周期为1ms,1ms=1OOOms,计数器的计数初值为65536-1OOO,THO=(65536-1OOO)/256,TLO=(65536-1OOO)%256。
①采用查询方式
程序如下:
#include
sbitP1_O=P1AO;
voidmain(void)
{TMOD=OxO1;
TRO=1;
for(;;)
{TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
do{}while(!
TF0);
P1_0=!
P1_0;
TF0=0;
}
}
②采用中断方式
程序如下:
#include
sbitP1_0=P1A0;
1using1
voidtimer0(void)interrupt
{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);
}
要输出周期为1s的方波,应产生500ms的周期性定时,定时到则对P1.1取反即可实现。
由于定时时间较长,一个定时器/计数器不能直接实现,一个定时器/计数器最长定时时间为65ms多一点,可以用以下两种方法实现。
(1)方法一
用定时/计数器T0产生周期性为10ms的定时,然后用一个变量对10ms计数50次。
系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为
10000,选方式1,方式控制字为00000001B(01H),则初值X为X=65
536-10000。
#include
sbitP1_仁P1A1;
//定义计数变量
//初始化
unsignedchari;
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++;//每发生一次中断,计数变量加1
if(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都采用中断方式工
作。
#include
sbitP1_仁P1A1;
sbitP1_0=P1A0;
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个基准定时
#include
sbitP1_仁P1A1;
//定义计数变量
//初始化
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;
}
}
//计数变量清零
U1AT8SC51
13
12
Tu
10
亍
26
25__
24_
23
22~
2L
32
P3.4/TD
P1.4
■J
P3.3/INT1
P1.3
■斗
P3.2ZIN7D
Pk3
■4
■昨
P3J/TXD
P1J
■t
P3D/RXD
P1.0
P2.7/A16
P2.&AA14
P2.5/A13
EA
•31
■A
P2.4/A12
ALE
■3D
■CAi
P2.3/A11
PSEN
■29
P2.2/A1D
P2JJ7®
PZD20
P0.7ZATJ7
RST
■9
P0b/AD8
PC5/AD5
第五章
【例5-9】串行口自发自收
U1AT8OC51
17"
19"
祐・
徨・
1叵
T&Z
2ft■
27■_
毎・
22E
门■
33・
33■
35
訴"
P37/RO
P1.7
P3.6/WR
PI6
P3.5AT1
P1j5
F3.4nD
P1.4
P3.3/IHT1
P1.3
P3.2/1NIC
P1.2
P3.1 P1.1 P3.0/RXD P1.D IP2.7/A15 F2.6/A14 卩2.5/An EA lP2.4/An ALE P2/VA11 PSEN PJ2WID 叫伽 IP2.D^ po.Twn? RST P0.&7AC8 PD.S^ADS P0.47AD4 P0.3/AD3 XTAL2 IP0.2/AO2 IPO.1/ADI PO.O/ADO KTAL1< ■1 18 ■31 ■^29 VCC A #include #defineucharunsignedchar #defineuintunsignedintvoidmain() {uchari=0x55; uintj=0; TMOD=0X20;//设定定时器1模式2TL仁TH1=0XF4; PCON=0X00; SCON=0X50; TR1=1; while (1) {SBUF=i;//发送数据 do()while(! RI) RI=0; TI=0; i=SBUF;//读取接收数据 P1=i; i=~i;//将发送数据取反 for(j=0;j<12500;j++); } } 【例5-10】两个单片机串行通信1 2绍二辛 UlKlK; : S«3 二吕 qslss S 单片机1的C51源程序代码: #include #defineuintunsignedint #defineucharunsignedchar voidmain() {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) {;} TI=0; } } 单片机2的C51源程序: #include #defineuintunsignedint #defineucharunsignedchar voidmain() {uchari=0; TMOD=0x20;TH1=TL1=0xff; SCON=0x50;PCON=0x80; TR1=1; while (1) {while(RI==0){;} RI=0; i=SBUF; P1=i; } } 两个单片机串行通信2 C51源程序代码如下: #include #defineucharunsignedchar#defineTR1ucharidatabuf[10]; ucharpf; voidmain() {int(); if(TR==0){send(buf);}else {receive(buf);} } /*串口初始化子函数*/voidinit(void) {TMOD=0x20; TH0=0xE8; TL0=0xE8; TR1=1; SCON=0X50; } /*发送子函数*/ voidsend(ucharidata*d) {uchari; do {SBUF=0xAA;while(TI==0);TI=0; while(RI==0); RI=0; }while(SBU"OxBB! =O); do {pf=O; //乙机未准备好,继续联络 //校验和变量清O for(i=O;i<1O;i++){ SBUF=d[i];//发送一个数据 pf+=d[i];//计算校验和 } 第六章 静态: 【例6-1】利用单片机的并行口作为静态显示的输出口的示例 U1«raocsi ■3© 3-1 -37 4" ■36 5- ■開 6- ・34 佗 *33 ■22 I >XrAL1PO-D/jADD PD-1/AD1PD.2/AC2 XT汕2FWZACB P0.4/AEM PD-5/AD5POJ/jADB RSTP0.7/AD7 U2即IAlIJaa眉阳邸i? lA7 RvBR~B-BBB-B 19 18 9> P2.2ZA1D PSEN P2.3ZA11 ^J-E P2,4/Al2 EA P2 P2.6^A14 P2.7XA15 P1.D P3D/RXD P1.1 P3.1/D(Ci Pl.2 PE3 P33/INT1 PI4 P3.4HTI PI5 P3.6/T1 PI.6 卩J PI.7 P3.7/RD it 25 26 JL 28 ID \3CC1 A 11 12 4・ 13 14 15 ? ■ ie 17 g・ L 19" 1" eND\? U3aAI負鶯寫 11 R9FW AB/BA GNDV 静态轮流显示“12”--”和“AB的C51源程序如下: #include #defineucharunsignedchar uchardatadis_buf[2];〃显示缓冲区 ucharcodeable[18]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7 9,0x71,0x40,0x00};〃显示的代码表 voiddl() {unsignedinti; for(i=0;i<40000;i++); } voiddisplay(void)//显示函数 {ucharsegcode; segcode=dis_buf[0];/F0口显示 segcode=table[segcode]; P0=segcode; segcode=dis_buf[1];//P3口显示 segcode=table[segcode]; P3=segcode; } voidmain(void)〃主函数 {while (1) {dis_buf[0]=1;dis_buf[1]=2;//显示12 display();dl(); dis_buf[0]=16;dis_buf[1]=16;//显示-- display();dl(); dis_buf[0]=10;dis_buf[1]=11;//显示AB display();dl(); } 示例中的显示函数display()可以再简单一些,如下面程序段: voiddisplay(void) {P0=table[dis_buf[0]];//P0口显示 P3=table[dis_buf[1]];//P3口显示 6位数码管动态显示“123456的C51源程序如下 1)随机调用 #include #defineucharunsignedchar uchardatadis_buf[6];〃显示缓冲区 ucharcodetable[18]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};〃代码表voiddl_ms()//延时1ms函数 {unsignedintj; for(j=0;j<200;j++); } voiddisplay(void)//显示函数 {ucharsegcode,bitcode,i; bitcode=0xfe;〃位码赋初值 for(i=0;i<6;i++) {segcode=dis_buf[i];〃显示缓冲器内容查表 P0=table[segcode];P3=bitcode;dl_ms(); P3=0xff;〃关闭显示 bitcode=bitcode<<1;〃调整位码bitcode=bitcode|0x01; } } voidmain(void) {dis_buf[0]=1;dis_buf[1]=2; dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6; while (1) {display(); } } (2)定时调用 定时调用是通过定时器/计数器的定时功能来定时一定的时间(如20ms),定时 时间到来调用显示函数。 voidmain(void)//定时调用 {TMOD=0x01; TH0=-20000/256;TL0=-2000%256; EA=1;ET0=1; TR0=1;dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3; voidtime0_int()interrupt1 {TH0=^20000/256; TL0=-2000%256; display(); } dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6; while (1);-- } 【例6-6】独立式按键示例 0 $GNB7 C51源程序如下: 2■ 3■ piD.mDiFD2M.D2 POJS^DS RST PQ.? jAD7 P2.1JWS P22^1D F23^11 ALE P2.4XM2 EA P2j6^.U P2.7JP.15 Pin P1.1 P12 PU IP3^1MT1 P14 P1J5 pa.muiPTS/T1 P1£ PUjS顺厂 Pi.? PS.TXlfE- U1 S■ 辽 5" AH3SC51 21 22 □5 10 12 业 di 17 #include #defineucharunsignedchar #defineuintunsignedintuchardatakey2; codeuchardirtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};voiddl_6() {uinti;for(i=0;i<600;i++); }voidkey(){ucharkey1; P1=0xff;key1=P1; if(key1! =0xff) {dl_6();P1=0xff;key1=P1;if(key1! =0xff) {key1=P1; switch(key1) {case0xff: key2=8;break; case0xfe: key2=0;break; case0xfd: key2=1;break; case0xfb: key2=2;break; case0xf7: key2=3;break; case0xef: key2=4;break; case0xdf: key2=5;break; case0xbf: key2=6;break; case0x7f: key2=7;break;default: break; } } } }voidmain() key2=8; while (1) { key(); P3=dirtab[key2]; #include #defineucharunsignedchar #defineuintunsignedint uchardatadir_buf; codeuchardirta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言程序设计 运用 期末 复习题 答案
![提示](https://static.bingdoc.com/images/bang_tan.gif)