[51单片机] 串口通讯 简单通信
- 1 /*-------------------------------------------
- 2 简单的串口通信
- 3 -------------------------------------------*/
- 4 #include<reg51.h>
- 5
- 6 #define uint unsigned int
- 7 #define uchar unsigned char
- 8
- 9
- 10 uchar flag,a,i; //标志接收串口中断标志,接收SBUF内容
- 11 uchar code table[]="I get ";
- 12 /*--------------------------------------------
- 13 延时函数
- 14 ---------------------------------------------*/
- 15 void delay_ms(uint z)
- 16 {
- 17 uint y;
- 18 while(z--)
- 19 for(y=110;y>0;y--);
- 20 }
- 21 /*--------------------------------------------
- 22 USAR初始函数
- 23 ---------------------------------------------*/
- 24 void USRT_init()
- 25 {
- 26 TMOD=0x20; //设置T1定时器工作方式2
- 27 TH1=0xfd; //T1定时器装初值
- 28 TL1=0xfd;
- 29 TR1=1; //启动T1定时器
- 30 REN=1; //允许串口中断接收
- 31 SM0=0; //设定串口工作方式
- 32 SM1=1;
- 33 EA=1; //开总中断
- 34 ES=1; //开串口中断
- 35 }
- 36 /*--------------------------------------------
- 37 串口中断程序
- 38 ---------------------------------------------*/
- 39 void ser()interrupt 4
- 40 {
- 41 RI=0;
- 42 a=SBUF;
- 43 flag=1;
- 44 }
- 45 /*--------------------------------------------
- 46 主函数
- 47 ---------------------------------------------*/
- 48 void main()
- 49 {
- 50 USRT_init();
- 51 while(1)
- 52 {
- 53 if(flag==1) //检测到串口中断。表示有数据传过来了
- 54 {
- 55 ES=0; //关闭串口中断,接下来要发送数据,如果不关闭每次发送之后串口中断都会执行又进入if(flag==1)那里,然后死循环
- 56 for(i=0;i<6;i++) //将table[]中的前6个发送出去
- 57 {
- 58 SBUF=table[i];
- 59 while(!TI); //每次等待发送完毕,再执行下一条
- 60 TI=0; //手动清0
- 61 }
- 62 SBUF=a; //将收到的数据发送出去
- 63 while(!TI);
- 64 TI=0;
- 65 ES=1;
- 66 flag=0;
- 67 }
- 68 }
- 69 }