单片机原理及应用——基于Proteus和Keil C(4)

2019-04-09 16:45

RI = 0;

ack = SBUF;

if(ack == 0xbb) { for(i = 0 ;i < 16 ;i ++) {

send(p[i]); //发送数据 checksum = checksum + p[i]; //求校验和

}

send(checksum); checksum = 0; while(!RI); RI = 0;

ack = SBUF; if(ack == 0x00) while(1);

//清校验和

//判断数据是否为0 //停止发送

} }

}

乙机接收子程序:

#include #include

#define uchar unsigned char #define uint unsigned int

uchar checksum = 0,i = 0,checksum_r;

char data *p; //定义一个指向片内RAM地址的指针

bit rec_flag = 0; void init() { TMOD = 0x20; //定时器T1工作在方式2

TH1 = 0xF4; // 波特率为2400bit/s

TL1 = 0xF4; ES = 1; //开串口中断 EA = 1; //开总中断 SCON = 0x50; //串口工作在方式1 PCON = 0x00; //SMOD = 0; TR1=1; //打开定时器T1

}

void send(uchar data1) //串口发送子程序

{

SBUF = data1; while(TI == 0); TI = 0;

}

void main() {

init(); p=0x40; //片内RAM地址为0x20 while(1) //等待中断 { } }

void recv() interrupt 4 {

uchar ack = 0; if(RI) {

RI = 0; ack = SBUF;

//清除接收标志位

}

if(ack == 0xaa) //判断是否为请求发送数据帧 { //发送应答信号 send(0xbb);

rec_flag = 1; //数据接收标志位置1 } else { if(!rec_flag) //接收的不是数据 { checksum_r = SBUF;

if(checksum == checksum_r)//发送数据的校验和与接收数据校验和比较 send(0x00); //相等发送00 else send(0xff); //不等发送0xff checksum = 0; } if(rec_flag) { p[i] = SBUF; checksum = checksum + p[i]; //求校验和 i ++; if(i == 16) { i = 0; rec_flag = 0; } } } }

16. 8051以方式2进行串行通信,假定波特率为1200bps,第9位作奇偶校验位,以中断方式发送。请编写程序。 答案:

主程序:

#include

#define uchar unsigned char uchar i = 0; uchar a[10]; void main() {

SCON = 0x80; PCON = 0; ES = 1; EA = 1; while(1); }

void uart() interrupt 4 {

TI = 0;

if( i < 10 ) { ACC = a[i]; TB8 = P; SBUF = a[i]; i++; } }

17. 8051以方式3进行串行通信,假定波特率为1200bps,第9位作奇偶验位,以查询方式接收。请编写程序。

答案:

#include

#define uchar unsigned char uchar i,flag; uchar a[10]; void main() {

TMOD = 0x20; TL1 = 0xe8; TH1 = 0xe8; TR1 = 1;

SCON = 0xd0; PCON = 0; while(1) {

} }

if(RI) { RI = 0; ACC = SBUF; if( P == 0 ) { if( RB8 == 1 ) flag = 1; } else { if( RB8 == 1 ) { flag = 0; if( i < 10 ) { a[i]= SBUF; i++; } } else flag = 1; } }

18. RS-232C总线标准是如何定义其逻辑电平的?实际应用中可以将MCS-51单片机串

行口和PC机的串行口直接相连吗?为什么? 答案:

RS-232C采用负逻辑,即逻辑1用-5V~-15V表示,逻辑0用+5V~+15V表示。 PC机配置的是RS-232C标准接口,与MCS-51单片机输入、输出电平不兼容。因此实际应用中不能将MCS-51单片机串行口和PC机的串行口直接相连。

19. 为什么RS-485总线比RS-232C总线具有更高的通信距离和更远的通信距离? 答案:

RS-232C由于发送器和接收器之间具有公共信号地,不可能使用双端信号,因此共模噪声会耦合到信号系统中,从而限制了RS-232C的信号传输速率和通信距离。而RS-485总线无论发送还是接收数据,均用两条线传送双端(差分)信号,因而大大提高了通信速率和通信距离。

定时器补充练习题:

1.8051定时器/计数器有哪几种工作模式?各有什么特点?

答:8051定时器/计数器有0,1,2,3四种工作模式。模式0为13位1定时器/计数器,模式1为16位1定时器/计数器,模式2为自动赋初值的8位定时器/计数器,模式3可以增加一个8位定时器(T1没有模式3)。

2.8051定时器作定时和计数时,其计数脉冲分别由谁提供?

答:8051定时器作定时器时,输入的记数脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器可看作是对单片机机器周期的计数器。8051定时器作计数器时,则对外部事件进行计数。

3.8051定时器的门控信号GATE为1时,定时器如何启动?

答:8051定时器的门控信号GATE为1时,只有INT0(或INT1)引脚为高电平且TR0(或TR1)置1时,相应的T0或T1才能选通工作。

4.定时器/计数器0已预置为156,且选定用于模式2的计数方式,现在T0引脚上输入周期为1ms的脉冲,问:

(1) 此时定时器/计数器0的实际用途是什么? (2) 在什么情况下,定时器/计数器0溢出? 答:(1)此时定时器/计数器0的实际用途是0。1S脉冲信号发生器。 (2)当T0每记数100次后定时器/计数器0溢出。

5.设fosc=12MHz,定时器0的初始化程序和中断服务程序如下:

MAIN:

MOV MOV MOV SETB ?

TH0, #9DH

TL0, #0D0H TMOD, #01H TR0

中断服务程序:

MOV MOV

? RETI

TH0, #9DH TL0, #0D0H

问:(1) 该定时器工作于什么方式?

(2) 相应的定时时间或计数值是多少? 答:(1)该定时器以模式1工作于定时方式。 (2)相应的定时时间为25。136ms.

6.8051单片机的fosc=6MHz,如果要求定时时间分别为0.1ms和5ms,当T0工作在模式0、模式1和模式2时,分别求出定时器的初值。

答:(1)定时时间为0.1ms时:模式0初值为8142、模式1初值为65486,模式2初值206。

(2)定时时间为5ms时:模式0初值为5692、模式1初值为63036,模式2此时定时时间不够。

7.以定时器1进行外部事件计数,每计数1000个脉冲后,定时器1转为定时工作方式。定时10ms后,又转为计数方式,如此循环不止。设fosc=6MHz,试用模式1编程。

解:先确定T1作为计数器时初值为:64536(0FC68H) T1作为定时器时初值为:60536(0EC78H) 程序如下:

#include void main() {

TR1 = 1; while(1)


单片机原理及应用——基于Proteus和Keil C(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2广本自动变速器452

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: