单片机课后习题答案[1]1 联系客服

发布时间 : 星期一 文章单片机课后习题答案[1]1更新完毕开始阅读552798096c85ec3a87c2c51f

* 函数说明:延时5us,晶振改变时只用改变这一个函数! 1、对于11.0592M晶振而言,需要2个_nop_(); 2、对于22.1184M晶振而言,需要4个_nop_(); * 入口参数:无 * 返回: 无

*********************************************************/ void delay_5us(void)//延时5us,晶振改变时只用改变这一个函数! {

_nop_(); _nop_(); //_nop_(); //_nop_(); }

/************ delay_50us ***************/ void delay_50us(void)//延时50us {

unsigned char i; for(i=0;i<4;i++) {

delay_5us(); } }

/******** 延时100us ******************/ void delay_100us(void)//延时100us {

delay_50us(); delay_50us(); }

/*********** 延时单位:ms *******************/ void time(unsigned int ucMs)//延时单位:ms {

unsigned char j; while(ucMs>0){

for(j=0;j<10;j++) delay_100us(); ucMs--; } }

② 采用中断方式,不要校验。

#include /* special function register declarations */ #include /* prototype declarations for I/O functions */ #include #include #include #include

#define byte unsigned char #define uchar unsigned char #define word unsigned int #define uint unsigned int #define ulong unsigned long #define BYTE unsigned char #define WORD unsigned int #define TRUE 1 #define FALSE 0

void initUart(void);/*初始化串口*/

void time(unsigned int ucMs);//延时单位:ms

/* SEND_RECI_LINE=1,设置发送; SEND_RECI_LINE=0,设置接收*/ sbit SEND_RECI_CTRL = P1^0;

sbit CTRL_BUTTON = P1^7; /* CTRL_BUTTON=0,设置错误校验和 */ void initUart(void);/*初始化串口波特率,使用定时器2*/ void send(uchar *d); /*发送函数*/ void receive(uchar *d); /*接收函数*/ xdata uchar sbuf[0x100] _at_ 0x3000; xdata uchar rbuf[0x100] _at_ 0x4000;

xdata uchar* p_rbuf=&rbuf[0]; //指向接收缓冲去第一个字节地址 /******** main 函数 *********/ void main (void) {

time(1);/* 延时等待外围器件完成复位 */ initUart();/* 初始化串口 */

if(SEND_RECI_CTRL){ /*发送*/ send(sbuf); }

while(TRUE){}/*中断接收*/ }

/********** 初始化串口波特率 ************/

void initUart(void)/*初始化串口波特率,使用定时器1*/ { /* Setup the serial port for 19200 baud at 11.0592MHz */ SCON = 0xd0; //串口工作在方式3,此处SM0SM1=03 TMOD = 0x20;

PCON = 0x80; //波特率19200-0x80 波特率9600-0x00 TH1 = 0xfd; TCON = 0x40;

if(!SEND_RECI_CTRL)

IE=0x90; //如果是接收方,则打开串口中断 }

void send(uchar *d) /*发送函数*/ {

uint i;

for(i=0;i<255;i++){

time(10);

SBUF=d[i]; /*发送一个数据*/ while(TI==0){}TI=0; } }

/*********** 串行口中断服务程序***************/ void serial0_int(void) interrupt 4 { *p_rbuf=SBUF;RI=0; p_rbuf++; }

/********************************************************* * 函数说明:延时5us,晶振改变时只用改变这一个函数! 1、对于11.0592M晶振而言,需要2个_nop_(); 2、对于22.1184M晶振而言,需要4个_nop_(); * 入口参数:无 * 返回: 无

*********************************************************/ void delay_5us(void)//延时5us,晶振改变时只用改变这一个函数! {

_nop_(); _nop_(); //_nop_(); //_nop_(); }

/************ delay_50us ***************/ void delay_50us(void)//延时50us {

unsigned char i; for(i=0;i<4;i++) {

delay_5us(); } }

/******** 延时100us ******************/ void delay_100us(void)//延时100us {

delay_50us(); delay_50us(); }

/*********** 延时单位:ms *******************/ void time(unsigned int ucMs)//延时单位:ms {

unsigned char j; while(ucMs>0){

for(j=0;j<10;j++) delay_100us(); ucMs--; } }

22.80C52 串行口按工作方式 1 进行串行数据通信。假定波特率为 1200bps,系统主频 为11.0592MHz,以中断方式传送数据,将本机中地址为30H~4FH内部RAM中内容传送到对方地址为50H~6FH内部RAM中去。请编写全双工通信程序。(答案不惟一,仅供参考! )

解: 程序示例如下:

#include /* special function register declarations */ #include /* prototype declarations for I/O functions */ #include #include #include #include

#define byte unsigned char #define uchar unsigned char #define word unsigned int #define uint unsigned int #define ulong unsigned long #define BYTE unsigned char #define WORD unsigned int #define TRUE 1 #define FALSE 0

void initUart(void);/*初始化串口*/

void time(unsigned int ucMs);//延时单位:ms

/* SEND_RECI_LINE=1,设置发送; SEND_RECI_LINE=0,设置接收*/ sbit SEND_RECI_CTRL = P1^0;

sbit CTRL_BUTTON = P1^7; /* CTRL_BUTTON=0,设置错误校验和 */ void initUart(void);/*初始化串口波特率,使用定时器2*/ void send(uchar *d); /*发送函数*/ void receive(uchar *d); /*接收函数*/ idata uchar sbuf[0x10] _at_ 0x30; idata uchar rbuf[0x10] _at_ 0x50;

idata uchar* p_rbuf=&rbuf[0]; //指向接收缓冲去第一个字节地址 /******** main 函数 *********/ void main (void) {

time(1);/* 延时等待外围器件完成复位 */ initUart();/* 初始化串口 */

if(SEND_RECI_CTRL){ /*发送*/ send(sbuf); }

while(TRUE){}/*中断接收*/ }