电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>C语言|源代码>mode0-3多种实验程序分享

mode0-3多种实验程序分享

2017-09-06 | rar | 0.1 MB | 次下载 | 免费

资料介绍

/* 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
 }     // 结束接收程序 
}      // 结束中断子程序 
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1电子电路原理第七版PDF电子教材免费下载
  2. 0.00 MB  |  1490次下载  |  免费
  3. 2单片机典型实例介绍
  4. 18.19 MB  |  92次下载  |  1 积分
  5. 3S7-200PLC编程实例详细资料
  6. 1.17 MB  |  27次下载  |  1 积分
  7. 4笔记本电脑主板的元件识别和讲解说明
  8. 4.28 MB  |  18次下载  |  4 积分
  9. 5开关电源原理及各功能电路详解
  10. 0.38 MB  |  10次下载  |  免费
  11. 6基于AT89C2051/4051单片机编程器的实验
  12. 0.11 MB  |  4次下载  |  免费
  13. 7蓝牙设备在嵌入式领域的广泛应用
  14. 0.63 MB  |  3次下载  |  免费
  15. 89天练会电子电路识图
  16. 5.91 MB  |  3次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234313次下载  |  免费
  3. 2PADS 9.0 2009最新版 -下载
  4. 0.00 MB  |  66304次下载  |  免费
  5. 3protel99下载protel99软件下载(中文版)
  6. 0.00 MB  |  51209次下载  |  免费
  7. 4LabView 8.0 专业版下载 (3CD完整版)
  8. 0.00 MB  |  51043次下载  |  免费
  9. 5555集成电路应用800例(新编版)
  10. 0.00 MB  |  33562次下载  |  免费
  11. 6接口电路图大全
  12. 未知  |  30320次下载  |  免费
  13. 7Multisim 10下载Multisim 10 中文版
  14. 0.00 MB  |  28588次下载  |  免费
  15. 8开关电源设计实例指南
  16. 未知  |  21539次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935053次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537791次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234313次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233045次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191183次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183277次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138039次下载  |  免费