if(P2==0x00) P2=0xe0; //开3个旋转灯 else P2=0x00; //关闭所有LED
}
//定时器0中断 void T0_INT() interrupt 1 {
TH0=0xfe; TL0=FRQ;
SPK=~SPK; }
//定时器1中断 void T1_INT() interrupt 3 {
TH1=-45000/256; TL1=-45000%6;
P2=_crol_(P2,1); }
//主程序 void main() { }
43 串行数据转换为并行数据
/* 名称:串行数据转换为并行数据
说明:串行数据由RXD发送给串
并转换芯片74164,TXD则用于输出移位时钟脉冲,74164将串行输入的1字节转换为并行数据,并将转换的数据通过8只LED显示出来。本例串口工作模式0,即移位寄存器I/O模式。
46
P2=0x00; SPK=0x00; TMOD=0x11; TH0=0x00; TL0=0xff; IT0=1; IE=0x8b; IP=0x01; TR0=0; TR1=0; while(1) { }
FRQ++; DelayMS(1);
//T0、T1方式1
//开启0,1,3号中断 //INT0设为最高优先
//定时器启停由INT0控制,初始关闭
*/
#include
#define uchar unsigned char #define uint unsigned int sbit SPK=P3^7; uchar FRQ=0x00; //延时
void DelayMS(uint ms) {
uchar i; while(ms--) for(i=0;i<120;i++); }
//主程序 void main() { }
44 并行数据转换为串行数据
/* 名称:并行数据转换为串行数据 说明:切换连接到并串转换芯片74LS165的拨码开关,该芯片将并行数据以串行方式发送到8051的RXD引脚,移位脉冲由TXD提供,显示在P0口。 */
#include
#define uchar unsigned char #define uint unsigned int sbit SPL=P2^5; //延时
//shift/load
uchar c=0x80; SCON=0x00; TI=1; while(1) { }
c=_crol_(c,1); SBUF=c;
while(TI==0); TI=0;
DelayMS(400);
//等待发送结束
//TI软件置位
//串口模式0,即移位寄存器输入/输出方式
void DelayMS(uint ms)
47
{
uchar i;
while(ms--) for(i=0;i<120;i++); }
//主程序
void main() { SCON=0x10; }
while(1) { }
SPL=0; SPL=1;
//置数(load),读入并行输入口的8位数据
//移位(shift),并口输入被封锁,串行转换开始
//RI软件置位
//接收到的数据显示在P0口,显示拨码开关的值
//串口模式0,允许串口接收
while(RI==0); //未接收1字节时等待 RI=0; P0=SBUF; DelayMS(20);
45 甲机通过串口控制乙机LED
/* 名称:甲机发送控制命令字符 说明:甲单片机负责向外发送控制命令字符“A”、“B”、“C”,或者停止发送,乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。 */
#include
void DelayMS(uint ms) {
uchar i;
while(ms--) for(i=0;i<120;i++); }
//向串口发送字符
void Putc_to_SerialPort(uchar c) {
SBUF=c; while(TI==0);
48
TI=0; }
//主程序 void main() { uchar Operation_No=0; SCON=0x40; //串口模式1 TMOD=0x20; //T1工作模式2 PCON=0x00; //波特率不倍增
TH1=0xfd; TL1=0xfd; TI=0; TR1=1; while(1) { if(K1==0) //按下K1时选择操作代码0,1,2,3
{ while(K1==0);
Operation_No=(Operation_No+1)%4;
}
switch(Operation_No) //根据操作代码发送A/B/C或停止发送 { case 0: LED1=LED2=1;
break;
case 1: Putc_to_SerialPort('A'); LED1=~LED1;LED2=1; break;
case 2: Putc_to_SerialPort('B');
LED2=~LED2;LED1=1; break;
case 3: Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
break;
}
DelayMS(100); } }
/* 名称:乙机程序接收甲机发送字符并完成相应动作 说明:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。*/
#include
49
sbit LED2=P0^3; //延时
void DelayMS(uint ms) {
uchar i; while(ms--) for(i=0;i<120;i++); }
//主程序 void main() { }
SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; LED1=LED2=1; while(1) { }
if(RI) {
RI=0;
switch(SBUF) //根据所收到的不同命令字符完成不同动作 { }
//关闭LED
case 'A': LED1=~LED1;LED2=1;break; case 'B': LED2=~LED2;LED1=1;break; case 'C': LED1=~LED1;LED2=LED1;
//LED1闪烁 //LED2闪烁 //双闪烁
//如收到则LED闪烁
//串口模式1,允许接收
//T1工作模式2 //波特率不倍增 //波特率9600
}
else LED1=LED2=1; DelayMS(100);
46 单片机之间双向通信
/* 名称:甲机串口程序
说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。 */
#include
#define uchar unsigned char #define uint unsigned int
50