当前位置:文档之家› 单片机课程设计-秒表

单片机课程设计-秒表

单片机课程设计
姓名:***
学号:
设计课题:秒表
指导老师:
同组人员:*********
设计时间:2009年12月16日
一、设计目的
1.单片机的基本原理及相关的简单应用。

2.掌握用单片机设计系统的一般步骤。

3.了解LED数码管的基本知识和驱动方法。

4.掌握单片机系统各个组成部分的作用以及分布位置。

5.学会运用单片机的硬件资源。

二、设计要求
1、要求设计一个秒表,精度为00.01秒;
2、显示位数为4位;
3、有启动、停止、清零功能
三、设计工具
1.PC机一台
2.TDN-MI教学实验系统一台(配串行口通讯线)
四、元器件
4位数码管(1个)、30P瓷片电容(2个)、12M晶振(1个)、12*12键盘(2个)、面包板(1块)、连接线(若干)、10K排阻(1个)
五、电路连接
1、本系统中“启动/停止”按钮接在外部中断0口(P3.2);
2、本系统中“清零”按钮接在RST脚(第9管教);
3、本系统的位选通信号接在P1口的低四位;
4、本系统的LED数据端口使用的是P0口,由于采用了共阴数码管,且面包板上空间有限,未加扩流三极管,只使用了上拉电阻。

5、为使电路工作更加稳定,加了上电复位电路。

详见下图
六、设计原理图
1、3641数码管脚位图
2、系统电路图
七、程序流程图
(1)主函数(2)LED动态扫描
八、设计程序
/************************************************
设计题目:秒表
设计要求:设计带启动、停止、清零功能的秒表
利用4位数码管,显示整数两位和小数两位
设计者:何友东付艳娟
设计精度:0.01s
完成日期:09.12.16
*************************************************/
#include "reg52.h"
#include "intrins.h"
//************** PIN CONFIGURE ********************
sbit Start_Stop = P3^2; //定义启动/停止按键
sbit Clear = P3^3; //定义清零按键
sbit Sel_A1 = P1^0; // 定义数码管第一位
sbit Sel_B1 = P1^1; // 定义数码管第二位
sbit Sel_C1 = P1^2; // 定义数码管第三位
sbit Sel_D1 = P1^3; // 定义数码管第四位
#define LED P0 //定义LED 数据端口
#define DP 0x80 //定义小数点
//**************************************************
bdata unsigned char flag; //定义标志寄存器
sbit Status_Flag = flag^0; //1----计时0----停止
sbit Is_KeyS_Hold = flag^1; //定义键盘释放判断标志位
//1---未释放0---释放
unsigned char xiaoshu1 = 0 , //定义计时的小数部分,第一位
xiaoshu2 = 0 , //定义小数部分第二位
miao1 = 0 ; //定义计时的整数部分第一位(十位)
miao2 = 0 ; //定义整数部分第二位(个位)
code unsigned char table[]={0x3f,0x06,0x5b, // 定义0~9 编码
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,};
//******************函数声明*************************
void init(); //初始化函数
void display(); // 数码管显示函数
void delay(); //数码管单个显示延时函数
void key(); //键盘释放判断操作函数
//****************************************************
//*********************主函数************************* void main()
{
init(); //调用初始化函数
while(1)
{
key(); //调用键盘操作函数
display(); //调用LED动态显示函数
}
}
//********************键盘释放判断操作函数************* void key() //启动停止按钮释放键盘判断
{
if(Is_KeyS_Hold)
if(Start_Stop)
{
Is_KeyS_Hold = 0 ;
EX0 = 1 ;
}
}
//****************display()的内部延时函数*************** void delay()
{
unsigned int i ;
for(i = 0; i<300; i++);
}
//***************LED的动态显示函数********************** void display()
{
Sel_A1 = 1;
Sel_B1 = 1;
Sel_C1 = 1;
Sel_D1 = 0;
LED = table[xiaoshu2];delay(); //显示小数的第二位
Sel_A1 = 1;
Sel_B1 = 1;
Sel_C1 = 0;
Sel_D1 = 1;
LED = table[xiaoshu1];delay(); //显示小数的第一位
Sel_A1 = 1;
Sel_B1 = 0;
Sel_C1 = 1;
Sel_D1 = 1;
LED = table[miao2]|DP;delay(); //显示秒的第二位
//并显示小数点
Sel_A1 = 0;
Sel_B1 = 1;
Sel_C1 = 1;
Sel_D1 = 1;
LED = table[miao1];delay(); //显示秒的第一位
}
//******************外部中断0处理函数************************ void Key_Start_Stop() interrupt 0 //外部中断0 启动停止按钮连接于此{
EX0 = 0;
Status_Flag = ~ Status_Flag ;
Is_KeyS_Hold = 1;
if( Status_Flag )
TR0 = 1;
else
TR0 = 0;
}
//*******************定时器0中断处理函数****************
void time10ms() interrupt 1 //定时器中断延时时间10ms
{
TL0 = 0XEF;
TH0 = 0XD8;
TR0 = 1 ; //开定时器
xiaoshu2+=1;
if(xiaoshu2 == 10) { xiaoshu2 = 0 ; xiaoshu1 += 1;}
if(xiaoshu1 == 10) { xiaoshu1 = 0 ; miao2 += 1;}
if(miao2 == 10) { miao2 = 0 ; miao1 += 1;}
if(miao1 == 10) miao1 = 0; //计数最大值99.99 ,
//下一时刻00.00
}
//*********************系统初始化函数********************
void init()
{
Sel_A1 = Sel_B1 = Sel_C1 = Sel_D1 = 1 ;
LED = 0XFF; //关显示
Status_Flag = 0; //标志位清零(未计数)
xiaoshu1 = xiaoshu2 = miao1 = miao2 = 0 ;//初始化显示00.00
ET0 = 1; //定时器0开中断
EX0 = 1; //外部中断0开中断
EA = 1 ; //开总中断
TMOD = 0X01; //定时器0工作方式1
TL0 = 0XEF; //延时10ms初始化设置
TH0 = 0XD8;
TR0 = 0 ; //定时器停止计数
}
九、实验步骤
1.先在电脑上编写程序,然后在试验箱上装载,编译并运行,验证时钟功能是否正确。

2.把数码管,单片机移到面包板上,正确接线,并验证是否正确。

十、作品目前缺陷
1、使用数码管为共阴数码管,使用面包板,空间有限,未能加扩流三极管,导致数码管亮度较低。

2、单片机长期工作在高功耗状态,寿命降低。

3、上拉电阻的引入,增加电路静态功耗。

4、可行的解决方案为:使用驱动能力更强的、能够直推LED的AT89C2051,或者使用三极管扩流,推荐使用共阳数码管。

十一、实验心得
1.进一步复习和巩固了单片机的知识,熟悉了单片机硬件资源的使用。

2.进一步学习了数码管的驱动方法。

3.最后感谢汤老师对我的指导。

相关主题