单片机课程设计单片机控制系统设计.docx
《单片机课程设计单片机控制系统设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计单片机控制系统设计.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机课程设计单片机控制系统设计.docx](https://file1.bdocx.com/fileroot1/2023-3/31/f471ce55-e2b0-4caf-ac70-20bbe8a29534/f471ce55-e2b0-4caf-ac70-20bbe8a295341.gif)
单片机课程设计单片机控制系统设计
单片机课程设计
课题:
单片机控制系统设计
系别:
专业:
姓名:
学号:
指导老师:
河南城建学院
2011年12月28日
成绩评定·
一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。
二、评分
评分项目
设计报告评分
答辩评分
平时表现评分
合计
(100分)
任务完成
情况
(20分)
课程设计
报告质量
(40分)
表达情况
(10分)
回答问题
情况
(10分)
工作态度与纪律
(10分)
独立工作
能力
(10分)
得分
课程设计成绩评定
班级:
0934091姓名:
关红雷学号:
093409128
成绩:
分(折合等级)
指导教师签字年月日
一、设计目的
1、使学生增进对单片机的感性认识,加深对单片机理论方面的理解;
2、使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、A/D、D/A、串行口通讯等;
3、使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。
二、设计要求
要求用单片机作为控制芯片制作一个遥控器,另一个单片机系统能被遥控操作。
三、总体设计
1、设计思路:
本次课程设计利用单片机来完成一个系统,实现双片单片机之间的控制。
结果用数码管进行显示,数码管采用查表方式显示。
两个单片机之间采用RS232进行双机通信。
在通信过程中,使用通信协议进行通信。
2、设计方案:
本次设计,对于两片89C51,采用RS232进行双机通信。
发送方的数据由串行口TXD段输出,经过传输线将信号传送到接收端。
接受方接收后,在数码管上显示接收的信息。
为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。
软件部分,通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。
主机收到BBH后就把数码表TAB[10]中的10个数据送给从机,并发送检验和。
从机收到10个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。
从机收到16个正确数据后送到一个数码管显示。
3、硬件设计:
计算机与外界的信息交换称为通信,常用的通信方式有两种:
并行通信和串行通信。
51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。
串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。
51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。
51单片机串行接口的结构如下:
(1)数据缓冲器(SBUF)
接受或发送的数据都要先送到SBUF缓存。
有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。
(2)串行控制寄存器(PCON)
SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
表1.SCON各位含义
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0,SM1:
串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。
串行接口工作方式特点见下表
表2.串行口工作方式
SM0
SM1
工作方式
功能
波特率
0
0
0
8位同步移位寄存器(用于I/O扩展)
fORC/12
0
1
1
10位异步串行通信(UART)
可变(T1溢出率*2SMOD/32)
1
0
2
11位异步串行通信(UART)
fORC/64或fORC/32
1
1
3
11位异步串行通信(UART)
可变(T1溢出率*2SMOD/32)
SM2:
多机通信控制位。
REN:
接收允许控制位。
软件置1允许接收;软件置0禁止接收。
TB8:
方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。
RB9:
在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI:
发送中断标志。
发送完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续发送。
RI:
接收中断标志。
接收完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续接收。
(3)输入移位寄存器
接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。
(4)波特率发生器
波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。
波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
(5)电源控制寄存器PCON
其最高位为SMOD。
(6)波特率计算
当定时器T1工作在定时方式的时候,定时器T1溢出率=(T1计数率)/(产生溢出所需机器周期)。
由于是定时方式,T1计数率=fORC/12。
产生溢出所需机器周期数=模M-计数初值X。
四、各部分电路设计
通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。
主机收到BBH后就把数码表TAB[16]中的10个数据送给从机,并发送检验和。
从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。
从机收到16个正确数据后送到一个数码管显示。
1.串行通信软件实现:
(1)串行口工作于方式1;用定时器1产生9600bit/s的波特率,工作于方式2。
(2)功能:
将本机ROM中数码表TAB[10]中的10个数发送到从机,并保存在从机内部ROM中,从机收到这10个数据后送到一个数码管循环显示。
(3)通信协议:
主机首先发送连络信号(AAH),从机接收到之后返回一个连络信号(BBH)表示从机已准备好接收。
(4)通信过程使用第九位发送奇偶校验位。
(5)从机接收到一个数据后,立即进行奇偶校验,若数据没有错误,则返回00H,否则返回FFH。
(6)主机发送一个数据后,等待从机返回数据;若为00H,则继续发送下一个数据,若为FFH,则重新发送数据。
2.程序流程图:
(1)发送端程序流程图
图1.发送端程序流程图
(2)接收端程序流程图
图2.接收端程序流程图
五、整体电路图
在protues上进行仿真实验。
首先使用KeilC将编写完成的程序编译生成HEX文件,将HEX文件烧录到两片单片机中,进行仿真实验,结果如下图所示,可以看到,接收端已将接受到的数据完整的显示了出来。
图3.电路图
六、设计总结
经过繁忙而又紧张的课程设计,终于顺利的完成了设计任务。
虽然在这段时间里每天都那么繁忙,但是在这忙碌的过程中却得到了许多的收获。
经过课程设计,在查阅资料的过程中,学习了基于单片机的C语言程序设计,了解了单片机串行通信和控制系统的基本知识,对于以后的学习和工作都有很大的益处。
在学习的过程中,也遇到了一些困难,比如开始的时候,由于发送端和接收端的通信协议没有做好,导致数据不能正确的传输,在解决问题的过程中,对于通信协议的实现有了深刻的认识。
通过这次课程设计,锻炼了自己独立思考的能力。
参考文献
[1]杨恢先,黄辉先.单片机原理及应用(第一版)[M].北京:
人民邮电出版社,2006:
214-221.
[2]马忠梅.单片机C语言程序设计[M].北京:
北航出版社,2007:
36-48.
[3]田立,田清,代方震.51单片机C语言程序设计快速入门(第一版)[M].北京:
人民邮电出版社,2007:
35-40.
附录:
1.发送程序
#include
#defineucharunsignedchar
voidinit(void);
voidsend(void);
ucharTAB[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchari,sum;
main()
{init();
send();
}
voidinit(void)
{EA=1;
ES=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0x50;
}
voidsend(void)
{do
{SBUF=0xaa;
while(!
TI);
TI=0;
while(!
RI);
RI=0;
}
while((SBUF^0xbb)!
=0);
do
{sum=0;
for(i=0;i<=9;i++)
{SBUF=TAB[i];
sum+=TAB[i];
while(!
TI);
TI=0;
}
SBUF=sum;
while(!
TI);
TI=0;
while(!
RI);
RI=0;
}
while(SBUF!
=0);
}
2.接收程序
#include
#defineucharunsignedchar
voidinit(void);
voidreceive(void);
voiddelay(int);
ucharTAB[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchari,sum;
main()
{init();
receive();
}
voidinit(void)
{EA=1;
ES=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0x50;
}
voiddelay(intx)
{inti,j;
for(i=0;ifor(j=1;j<150;j++);
}
voidreceive(void)
{ucharTABS[10];
do
{while(!
RI);
RI=0;
}
while((SBUF^0xaa)!
=0);
SBUF=0xbb;
while(!
TI);
TI=0;
while
(1)
{sum=0;
for(i=0;i<=9;i++)
{while(!
RI);
RI=0;
TABS[i]=SBUF;
sum+=TABS[i];
}
while(!
RI);
RI=0;
if((SBUF^sum)==0)
{SBUF=0x00;
while(!
TI);
TI=0;
break;
}
else
{SBUF=0xff;
while(!
TI);
TI=0;
}
}
while
(1)
{for(i=0;i<=9;i++)
{P1=TABS[i];
delay(500);
}
}
}