发布时间 : 星期一 文章单片机课后习题答案[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
#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
#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){}/*中断接收*/ }