《单片机应用系统》项目设计报告
第四章 软件设计
系统软件设计说明
在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件更为重要。
在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。数据处理包括:数据的采集、数字滤波、标度变换等。过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便控制生产。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是所完成一定功能,相对独立的程序段,这种程序设计方法叫模块程序设计法。
模块程序设计法的主要优点是:
1、 单个模块比起一个完整的程序易编写及调试;
2、 模块可以共存,一个模块可以被多个任务在不同条件下调用; 3、 模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
本系统软件采用模块化结构,由主程序﹑定时子程序、避障子程序﹑中断子程序﹑显示子程序﹑调速子程序﹑算法子程序构成。
第五章.调试
第一步:检测数码管好坏。写一个简单的程序,观察数码管是否点亮。再将 P0口送0xc0,P2口送0x00,观察数码管是否显示正确的数值。为了达到预期效果,多换几个数试试,观察是否显示正确的数值。(调试时候发现有些数 值不正确,检查过程发现段码没有发现短路,板子氧化严重的问题。)
第二步:检测超声波模块。烧好程序,将超声波正对着墙壁,判断测的距离 是否正确。(用USB口供电,发现显示数据比较正确,但是直接用电源,数 值就不准确,半米之内教准,但是半米之外显示不出来。原因:电源问 题,达不到预期电压值。)
第三步:将小车组装好,写进程序,用电脑USB口供电,且用手遮挡小 车控制好距离,观察是否在大于40cm时两个电机一起转动,在小于30cm时候 只有一个电机转动。
第四步:在第三步的基础上用电池供电。观察是否按要求行驶,即:大于 40cm直行,小于30cm时候减速并且转弯。(由于电池达不到预期要求,小车 在行驶时,只能测得半米左右的数据,且小车能做出相应的转弯。)
- 12 -
《单片机应用系统》项目设计报告
第六章结论
历时三个月的设计过程中,我首先边查资料,边在实验室焊接小车的线路板。在焊接过程中,我感觉到即使是一个简单的电路,要想很轻松的焊好,也不是很容易的事情。有时是“虚焊”的原因,有时可能是阻值选错。在焊接显示电路时,我就错将680欧的电阻焊成了6.8千欧。这使我深深感受到理论与实际间的差距。在调试过程中,发现插上编程器后不能烧制程序,通过检查电路发现,AT89S52芯片的使能端没有接VCC。改好之后重新烧制,发现还是不可以,通过再次检查,发现是共阴管的驱动芯片74LS245的引脚出现焊接错误。通过这些调试,提高了我检查电路的能力,以及巩固了电路图的知识。通过这样的设计,提高了我的动手能力。每天在实验室除了焊接线路板,还可以上机编程,使我软件调试知识也提高了。本设计采用的是89S52单片机,这主要是因为该单片机的稳定性比较好。还可以采用其它系列的单片机。比如采用陵阳单片机,就可以简化编程,但其稳定性不是很好。
第七章、展望
1、在本课题的基础上,我们可以在小车的底座下面装一个吸尘装置,这样就可以在小车行驶的过程中吸除一些预先放好的小纸屑。
2、设计出两辆小车,一辆小车放在另一辆的前面。当前面一辆小车起动时候,后面一辆小车也起动,前面一辆小车转弯的时候后面一辆也跟着转弯,前面一辆小车停止时,后面一辆也跟着停止。
第八章、程序
#include
sbit TX=P3^0; //触发信号引脚 sbit K1=P3^4; sbit K2=P3^5;
sbit PWM1=P3^6; //pwm信号输出 sbit PWM2=P3^7; static char click=0;
- 13 -
//器件配置文件
《单片机应用系统》项目设计报告
unsigned char ZK1,ZK2; unsigned int time=0; unsigned int timer=0; unsigned char posit=0; unsigned long S=0; unsigned
char
const
discode[]
={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char const positon[3]={ 0x7f,0xbf,0xdf}; unsigned char disbuff[4] ={ 0,0,0,0,};
void delay(void) //误差 0us {
unsigned char a,b,c; for(c=23;c>0;c--) for(b=216;b>0;b--) for(a=184;a>0;a--); }
void Display(void) { }
void Conut(void) {
time=TH0*256+TL0; TH0=0; TL0=0;
S=(time*1.7)/100;
{P0=discode[disbuff[posit]];} P2=positon[posit];
if(++posit>=3)
posit=0;
- 14 -
《单片机应用系统》项目设计报告
disbuff[0]=S00/100; disbuff[1]=S000/10; disbuff[2]=S00 ;
}
void Timer2interrupt() { RCAP2H=0x0fe;
RCAP2L=0x33;
ET2=1; // 断 EA=1; // TR2=1; // }
void zd0() interrupt 1 { TH0=0;
TL0=0;
}
void zd3() interrupt 3 模块 { TH1=0x0f8; TL1=0x30; Display(); timer++; if(timer>=400) { timer=0;
TX=1;
//800MS
//500us
允许T2定时器中
打开总中断 启动T2定时器 中断用来扫描数码管和计800MS启动
启动一次模块
- 15 -
//T1
《单片机应用系统》项目设计报告
} }
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;
void Timer2(void) interrupt 5 {
TF2=0; // T2定时器发生溢出中断时,需要用户自己清除溢出标记 RCAP2L=0x33; /*恢复定时器初始值*/ ++click;
if (click>=100) click=0; if (click<=ZK1)
PWM1=1;
RCAP2H=0x0fe;
- 16 -