使用中断方式C51程序设计_单片机与一个单片机串口通信仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机与1个单片机串口通信设计任务:
1个单片机(主机)通过串行口将十六进制数发送给另一个单片机(从机),驱动从机继电器动作,并在数码管显示接收到的数。从机接收到数据后,返回原数据给主机并在数码管显示。
手动输入:通过开发板上的数字量输入拨动开关来实现数据输入(00 01 10 11)
单片机源程序如下:
- #include<reg51.h>
- #include<string.h>
- #define uint unsigned int
- #define uchar unsigned char
- /****************************开关端口定义*********************************************/
- sbit sw_0=P3^3;
- sbit sw_1=P3^4;
- /****************************数码显示 键盘接口定义****************************************/
- sbit PS0=P2^4;//数码管个位
- sbit PS1=P2^5;//数码管十位
- sfr P_data=0x80;//P0口为显示数据输出口
- sbit P_K_L=P2^2;//键盘列
-
- uchar tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//字段转换表
- uchar temp=0; //存放数据区
- uint a;
- uint sw_in(void);//开关量输入采集
- void display(uint a);//显示函数
- void delay(uint delay_time);//延时函数
- void init_serial(void);
- void main(void)
- {
- init_serial();
- temp=sw_in();
- TI=0;
- SBUF=temp;
-
- while(1);
- }
- /**************************串口初始化函数**************************/
- /*函数原型:void init_serial(void)
- /*函数功能:设置串口通信参数及方式
- /*输入参数:无
- /*输出参数:无
- /*调用模块:无
- /******************************************************************/
- void init_serial(void)
- { TMOD=0X20;//定时器1方式2
- TH1=0XFA;
- TL1=0XFA;
- PCON=0X80;
- SCON=0X50;//串口方式1,允许接收,波特率9600bit/s
- TR1=1; //开始计时
- ES=1;
- EA=1;
- }
- //串口中断处理函数
- void serial_int() interrupt 4
- {
- if(RI==1)
- { RI=0;
- temp=SBUF; //接收数据
- for(a=0;a<200;a++)//显示,兼有延时的作用
- display(temp);
- }
- if(TI==1)
- { temp=sw_in();
- SBUF=temp;
- TI=0;
- }
- }
- /**************************数据采集函数**************************/
- /*函数原型:unsigned int sw_in(void)
- /*函数功能:数据采集
- /*输入参数:无
- /*输出参数:a
- /*调用模块:无
- /******************************************************************/
- uint sw_in(void)
- {
- unsigned int a=0;
- if(sw_0)
- { a=a+1;}
- if(sw_1)
- {a=a+0x10;}
- return a;
- }
- /**************************数码管显示函数**************************/
- /*函数原型:void display(void)
- /*函数功能:数码管显示
- /*输入参数:无
- /*输出参数:无
- /*调用模块:delay()
- /******************************************************************/
- void display(unsigned int a)
- {
- bit b=P_K_L;
- P_K_L=1;//防止按键干扰显示
-
- P_data=tab[a&0x0f];//显示个1位
- PS0=0;
- PS1=1;
- delay(200);
-
- P_data=tab[(a>>4)&0x0f]; //显示十位
- PS0=1;
- PS1=0;
- delay(200);
- P_K_L=b;//恢复按键
- P_data=0xff;//恢复数据口
- }
- /*******************************延时函数*********************************/
- /*函数原型:delay(unsigned int delay_time)
- /*函数功能:延时函数
- /*输入参数:delay_time (输入要延时的时间)
- /*输出参数:无
- /*调用模块:无
- /**********************************************************************/
- void delay(unsigned int delay_time) //延时子程序
- {for(;delay_time>0;delay_time--)
- {}
- }
复制代码
所有资料51hei提供下载:
单片机通信.zip
(150.55 KB, 下载次数: 30)
|