桂林电子科技大学微机与单片机接口
设
计
报
告
指导教师:吴兆华
学生:王晓鹏
学号:092011211 2010 年6月25日
一、设计题目
单片机之间的串行通讯
二、设计内容与要求
实现两个单片机之间的串行通讯,并用数码管分别显示两个单片机的数据,以验证通讯是否成功。
三、设计目的意义
当前,各种简单实用的通讯系统,使其达到数据传送稳在测控系统和工程应用中,常遇到多项任务需同时执行的情况,即主从式多机分布式系统成为现代工业广泛应用的模式。
由于单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表等方面都有广泛的应用。
利用单片机的串行通信技术设计一定可靠,使用方便,可扩展为DCS系统应用于工业领域,将有广泛的实际应用价值。
单片机除了需要外围器件完成特定的功能外,在很多的应用中单片机之间通讯及单片机和外围器件之间的数据交换,多年来国内外在信息的处理特别是控制和信息传输通讯领域有着十分广泛的应用。
四、系统硬件原理图
图 1 系统硬件原理图
五、程序流程图与源程序
软件的设计是重要的。
它的好坏直接关系设计的成功与否。
软件是用C
语言完成的,需要能熟练的掌握C语言,还要熟悉AT89S52单片机。
从程序流程图、通信协议、波特率计算、编写程序、编译、和烧入软件的操作,到最后的调试,是很复杂的。
下面作详细介绍:
1、程序流程图
图2 程序流程图
2、 C语言程序
(1)主机的程序
#include <AT89X51.H>
/********变量说明***********/
unsigned char i,j,k,KEY,flag;
unsigned char time1,time2,time3;
unsigned int code ;
a[11]={0x00,0x3F,0x7D,0x5B,0x5B,0x00,0x76,0x79,0x38,0x38,0x3f
};
/********函数说明*******/
void initial_time(void); //定时器初始化//
void initial(void); //初始化函数//
void init_chuankou(void);//串口初始化函数//
void delay(unsigned char time1,time2,time3);
void main(void)
{unsigned char KEY;
initial(); //初始化函数//
initial_time(); //定时器初始化//
init_chuankou(); //串口初始化//
while(1)
{
if(P1_0==0) //看是否P1.0的按键按下//
{ delay(20,5,248); //延时10毫秒看是否干扰//
if(P1_0==0) //重新看是否真的按下//
{ KEY++; //如果按下KEY加1,即KEY记下按键按下的次数// if(KEY==10) //如果KEY记到10次,则KEY清0重新记录次数// {
{KEY=0; }
while(P1_0==0); //等待按键弹起//
}
switch(KEY)
{ case 0: SBUF=a[KEY]; P0=a[KEY];break;
case 1: SBUF=a[KEY]; P0=a[KEY];break;
case 2: SBUF=a[KEY]; P0=a[KEY];break;
case 3: SBUF=a[KEY]; P0=a[KEY];break;
case 4: SBUF=a[KEY]; P0=a[KEY];break;
case 5: SBUF=a[KEY]; P0=a[KEY];break;
case 6: SBUF=a[KEY]; P0=a[KEY];break;
case 7: SBUF=a[KEY]; P0=a[KEY];break;
case 8: SBUF=a[KEY]; P0=a[KEY];break;
case 9: SBUF=a[KEY]; P0=a[KEY];break;
case 10: SBUF=a[KEY]; P0=a[KEY];break;
}
}
}
void delay(unsigned char time1,time2,time3)
{
unsigned char i,j,k;
for(i=time1;i>0;i--)
{ for(j=time2;j>0;j--)
{ for(k=time3;k>0;k--)
{;}
}
}
}
/////////////////////////////////////////////////////////// //函数名称:void initial_time(void)
//函数说明:定时器初始化
//函数功能:
//注意:
void initial_time(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
}
/////////////////////////////////////////////////////////// //函数名称:void init_chuankou(void)
//函数说明:串口初始化
//函数功能:
//注意:
void init_chuankou(void)
{
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
PCON=0x80;
TR1=1;
SCON=0x50;
}
///////////////////////////////////////////////////
//函数名称:void initial(void)
//函数说明:初始化函数
//功能:
//入口参数:
//出口参数:
//注意:
////////////////////////////////////////////////////
void initial(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
}
(2)从机程序
#include <AT89X51.H>
/********变量说明***********/
unsigned char i,j,k,b,s,r,t;
void delay(unsigned char time1,time2,time3);
/********函数说明*******/
void iwt();
void initial(void);/////初始化函数/////
void init_chuankou(void);/////传口初始化函数/////
void receive(void);
void main(void)
{
initial(); //初始化函数//
init_chuankou(); //串口初始化//
while(1)
{
receive();
}
}
/////////////////////////////////////////////////////////// //函数名称:void init_chuankou(void)
//函数说明:串口初始化
//函数功能:
//注意:
void init_chuankou(void)
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
PCON=0x80;
TR1=1;
SCON=0x50;
}
//////////////////////////////////////////////////// //函数名称:void initial(void)
//函数说明:初始化函数
//功能:
//入口参数:
//出口参数:
//注意:
//////////////////////////////////////////////////// void initial(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
}
void receive(void)
{
if (RI==1)
{
RI=0;
P0=SBUF;
}
六、系统功能
主机通过P1.0口进行控制,当按键按下一次,数字加1,一直加到10,然后返回到0,并适时向从机发送数据,二者显示的数据相同。
实验仿真图如下
图3 实验仿真图
七、设计体会
从设计中,学到了单片机AT89S52的内部结构及其工作原理,了解控制电路的工作原理,还有共阴极数码管的工作原理,巩固了C语言编程的使用能力,提高了自己动手的能力,学到了很多经验,并且提高了自己分析问题的能力和创新能力,得到了理论联系实际的机会,做出了成果。
八、参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出
版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版).北京:高等教育出版社,1989。