微控制器作业答案doc文档格式.docx
《微控制器作业答案doc文档格式.docx》由会员分享,可在线阅读,更多相关《微控制器作业答案doc文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![微控制器作业答案doc文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/31/79a4a027-368f-465e-bcc7-9843453d1df2/79a4a027-368f-465e-bcc7-9843453d1df21.gif)
4.11、用C51语言和汇编语言混合编程的方法,使单片机的P1.0引脚产生占空比为90%周期为10ms的方波。
程序如下:
C程序文件:
#defineucharunsignedchar
sbitP1_0=P1^1;
externdelay1ms(uncharx);
//外部函数delay1ms()声明,入口参数为x
main()
{
for(;
;
)
P1_0=1;
delay1ms(9);
//调用外部函数delay1ms(9),参数9送入寄存器R7
P1_0=0;
delay1ms
(1);
}
voiddelay1ms()
#pragmaasm
public_delay1ms//用public声明_delay1ms为其他函数调用,以"
_"
开头后跟函数名
desegmentcode//定义de段在定义函数段
rsegde//定义de为当前段
_delay1ms:
nop
dela:
movr1,#0f8h
lop1:
nop
djnzr1,lop1
djnzr7,dela
ret
end
#pragmaendasm
微控制器作业(第六章)
6.2、设计一个声光报警器,设备正常运行时,绿色指示灯亮,若设备非正常运行时,红灯闪烁、报警器持续发声报警。
intrins.h>
defineredp1^0//红灯输入
definegreenp1^1//绿灯输入
voiddelay(viod);
IT0=0;
//外中断0电平触发方式
EA=1;
//开放CPU中断允许
EX0=1;
//设置外中断0中断允许
PX0=0;
//中断系统只有一个中断源,设置为低中断优先级
while
(1)
bingbing=1;
//蜂鸣器三极管截止,不叫;
green=0;
//绿灯亮
voiddelay1s()
MOVR7,#1000
DEL:
MOVR6,#500
DJNZR6,$
DJNZR7.DEL
Extern()interrupt0
bingbing=0;
//使蜂鸣器持续发声
green=1;
//绿灯灭
red=0;
//使红灯亮
delay1s();
red=1;
//红灯灭
Definebingbingp1^2//蜂鸣器输入
6.3、简述AT89S系列单片机内部中断源,并指出各中断源中断服务程序入口地址。
特殊功能寄存器TCON中与中断相关的有,TF0和TF1两位。
TF0:
定时/计数器T0计数溢出中断标志位。
TF1:
定时/计数器T1计数溢出中断标志位。
89S52内部中断源除了T0和T1外,还有定时/计数器T2和串行口中断。
定时/计数器T2中断:
定时/计数器T2的计数溢出标志位TF2为“1”,或者T2的外部中断标志位EXF2为“1”,作为有效中断请求,向CPU请求中断。
串行口中断:
串行口的接受中断标志RI(SCON.0)和发送中断标志TI(SCON.1)逻辑或以后作为内部的一个中断源。
6.4、设计一个外部事件中断计数器,使用外中断0的边缘触发方式,对外部发生的中断事件进行计数。
#include<
Unsignedchari=0;
Main()
IT0=1;
//外中断0边沿触发方式
EA=1;
EX0=1;
PX0=0;
Extern()interrupt0
{i++;
6.6、单片机系统使用12MHz的晶振,使用定时/计数器T0产生250us的定时,使P3.4输出周期为1s的方波,试编写主程序和T0中断服务程序。
计数初值为65536-250=65286=FF06H;
即计数器中TL0的初值为06H。
TH0的初值为FFH。
Sbitp3_4=p3^4;
Unsignedchara=2000;
TH0=0x06;
TL0=0xFF;
TMOD=0x01;
//T0工作在方式1
IE=0x81;
//允许T0向CPU申请中断
TR0=1;
//启动T0开始计数
While
(1);
Timer()interrupt1
TH0=0x06;
TL0=0xFF;
//重赋计数初值
a--;
if(a==0)
a=2000;
p3_4=~p3_4;
6.10、单片机系统晶振为11.0592MHz,串行口工作于方式1,波特率为4800bit/s,从串行口输出字符“AT89S52MicroComputer”。
试分别用查询方式和中断方式编写程序。
查询方式:
unsignedchara[]={“AT89S52MicroComputer\0”};
unsignedchari=0;
TMOD=0x20;
//定时器T1工作于方式2
TH1=0xFA;
TL0=0xFA;
//波特率4800
SCON=0x40;
//串行口工作于发送方式
TR1=1;
TI=1;
//便于实现循环发送数据
while(a[i]!
=0)
while(TI==0);
TI=0;
SBUF=a[i];
i++;
中断方式:
EA=1;
ES=1;
//打开串口中断
while
(1);
uart()interrupt4using1
if(TI==1)//确认是发送中断
while(a[i]!
TI=0;
6.11、0#单片机以波特率1200bit/s,从串行口发送内部RAM20H~30H单元的数据块,晶振为11.0592MHz,1#单片机从串行口接收数据,并将数据保存于其内部存储器中,试着编写程序。
0#单片机程序如下:
ORG0000H
LJMPMIAN
MIAN:
MOVTMOD,#20H;
T1工作于方式2,定时
MOVTH1,#0FDH;
波特率9600
MOVTL1,#0FDH
MOVSCON,#40H;
工作于发送方式
SETBTR0
SETBTI
MOVR0,#20H
MOVR7,#10H
WAIT:
JNBTI,WAIT;
是否发送完毕
CLRTI
MOVA,@R0
MOVSUBF,A
INCR0
DJNZR7,WAIT;
R7减一循环,直到20H~30H的内容发送完毕
SJMP$
END
1#单片机程序如下:
MOVSCON,#50H;
工作于接收方式
SETBRI
JNBRI,WAIT;
是否接收完毕
CLRRI
MOVA,SUBF
MOV@R0,A
R7减一循环,直到内容接收完毕,全部存储于20H~30H单元
附加作业
1、(例题6—2用C51编写)
编程使得蜂鸣器响铃10次,每次响铃发出250Hz的声音,维持时间为0.5s,静音1s,单片机使用12MHz的晶振。
reg51.h>
Sbitp1_0=p1^0;
Voiddelay2ms();
Voiddelay1s();
Voidmain()
Unsignedchari,j;
for(i=0;
i<
10;
i++)
{
for(j=0;
j<
20;
j++)
delay2ms();
P1_0=0;
Delay1s();
Voiddelay2ms()
MOVR7,#10
MOVR6,#100
Voiddelay1s()
2、(例题6—6用C51编写)
设计一个应用程序,使用定时/计数器T0定时方法在P1.0引脚输出周期为100ms,占空比为1:
9的周期信号,晶振选用12MHz的晶振。
由分析可知,周期100ms,占空比为1:
9,则高电平持续时间为10ms,低电平持续时间为90ms,使用定时/计数器T0产生10ms定时,T0工作于方式1,则计数初值为:
。
因此,
Unsignedchara=9;
TH0=0xD8;
TL0=0xF0;
IE=0x81;
For(a=9;
a>
0;
a——)
TH0=0xD8;
TL0=0xF0;
if(a==0)
{TH0=0xD8;