文档库 最新最全的文档下载
当前位置:文档库 › 单片机课程设计报告ysu

单片机课程设计报告ysu

燕山大学里仁学院

单片机课程设计说明书题目:电子跑表系统

学院(系):

年级专业:

学号:

学生姓名:

指导教师:

教师职称:

燕山大学课程设计(论文)任务书

院(系):基层教学单位:

说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。

年月日燕山大学课程设计评审意见表

一.设计要求

电子跑表系统

基本要求:

基于单片机试验板设计一个电子跑表系统,用按钮启动和停止,能够实现最多59分59秒的跑表,在数码管上显示当前的跑表时间值;

扩展要求:

充分配合按钮和显示,实现正向跑表,反向跑表,设置跑表初值,跑表跑到预定值通过蜂鸣器提示。

二.设计方案

1.数码管扫描

(数组leddisplaycode:显示数字译码)(显示函数SEG 功能:输入四位数据并显示(扫描方式))

定义全局变量主函数中始终对此变量进行扫描显示

2.P.2/3/4/5口作通用i/o口按键情况通过getkey()扫描录入,并通过keydispose()函数处理。(只加了四种情况,未使用组合键)

(所有操作的目标函数都是全局变量)

3 .其中1号键按一下为正向跑表,再按反向跑表。

2号键按一下为切换到设置模式,同时停止计数。此模式和正常跑表数据互不影响,通过time的第二行存储。

3号键按一下为当前数组数据+1

4号键按一下为当前数组数据-1

4. 当设置的时间和跑表时间相等时,buzzer开始响。

三.系统工作原理

主要硬件电路图如下

键盘控制,该设计需要控制跑表开始和停止,当按下启动按钮跑表开始计时,按下停止按钮停止计时,当按下复位按钮跑表回零。还需要一个切换按键,使得时钟和跑表随时切换。

数码管显示器成本低,配置灵活,与单片机接口简单,在单片机应用系统中广泛应用。

数码管工作原理:数码管是由8个发光二极管构成的显示器件。在数码管中,若将二极管的

阳极连在一起,称为共阳极数码管:若将二极管的阴极连在一起,称为共阴极数码管。我们单片机板上的4个数码管均是共阳极的。当发光二极管导通时,它就会发光。每个二极管就是一个笔划,若干个二极管发光时,就构成了一个显示字符。将单片机的I/O口控制相应的芯片与数码管的a-g相连,高电平的位对应的发光二极管亮,这样,由I/O口输出不同的代码,就可以控制数码管显示不同的字符。

SST89F58

四.程序设计

1.总体框架结构

本设计中秒表采用定时器T0中断完成。主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。

用定时器T0中断服务程序。定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断累计20次(即50*20=1s)时,对秒计时单元进行加1操作。时钟计数单元地址分别在70H~71H(秒)、76H~77H(分)中,最大计时值为59分59秒。7AH单元内存放“熄灭符”数据,用于时间调整的闪烁功能。在计数单元中,采用十进制BCD码计数,满10进位。

2.主程序流程图

unsigned char code leddisplaycode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x 86,0x8E,0xFF};

unsigned char time[][4] = {0,0,0,0,

0,0,0,0}; //*数码管当前显示数据第一行为计时时间,第二行为预设时间

unsigned char i; //SEG()变量

unsigned char mode = 0; //正、反计数模式(0 正1 反)unsigned char flag = 0; //实现单个键的开始&暂停功能unsigned char m=0,n=0;

unsigned char status=0;

/*-------------------------------------------------------------*/

//逻辑驱动初始化函数

void driver_init(void)

{

}

/*-------------------------------------------------------------*/

//软件延时函数

void delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

/*-------------------------------------------------------------*/

//数码管段数据输出函数

void display(unsigned char value)

{

XBYTE[0x06ff] = leddisplaycode[value];

}

/*-------------------------------------------------------------*/

//四位数码管扫描函数

void seg(void)

{

for(i=0;i<4;i++)

{

P1 &= ~(0x10<

display( time[status][i] );

delay1ms(1) ;

P1 |= (0x10<

}

}

/*-------------------------------------------------------------*/

//定时器0中断服务程序双模式mode 0:正计数1:反计数void t0_isr_s()

{

unsigned int x;

if( (x++)%SPEED==0 ) // if( (x++)%100==0 )

{

switch(mode)

{

case 0:

{

forward();

break;

}

case 1:

{

backward();

break;

}

}

}

}

/*-------------------------------------------------------------*/

void t1_isr_s(void)

{

{

}

}

/*-------------------------------------------------------------*/

void forward(void)

{

if( ( time[status][3]++ ) == 9 )

{

time[status][3] = 0 ;

if( ( time[status][2]++ ) == 5 )

{

time[status][2] = 0 ;

if( ( time[status][1]++ ) == 9 )

{

time[status][1] = 0;

if( ( time[status][0]++ ) == 5 )

{

time[status][0] = 0;

TIME0_OFF;

BEEP_ON;

}

}

}

}

}

/*-------------------------------------------------------------*/ void backward(void)

{

if( ( time[status][3]-- ) == 0 )

{

time[status][3] = 9;

if( ( time[status][2]-- ) == 0 )

{

time[status][2] = 5;

if( ( time[status][1]-- ) == 0 )

{

time[status][1] = 9;

if( ( time[status][0]-- ) == 0 )

{

time[status][0] = 5;

TIME0_OFF;

BEEP_ON;

}

}

}

}

}

/*-------------------------------------------------------------*/ //四位键盘扫描函数1-4号键分别对应4个返回值unsigned char getkey(void)

{

unsigned char checkvalue,key = 0x00;

checkvalue = P3&0x3C ;

if( checkvalue==0x3C )

return 0x00;

delay1ms(KEYSCAN_DELAY);

if( !(checkvalue&0x04) ) //1

key|=0x01;

if( !(checkvalue&0x08) ) //2

key|=0x02;

if( !(checkvalue&0x10) ) //3

key|=0x03;

if( !(checkvalue&0x20) ) //4

key|=0x04;

return key;

}

/*-------------------------------------------------------------*/

//按键操作函数对于不同的按键实现4种功能可以再if内随意改动void keydispose(unsigned char key)

{

if(key&0x01)

{

if(flag==0)

{

mode = 0;

TIME0_ON;

flag = 1;

}

else

{

mode = 1;

TIME0_ON;

flag = 0;

}

}

if(key&0x02)

{

if(flag==0)

{

status = 1;

TIME0_OFF;

P3 &= ~0x80;

}

else

{

status = 0;

TIME0_ON;

P3 |= 0x80;

}

}

if(key&0x03)

{

forward();

}

if(key&0x04)

{

backward();

}

}

五.设计总结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾起此次单片机课程设计,我仍感慨颇多,在接近2星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

相关文档
相关文档 最新文档