串行通信实验

来源:互联网 发布:太阳系3d软件 编辑:程序博客网 时间:2024/05/16 10:22
要求:理解单片机串行口实现通信的各种工作方式,掌握单片机串行通信程序设计、调试方法

实验题目:甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段数码管,乙机上有两个七段数码管;甲机发出按键显示内容,乙机接收后在数码管上交替显示。


/********************甲机代码******************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0-9,A-F,LUPNuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,   0x92,0x82,0xf8,0x80,0x90,   0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar Pre_KeyNo=16,KeyNo=16;void Delay(uint ms)//延时子程序{ uchar t; while(ms--) for(t=0;t<120;t++) ;}void Keys_Scan(){uchar Tmp;//P1端低四位接列、列的判断P1=0x0F;Delay(1);Tmp=P1^0x0F;switch(Tmp){case 1:KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16;//无键按下}//P1端口0-4五位接行,行的判断//翻转进行判断P1=0xF0;Delay(1);Tmp=P1>>4^0x0F;//右移四位进行判断switch(Tmp){case 1:KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;break;default:break;}}void putc_toSerialPort(uchar num)//发送数字{SBUF=num;while(TI==0);TI=0;}void main(){P0=0xFF;SCON=0X40;//串口工作在方式1TMOD=0X20;   //T1工作在模式2,8位自动装载PCON=0X00;   //波特率不递增TH1=0XFD;   //波特率9600TL1=0XFD;TI=0;TR1=1;//启动定时器while(1){P1=0xF0;if(P1!=0xF0)Keys_Scan();if(Pre_KeyNo!=KeyNo){P0=DSY_CODE[KeyNo];//在数码管上显示数字putc_toSerialPort(KeyNo);//发送数字Pre_KeyNo=KeyNo;}Delay(100);}}

/****************乙机代码**********************/#include<reg51.h>#define uint unsigned int #define uchar unsigned char//0-9,A-F,LUPNuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,   0x92,0x82,0xf8,0x80,0x90,   0x88,0x83,0xc6,0xa1,0x86,0x8e};void Delay(uint ms) //延时小程序{uchar i;while(ms--)for(i=0;i<120;i++);}void main()//主程序{uchar i;SCON=0X50;//串口模式1,8位异步,允许接受TMOD=0X20;//T1工作模式2,8位自动装载TH1=0XFD;//保持甲机的同一波特率TL1=0XFD;PCON=0X00;RI=0;TR1=1;P0=0xFF;P2=0xFF;while(1){ if(RI)//接受 { RI=0;for(i=0;i<100;i++){P0=DSY_CODE[SBUF];Delay(60);P0=0xFF;P2=DSY_CODE[SBUF];Delay(60);P2=0xFF;} }// Delay(100);}}


0 0
原创粉丝点击