×

mode0-3多种实验程序分享

消耗积分:0 | 格式:rar | 大小:0.1 MB | 2017-09-06

分享资料个

/* 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循环结束 
}     // 主程序结束 

2、Mode 0串列输出实验

/* ch08-8-2.c - Mode 0串列输出实验 */ 
#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循环结束 
}       // 主程序结束 
 

3、mode 1实验(垂询方式) _采用Timer 1产生鲍率

/* ch08-8-3.c - mode 1实验(垂询方式) _采用Timer 1产生鲍率 */
#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循环结束 
}     // 主程式结束 
 

4、mode 1实验(中断方式) _采用Timer 1产生鲍率

/* ch08-8-3a.c - mode 1实验(中断方式) _采用Timer 1产生鲍率 */
#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旗标 
}      // 结束中断子程序 
 
 

5、mode 1实验(中断方式)_采用Timer 2产生鲍率

/* ch08-8-3b.c - mode 1实验(中断方式)_采用Timer 2产生鲍率 */
#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旗标 
}      // 结束中断子程序 
 
 

6、mode 2实验

/* ch08-8-4.c - mode 2实验 */ 
#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循环结束 
}      // 主程序结束
 
 

7、mode 3实验(垂询方式) _采用Timer 1产生鲍率

/* ch08-8-5.c - mode 3实验(垂询方式) _采用Timer 1产生鲍率*/
#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循环结束 
}     // 主程序结束
 
 

 

8、mode 2互传实验

/* ch08-8-6.c - mode 2互传实验 */ 
#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循环结束 
}     // 主程序结束 
 
 

9、mode 3多处理器通信实验

/* ch08-8-70.c - mode 3多处理器通信实验_Master */ 
#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
 }     // 结束接收程序 
}      // 结束中断子程序 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !