微控制器作业答案doc.docx

上传人:b****5 文档编号:5796021 上传时间:2023-01-01 格式:DOCX 页数:11 大小:21.86KB
下载 相关 举报
微控制器作业答案doc.docx_第1页
第1页 / 共11页
微控制器作业答案doc.docx_第2页
第2页 / 共11页
微控制器作业答案doc.docx_第3页
第3页 / 共11页
微控制器作业答案doc.docx_第4页
第4页 / 共11页
微控制器作业答案doc.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

微控制器作业答案doc.docx

《微控制器作业答案doc.docx》由会员分享,可在线阅读,更多相关《微控制器作业答案doc.docx(11页珍藏版)》请在冰豆网上搜索。

微控制器作业答案doc.docx

微控制器作业答案doc

微控制器作业(第四章)

4.5、试用C51语言编写将0-9,A-F转换成相应的ASC2码的程序。

答:

程序段如下:

#include

#include

voidmain()

{

unsignedcharch;

scanf("%c",&ch);

if(9>=ch>=0||F>=ch>=A)

printf("%d.\n",ch);

return0;

}

4.11、用C51语言和汇编语言混合编程的方法,使单片机的P1.0引脚产生占空比为90%周期为10ms的方波。

答:

程序如下:

C程序文件:

#include

#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

nop

djnzr1,lop1

djnzr7,dela

ret

end

#pragmaendasm

}

微控制器作业(第六章)

6.2、设计一个声光报警器,设备正常运行时,绿色指示灯亮,若设备非正常运行时,红灯闪烁、报警器持续发声报警。

答:

#include

#include

defineredp1^0//红灯输入

definegreenp1^1//绿灯输入

voiddelay(viod);

main()

{

IT0=0;//外中断0电平触发方式

EA=1;//开放CPU中断允许

EX0=1;//设置外中断0中断允许

PX0=0;//中断系统只有一个中断源,设置为低中断优先级

while

(1)

{

bingbing=1;//蜂鸣器三极管截止,不叫;

green=0;//绿灯亮

}

}

voiddelay1s()

{

#pragmaasm

MOVR7,#1000

DEL:

MOVR6,#500

DJNZR6,$

DJNZR7.DEL

#pragmaendasm

}

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;//开放CPU中断允许

EX0=1;//设置外中断0中断允许

PX0=0;//中断系统只有一个中断源,设置为低中断优先级

}

Extern()interrupt0

{i++;}

6.6、单片机系统使用12MHz的晶振,使用定时/计数器T0产生250us的定时,使P3.4输出周期为1s的方波,试编写主程序和T0中断服务程序。

答:

计数初值为65536-250=65286=FF06H;即计数器中TL0的初值为06H。

TH0的初值为FFH。

#include

Sbitp3_4=p3^4;

Unsignedchara=2000;

Main()

{

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”。

试分别用查询方式和中断方式编写程序。

答:

查询方式:

#include

unsignedchara[]={“AT89S52MicroComputer\0”};

unsignedchari=0;

main()

{

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++;

}

}

中断方式:

#include

unsignedchara[]={“AT89S52MicroComputer\0”};

unsignedchari=0;

main()

{

TMOD=0x20;//定时器T1工作于方式2

TH1=0xFA;

TL0=0xFA;//波特率4800

SCON=0x40;//串行口工作于发送方式

EA=1;

ES=1;//打开串口中断

TR1=1;

TI=1;//便于实现循环发送数据

while

(1);

}

uart()interrupt4using1

{

if(TI==1)//确认是发送中断

{

while(a[i]!

=0)

{

TI=0;

SBUF=a[i];

i++;

}

}

}

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#单片机程序如下:

ORG0000H

LJMPMIAN

MIAN:

MOVTMOD,#20H;T1工作于方式2,定时

MOVTH1,#0FDH;波特率9600

MOVTL1,#0FDH

MOVSCON,#50H;工作于接收方式

SETBTR0

SETBRI

MOVR0,#20H

MOVR7,#10H

WAIT:

JNBRI,WAIT;是否接收完毕

CLRRI

MOVA,SUBF

MOV@R0,A

INCR0

DJNZR7,WAIT;R7减一循环,直到内容接收完毕,全部存储于20H~30H单元

SJMP$

END

附加作业

1、(例题6—2用C51编写)

编程使得蜂鸣器响铃10次,每次响铃发出250Hz的声音,维持时间为0.5s,静音1s,单片机使用12MHz的晶振。

答:

#include

Sbitp1_0=p1^0;

Voiddelay2ms();

Voiddelay1s();

Voidmain()

{

Unsignedchari,j;

for(i=0;i<10;i++)

{

for(j=0;j<20;j++)

{

P1_0=0;

delay2ms();

P1_0=0;

delay2ms();

}

P1_0=0;

Delay1s();

}

}

Voiddelay2ms()

{

#pragmaasm

MOVR7,#10

DEL:

MOVR6,#100

DJNZR6,$

DJNZR7.DEL

#pragmaendasm

}

Voiddelay1s()

{

#pragmaasm

MOVR7,#1000

DEL:

MOVR6,#500

DJNZR6,$

DJNZR7.DEL

#pragmaendasm

2、(例题6—6用C51编写)

设计一个应用程序,使用定时/计数器T0定时方法在P1.0引脚输出周期为100ms,占空比为1:

9的周期信号,晶振选用12MHz的晶振。

答:

由分析可知,周期100ms,占空比为1:

9,则高电平持续时间为10ms,低电平持续时间为90ms,使用定时/计数器T0产生10ms定时,T0工作于方式1,则计数初值为:

因此,

#include

Sbitp1_0=p1^0;

Unsignedchara=9;

Main()

{

TH0=0xD8;

TL0=0xF0;

TMOD=0x01;//T0工作在方式1

IE=0x81;//允许T0向CPU申请中断

TR0=1;//启动T0开始计数

While

(1);

}

Timer()interrupt1

{

For(a=9;a>0;a——)

{

TH0=0xD8;

TL0=0xF0;//重赋计数初值

P1_0=0;

}

if(a==0)

{TH0=0xD8;

TL0=0xF0;//重赋计数初值

P1_0=1;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1