资料介绍
/* ch08-8-1.c - Mode 0串列输入实验 */
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
sbit load=P3^2; // 声明P3^2位置
main() // 主程序开始
{ SCON=0x11; // 设定为mode 0、REN=1、RI=1
//====b7===b6===b5===b4===b3===b2===b1===b0=== (P8-5 ̄P8-6)
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====1====0====0====0====1===
while(1) // while循环开始
{ load=0; // 输出负脉波,让74165载入资料
load=1; // 恢复高态
RI=0; // 清除RI
while (RI==0); // 等待RI串列输入中断
LED=SBUF; // RI=1时(接收完成),输出至LED
} // while循环结束
} // 主程序结束
#include // 包含reg51.h档
#define DIPSW P2 // 定义指拨开关位置
main() // 主程序开始
{ SCON=0; // 设定为mode 0
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====0====0====0====0====0===
while(1) // while循环开始
{ DIPSW=0xff; // 规划为输入埠
SBUF=DIPSW; // 将指拨开关状态,放入SBUF
while (TI==0); // 等待TI串列输出中断
TI=0; // TI=1时(传送完成),清除TI
} // while循环结束
} // 主程序结束
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程式开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
while(1) // while循环开始
{ DIP_SW=0xff;// 规划指拨开关为输入埠
SBUF=DIP_SW;// 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程式结束
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
sbit BUZZER = P3^7; // 定义蜂鸣器位置
void delay(int); // 声明延迟函数
char i; // 声明变数
main() // 主程序开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
EA=ES=1; // 设定串列埠中断
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
//============主程序(产生1kHz声音)==========
while(1) // while回圈开始
{ for(i=0;i<30;i++) // 30 x 0.5ms
{ BUZZER=1; delay(1); // 输出高态
BUZZER=0; delay(1); } // 输出低态
delay(200); // 延迟0.1s (200 x 0.5ms)
} // while回圈结束
} // 主程序结束
//============延迟函数(产生0.5ms延迟)==========
void delay(int x)
{ char i,j; // 声明变数
for (i=0;i
for (j=0;j<60;j++); // 计时0.5ms
}
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
LED=SBUF; // 将所接收的资料输出到LED
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
}
else TI=0; // 清除TI旗标
} // 结束中断子程序
#include // 包含reg52.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
sbit BUZZER = P3^7; // 定义蜂鸣器位置
void delay(int ); // 声明延迟函数
char i; // 声明变数
main() // 主程序开始
{ T2CON &= 0xf0; // EXEN2=TR2=C/T2=CP/RL2=0
T2CON |= 0x30; // RCLK=TCLK=1
TH2 = 0xff; // Timer 2初值(9600bps, 12MHz)
TL2 = 0xd9; // Timer 2初值(9600bps, 12MHz)
RCAP2H = 0xff; // 鲍率设定为9600bps(12MHz)
RCAP2L = 0xd9; // 鲍率设定为9600bps(12MHz)
TR2=1; // 启动Timer 2
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
//============主程序(产生1kHz声音)==========
EA=ES=1; // 设定串列埠中断
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
while(1) // while循环开始
{ for(i=0;i<30;i++) // 30 x 0.5ms
{ BUZZER=1; delay(1); // 输出高态
BUZZER=0; delay(1); } // 输出低态
delay(200); // 延迟0.1s (200 x 0.5ms)
} // while循环结束
} // 主程序结束
//============延迟函数(产生0.5ms延迟)==========
void delay(int x)
{ char i,j; // 声明变数
for (i=0;i
for (j=0;j<60;j++); // 计时0.5ms
}
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
LED=SBUF; // 将所接收的资料输出到LED
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
}
else TI=0; // 清除TI旗标
} // 结束中断子程序
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0x90; // 设定为mode 2 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
while(1) // while循环开始
{ DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF=DIP_SW; // 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程序结束
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
SCON=0xd0; // 设定为mode 3 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====1====0====1====0====0====0====0===
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF=DIP_SW; // 将指拨开关状态,放入SBUF
while(1) // while循环开始
{ if (TI==1) // 检查是否完成传出?
{ TI=0; // TI=1时(传出完成),清除TI旗标
SBUF=DIP_SW; } // 将指拨开关状态,放入SBUF
if (RI==1) // 检查是否完成接收?
{ RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; } // 将所接收的资料输出到LED
} // while循环结束
} // 主程序结束
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0x90; // 设定为mode 2 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
while(1) // while循环开始
{ DIP_SW=0xff;// 规划指拨开关为输入埠
SBUF=DIP_SW;// 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程序结束
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
//============ 函数 ==========
void INIT_serial(void); // 声明串列埠初始化函数
void send_char(char); // 传送字元函数
void delay1ms(int); // 声明延迟函数
//============ 函数 ==========
unsigned char myAddress = 0x01; // 我的地址
unsigned char addr[3]={0x02, 0x03, 0x04}; // SLAVE之地址
unsigned char sdata[3]={0x01, 0x03, 0x07}; // 传出之初值
//======= 主程式 ========
main() // 主程式开始
{ unsigned char i,j; // 声明变量
INIT_serial(); // 串列埠初始化设定
LED=0xff; // 关闭LED
while(1)
{ LED=~LED; // 切换LED
for(i=0;i<3;i++)// 对三个slave通讯
{ TB8 = 1; // 传送地址模式
send_char(addr[i]); // 传送地址
TB8 = 0; // 传送资料模式
j=sdata[i]; // 取出资料
send_char(j); // 传送资料
delay1ms(100); // 延迟0.1秒
TB8 = 0; // 传送资料模式
send_char(~j); // 传送反相资料
delay1ms(100); // 延迟0.1秒
} // for回圈结束
} // while回圈结束
} // 主程式结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
TR1=1; // 启动Timer 1
} // 结束初始化函数
//============ 传送字元函数 ==========
void send_char(char s_char)
{ TI=0; // 清除TI旗标
SBUF = s_char; // 传出字元
while(!TI); // 等待完成传出
}
//============ 延迟函数(产生x1ms延迟) ==========
void delay1ms(int x)
{ char i, j; // 声明变量
for (i=0;i
for (j=0;j<120;j++);// 延迟1ms
}
====================================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave A */
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x02; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
=======================================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave B */
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x03; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
==============================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave C */
#include // 包含reg51.h档
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x04; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
#include
#define LED P1 // 定义LED位置
sbit load=P3^2; // 声明P3^2位置
main() // 主程序开始
{ SCON=0x11; // 设定为mode 0、REN=1、RI=1
//====b7===b6===b5===b4===b3===b2===b1===b0=== (P8-5 ̄P8-6)
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====1====0====0====0====1===
while(1) // while循环开始
{ load=0; // 输出负脉波,让74165载入资料
load=1; // 恢复高态
RI=0; // 清除RI
while (RI==0); // 等待RI串列输入中断
LED=SBUF; // RI=1时(接收完成),输出至LED
} // while循环结束
} // 主程序结束
2、Mode 0串列输出实验
/* ch08-8-2.c - Mode 0串列输出实验 */#include
#define DIPSW P2 // 定义指拨开关位置
main() // 主程序开始
{ SCON=0; // 设定为mode 0
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====0====0====0====0====0====0====0===
while(1) // while循环开始
{ DIPSW=0xff; // 规划为输入埠
SBUF=DIPSW; // 将指拨开关状态,放入SBUF
while (TI==0); // 等待TI串列输出中断
TI=0; // TI=1时(传送完成),清除TI
} // while循环结束
} // 主程序结束
3、mode 1实验(垂询方式) _采用Timer 1产生鲍率
/* ch08-8-3.c - mode 1实验(垂询方式) _采用Timer 1产生鲍率 */#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程式开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
while(1) // while循环开始
{ DIP_SW=0xff;// 规划指拨开关为输入埠
SBUF=DIP_SW;// 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程式结束
4、mode 1实验(中断方式) _采用Timer 1产生鲍率
/* ch08-8-3a.c - mode 1实验(中断方式) _采用Timer 1产生鲍率 */#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
sbit BUZZER = P3^7; // 定义蜂鸣器位置
void delay(int); // 声明延迟函数
char i; // 声明变数
main() // 主程序开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
EA=ES=1; // 设定串列埠中断
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
//============主程序(产生1kHz声音)==========
while(1) // while回圈开始
{ for(i=0;i<30;i++) // 30 x 0.5ms
{ BUZZER=1; delay(1); // 输出高态
BUZZER=0; delay(1); } // 输出低态
delay(200); // 延迟0.1s (200 x 0.5ms)
} // while回圈结束
} // 主程序结束
//============延迟函数(产生0.5ms延迟)==========
void delay(int x)
{ char i,j; // 声明变数
for (i=0;i
}
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
LED=SBUF; // 将所接收的资料输出到LED
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
}
else TI=0; // 清除TI旗标
} // 结束中断子程序
5、mode 1实验(中断方式)_采用Timer 2产生鲍率
/* ch08-8-3b.c - mode 1实验(中断方式)_采用Timer 2产生鲍率 */#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
sbit BUZZER = P3^7; // 定义蜂鸣器位置
void delay(int ); // 声明延迟函数
char i; // 声明变数
main() // 主程序开始
{ T2CON &= 0xf0; // EXEN2=TR2=C/T2=CP/RL2=0
T2CON |= 0x30; // RCLK=TCLK=1
TH2 = 0xff; // Timer 2初值(9600bps, 12MHz)
TL2 = 0xd9; // Timer 2初值(9600bps, 12MHz)
RCAP2H = 0xff; // 鲍率设定为9600bps(12MHz)
RCAP2L = 0xd9; // 鲍率设定为9600bps(12MHz)
TR2=1; // 启动Timer 2
SCON=0x50; // 设定为mode 1 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====0====1====0====1====0====0====0====0===
//============主程序(产生1kHz声音)==========
EA=ES=1; // 设定串列埠中断
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
while(1) // while循环开始
{ for(i=0;i<30;i++) // 30 x 0.5ms
{ BUZZER=1; delay(1); // 输出高态
BUZZER=0; delay(1); } // 输出低态
delay(200); // 延迟0.1s (200 x 0.5ms)
} // while循环结束
} // 主程序结束
//============延迟函数(产生0.5ms延迟)==========
void delay(int x)
{ char i,j; // 声明变数
for (i=0;i
}
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
LED=SBUF; // 将所接收的资料输出到LED
SBUF= DIP_SW; // 将指拨开关状态,放入SBUF
}
else TI=0; // 清除TI旗标
} // 结束中断子程序
6、mode 2实验
/* ch08-8-4.c - mode 2实验 */#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0x90; // 设定为mode 2 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
while(1) // while循环开始
{ DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF=DIP_SW; // 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程序结束
7、mode 3实验(垂询方式) _采用Timer 1产生鲍率
/* ch08-8-5.c - mode 3实验(垂询方式) _采用Timer 1产生鲍率*/#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ TMOD |= 0x20; // 将Timer 1设定mode 2以产生鲍率
PCON &= 0x7f; // 将SMOD设定为0
TH1=TL1=0xfd; // 鲍率设定约为9600bps(12MHz)
TR1=1; // 启动Timer 1
SCON=0xd0; // 设定为mode 3 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====1====0====1====0====0====0====0===
DIP_SW=0xff; // 规划指拨开关为输入埠
SBUF=DIP_SW; // 将指拨开关状态,放入SBUF
while(1) // while循环开始
{ if (TI==1) // 检查是否完成传出?
{ TI=0; // TI=1时(传出完成),清除TI旗标
SBUF=DIP_SW; } // 将指拨开关状态,放入SBUF
if (RI==1) // 检查是否完成接收?
{ RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; } // 将所接收的资料输出到LED
} // while循环结束
} // 主程序结束
】
8、mode 2互传实验
/* ch08-8-6.c - mode 2互传实验 */#include
#define LED P1 // 定义LED位置
// 第一版89S51线上刻录实验板(印表机埠介面)之指拨开关在P2。
// 第二版89S51线上刻录实验板(USB介面) 之指拨开关在P0。
#define DIP_SW P2 // 定义指拨开关位置
main() // 主程序开始
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0x90; // 设定为mode 2 (P8-5 ̄P8-6)
//====b7===b6===b5===b4===b3===b2===b1===b0===
//===SM0==SM1==SM2==REN==TB8==RB8===TI===RI===
//=====1====0====0====1====0====0====0====0===
while(1) // while循环开始
{ DIP_SW=0xff;// 规划指拨开关为输入埠
SBUF=DIP_SW;// 将指拨开关状态,放入SBUF
while (RI==0); // 检查是否完成接收?
RI=0; // RI=1时(接收完成),清除RI旗标
LED=SBUF; // 将所接收的资料输出到LED
TI=0; // 清除TI旗标
} // while循环结束
} // 主程序结束
9、mode 3多处理器通信实验
/* ch08-8-70.c - mode 3多处理器通信实验_Master */#include
#define LED P1 // 定义LED位置
//============ 函数 ==========
void INIT_serial(void); // 声明串列埠初始化函数
void send_char(char); // 传送字元函数
void delay1ms(int); // 声明延迟函数
//============ 函数 ==========
unsigned char myAddress = 0x01; // 我的地址
unsigned char addr[3]={0x02, 0x03, 0x04}; // SLAVE之地址
unsigned char sdata[3]={0x01, 0x03, 0x07}; // 传出之初值
//======= 主程式 ========
main() // 主程式开始
{ unsigned char i,j; // 声明变量
INIT_serial(); // 串列埠初始化设定
LED=0xff; // 关闭LED
while(1)
{ LED=~LED; // 切换LED
for(i=0;i<3;i++)// 对三个slave通讯
{ TB8 = 1; // 传送地址模式
send_char(addr[i]); // 传送地址
TB8 = 0; // 传送资料模式
j=sdata[i]; // 取出资料
send_char(j); // 传送资料
delay1ms(100); // 延迟0.1秒
TB8 = 0; // 传送资料模式
send_char(~j); // 传送反相资料
delay1ms(100); // 延迟0.1秒
} // for回圈结束
} // while回圈结束
} // 主程式结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
TR1=1; // 启动Timer 1
} // 结束初始化函数
//============ 传送字元函数 ==========
void send_char(char s_char)
{ TI=0; // 清除TI旗标
SBUF = s_char; // 传出字元
while(!TI); // 等待完成传出
}
//============ 延迟函数(产生x1ms延迟) ==========
void delay1ms(int x)
{ char i, j; // 声明变量
for (i=0;i
}
====================================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave A */
#include
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x02; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
=======================================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave B */
#include
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x03; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
==============================
/* ch08-8-71.c - mode 3多处理器通讯实验_Slave C */
#include
#define LED P1 // 定义LED位置
void INIT_serial(void); // 声明串列埠初始化函数
unsigned char myAddress = 0x04; // 我的地址
//======= 主程序 ========
main() // 主程序开始
{ INIT_serial(); // 串列埠初始化设定
while(1); // 无穷回路
} // 主程序结束
//=== 串列埠初始化函数 ===
void INIT_serial(void)
{ PCON |= 0x80; // 将SMOD设定为1
SCON=0xf0; // 设定为mode 3,多处理器通讯
TMOD |= 0x20; // 设定采mode 2
TH1=TL1=0xf3; // 4800bps (12MHz)
EA=ES=1; // 设定串列埠中断
TR1=1; // 启动Timer 1
} // 结束初始化函数
//===串列埠中断子程序(中断向量为0x23、中断编号为 4)===
void serial_INT(void) interrupt 4
{ if (TI==1) // 判断是否发生传出中断
TI=0; // 清除TI旗标,准备下次的传送
if (RI==1) // 判断是否发生接收中断
{ RI=0; // 清除RI旗标,准备下次的接收
if (RB8)
if (SBUF==myAddress) SM2=0; // 进入接收资料模式
else SM2=1; // 非我的地址
else LED=SBUF; // 读取接收到的资料,并输出到LED
} // 结束接收程序
} // 结束中断子程序
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- STM32 外部中断实验参考程序 41次下载
- 实验11:外部中断0
- 信捷触摸屏实验程序 2次下载
- HPEC应用子程序线程推测并行性实验分析 8次下载
- 通过四个拨动开关SW0SW3输入的键值在数码管上显示相应的键值的实验 8次下载
- 点阵式LED显示0到9的数字显示程序和仿真免费下载 62次下载
- 单片机实验INT0及INT1中断计数的程序和仿真资料免费下载。 4次下载
- 单片机实验INT0中断控制LED的程序和仿真资料免费下载 2次下载
- 单片机INT0中断3位计数的C语言程序和电路图免费下载 3次下载
- INT0中断计数的实验程序及电路图资料合集免费下载 1次下载
- JAVA程序设计教程之JSP程序设计实验 6次下载
- 单片机与嵌入式系统实验教程之P1、P3 口的应用实验说明
- 实验2-3循环结构程序设计 0次下载
- 实验3_NIOS程序EPCS固化 0次下载
- 可编程序控制技术及应用实验 116次下载
- 【从0开始创建AWTK应用程序】创建应用程序并在模拟器运行 355次阅读
- H3C实验配置:H3CNE综合实验 1097次阅读
- 通过GDB non-stop mode调试MySQL 492次阅读
- MSPM0L1306开发板教程-SPI 2236次阅读
- KUKA运用系统变量$MODE_OP编程 1584次阅读
- Python版实验室设备管理系统源代码 1981次阅读
- 关于在Bootloader模式下的应用程序下载 4036次阅读
- C程序中do{}while(0)宏定义的作用 2577次阅读
- 0欧电阻的多种用途 3909次阅读
- PIC9054 PCI总线主控I/O加速器的性能及接口设计解决方案 2269次阅读
- 海天雄电子:Android移动互联网实验室开发架构 3160次阅读
- 51单片机IO口模拟串口通讯的设计 2687次阅读
- SAMSUNG S3C9454 示例程序 2727次阅读
- 51单片机实验板该如何制作? 2039次阅读
- AVR内部EEPROM读写实验 2498次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1490次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 92次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 10次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7蓝牙设备在嵌入式领域的广泛应用
- 0.63 MB | 3次下载 | 免费
- 89天练会电子电路识图
- 5.91 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多