logo资料库

串口通信之中断法与查询法.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
串口通信示例程序: 该程序是用查询法控制串口,显示的结果为,通过串口发送一个数据,对应的 发光二极管点亮。如发送数据 0xfe,第一个二极管亮。 查询法 #include void main() { REN=1;//串口允许接收 TMOD=0x20;//设置定时器 1 为工作方式 2 TH1=0xfd;//给 T1 赋初值 TL1=0xfd; TR1=1;//TCON 中的 TR1 位置 1 SM0=0;//设置 SCON 寄存器,设为方式 1 SM1=1; while(1) { if(RI==1) { //查询法,看是否收到数据了 RI=0;//一旦收到数据了,清零 RI 必须软件清零 //P1=0x00; P1=SBUF;//从串口读入数据 } } } 中断法 通过中断方式控制串口 #include void main() { REN=1;//串口允许接收 TMOD=0x20;//设置定时器 1 为工作方式 2 TH1=0xfd;//给 T1 赋初值 TL1=0xfd; TR1=1;//TCON 中的 TR1 位置 1 SM0=0;//设置 SCON 寄存器,设为方式 1 SM1=1; EA=1;//开总中断 ES=1;//开串口中断 while(1) { }
} //加上中断函数变为中断方式 void ser() interrupt 4 { RI=0;//一旦收到数据了,清零 RI 必须软件清零 P1=SBUF;//从串口读入数据 } 修改程序,让串口发给单片机数据,然后让单片机再发回来: #include unsigned char a,flag; void main() { REN=1;//串口允许接收 TMOD=0x20;//设置定时器 1 为工作方式 2 TH1=0xfd;//给 T1 赋初值 TL1=0xfd; TR1=1;//TCON 中的 TR1 位置 1 SM0=0;//设置 SCON 寄存器,设为方式 1 SM1=1; EA=1;//开总中断 ES=1;//开串口中断 while(1) { if(flag==1) { flag=0; SBUF=a;//把 a 送给 SBUF,调用接收缓存器,两个 SBUF 物理地址 //相同,但是意义不同 while(!TI); //发送完 TI 会置 1,要手动清零 TI=0; //TI 发送中断标志位 } } } void ser() interrupt 4 { RI=0;//一旦收到数据了,清零 RI(接收中断标志位),必须软件清零 P1=SBUF;//从串口读入数据 SBUF 赋给 P1 口 a=SBUF;//使用发送缓存器 flag=1; } 这种情况的结果是单片机不停的在发数,串口一直收到数据。要在收数时关闭
中断,让单片机停止发数。 将程序做如下修改 #include unsigned char a,flag; void main() { REN=1;//串口允许接收 TMOD=0x20;//设置定时器 1 为工作方式 2 TH1=0xfd;//给 T1 赋初值 TL1=0xfd; TR1=1;//TCON 中的 TR1 位置 1 SM0=0;//设置 SCON 寄存器,设为方式 1 SM1=1; EA=1;//开总中断 ES=1;//开串口中断 while(1) { if(flag==1) { ES=0; //发送数据时关掉串口 flag=0; SBUF=a;//把 a 送给 SBUF,调用接收缓存器,两个 SBUF 物理地址相同,但是意义不 同。可以发字符串,比如 SBUF=‘b’; while(!TI); //发送完 TI 会置 1,要手动清零 TI=0; ES=1;// 发送完数据时打开串口 } } } //加上中断函数变为中断方式 void ser() interrupt 4 { RI=0;//一旦收到数据了,清零 RI(接收中断标志位),必须软件清零 P1=SBUF;//从串口读入数据 SBUF 赋给 P1 口 a=SBUF;//使用发送缓存器 flag=1; }
分享到:
收藏