福州大学单片机系统设计实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福州大学物理与信息工程学院
单片机系统设计实践报告
设计题目:循迹小车和电子钟
(:软件设计,硬件检查)
(111300218 :硬件设计,软件测试)
专业:电子科学与技术
年级:2013级
姓名:风流书生
学号:111300218
(同组姓名:
学号:)
指导老师:郑茜颖老师
2016年01月
课程设计目的
1、学习Proteus软件中硬件模块及系统的设计和仿真。
(直接支持汇编调试);
2、学习keil uvision4 中 C51。
3、keil uvision4与Proteus软件,联合仿真调试。
一基于C51单片机的循迹小车的设计
课程设计报告内容
设计探一个基于C51单片机和直流电机的自动循迹小车,使小车能够自动检测地面黑色轨迹,并沿着黑色轨迹行驶。
测路面黑线的基本原理:光线照射到路面并反射,由于黑线和白纸对光的反射系数不同,可以根据接收到的反射光强弱来判断是否是黑线。
利用这个原理,可以控制小车行走的路迹。
这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
处理器就根据是否收到反射回来的红外光为依据来确定黑线的位置
和小车的行走路线。
红外探测器探测距离有限,一般最大不应超过3cm。
硬件电路设计
USB转串口电路
直流电机驱动模块原理图
探头测试
L298驱动模块原理图
系统独创性
循迹小车控制系统有以STC89C51作为核心的主控器模块、稳压电源
模块、电机和驱动模块。
从单片机发出PVM波,驱动直流电机对小车进行加减速和控制电机对小车进行转向。
循迹模块可以识别黑白线,调整小车运行方向。
器件清单
小车底盘 L298N驱动芯片 51单片机控制器充电电池循迹传
感器 STC89C52单片机 4个直流电机电机驱动电路
系统存在问题分析
因为时间不是很充分,没有把其他模块加上,比如超声波和显示模块。
测试时发现4路循迹模块,有些问题,不过不影响基本演示。
只有循迹功能,模块系统功能相对简单,不过也更便于实现,系统更加稳定,系统出错便于查出问题所在。
主程序函数
心得体会
通过这个课程实践,增强了我的动手实践能力,以前以为很简单的作
品。
原来需要这么多时间和努力才能完成,测试时发现循迹模块有1个有问题,后来我们改用两路循迹模块,因为没有那么复杂的路线图,两路循迹模块也可以轻松满足要求,实现我们想要的功能。
修改程序过程中,我们使用到了keil,使我对keil软件基本掌握。
在合作过程中,我主要负责硬件部分,像循迹模块有一路不通,通过和合作同学交流,发现可以只用2路循迹模块来替代实现。
让我对系统解决方案有了更深的认识,有时候一个简单的改变就可以实现我们想要的功能。
附作品图
二基于C51单片机的电子钟的设计
课程设计报告内容
设计一个基于51单片机,在显示屏LCD1602具有显示时间功能的电子钟,该电子钟上电或按键复位后,电子钟从0时0分0秒开始运行,进入时钟运行状态;由单片机的定时器进行计数,一秒加一次数,每60秒进位。
然后是分、时。
实验板上S9键为功能键,按下后可选择调节哪个部分。
S13为数字增大键。
S17
为数字减小键。
硬件电路的设计
LCD
实验电路
按键模块
定义端口
程序框图
先配置定时器选择工作模式,开中段开启定时器,之后配置外部中断设置其触发方式。
初始化LCD之后,清屏,进入死循环。
按键判断其值本次设计有四个按键,一个用于关中断。
用于修改时间。
一个用于选择修改到底是时,分,秒。
两个用于加一或减一。
然后把得到的数值求商求余进行再LCD上显示。
部分程序如下
心得体会
硬件方面,主要是在自己买的开发板基础上进行实践,运用老师课堂上讲过的keil和单片机下载程序,结合学习到的51单片机知识对程序进行修改以完成课程实践目标。
软件方面,在同组同学的帮助下,对写好程序进行了小幅度修改以求更好,更规范,由于时间短等原因,我们并没有加入日期功能,只是设置好了日期起始时间。
通过完成这个设计,我们对keil软件有了更进一步的认识,基本掌握了keil软件的使用。
附录报告设计程序
电子钟
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2016-1-11 MON";
uchar code table1[]=" 00:00:00";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
dula=0;
wela=0;
lcden=0;
fen=59;
miao=53;
shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date) {
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
循迹小车
#include<AT89x51.H>
#define Left_moto_pwm P2_0
#define Right_moto_pwm P2_1
#define Left_1_led P3_4
#define Left_2_led P3_5
#define Right_1_led P3_6
#define Right_2_led P3_7
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;}
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}
#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;}
unsigned char pwm_val_left =0;
unsigned char push_val_left =1;
unsigned char pwm_val_right =0;
unsigned char push_val_right=1;
bit Left_moto_stop =1;
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
void run(void)
{
//push_val_left =4;
//push_val_right =4;
Left_moto_go ;
Right_moto_go ;
}
void pwm_out_left_moto(void) {
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left) Left_moto_pwm=1;
else
Left_moto_pwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
else Left_moto_pwm=0;
}
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right) Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
else Right_moto_pwm=0;
}
void timer0()interrupt 1 using 2 {
TH0=0XF8;
TL0=0X30;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void main(void)
{
TMOD=0X01;
TH0= 0XF8;
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
delay(100);
run();
while(1)
{
if(Left_2_led==0&&Right_1_led==0)
run();
else
{
if(Right_1_led==1&&Left_2_led==0)
{
Left_moto_go;
Right_moto_back;
}
if(Left_2_led==1&&Right_1_led==0)
{
Right_moto_go;
Left_moto_back;
}
}
}
}
21。