基于51单片机的秒表程序

合集下载

51单片机时钟代码(带秒表闹钟功能).

51单片机时钟代码(带秒表闹钟功能).
write_com(0x80+0x00+7);
}
}
}
if(s6==0)
{
delay(5);
if(s6==0)
{
while(!s6);
di();
if(s4num==1)
{
miao--;
if(miao<0)
miao=59;
write_alarm(10,miao);
write_com(0x80+0x00+13);
ep=0;
}
voidwrite_data(uchardat) //写入字符显示数据到LCD
{
while(lcd_bz()); //等待LCD空闲
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
}
if(s1num==3)
{
hour++;
if(hour==24)
hour=0;
write_time(4,hour);
write_com(0x80+0x40+7);delay(5);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
di();
if(s1num==1)
批注本地保存成功开通会员云端永久保存去开通
#include <reg51.h>
#include <intrins.h>

基于51单片机的数字秒表课程设计

基于51单片机的数字秒表课程设计

电气与自动化工程学院卓越工程师培养计划暑期实训报告题目秒表系统的设计年级11级专业自动化班级卓越班学号*********姓名俞雷地点大学生创新实验室日期2012年8月12日~2012年8月20日目录一、单片机简介............................................................................- 2 -二、设计目标................................................................................- 3 -1、设计目的: (3)2、具体操作: (3)三、硬件设计................................................................................- 4 -原理图:. (4)四、系统的软件设计....................................................................- 5 -1、软件整体设计思路: (5)2、软件流程图: (5)3、程序: (6)(1)数码管秒表显示程序: ...................................................- 6 -(2)1602液晶秒表显示程序:............................................ - 13 -五、系统的调试及设计结果..................................................... - 18 -1602液晶——秒表显示效果图:. (18)LED数码管——秒表显示效果图: (18)六、创新实验室课程设计小结................................................. - 19 -一、单片机简介单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。

基于51单片机秒表的程序的设计[1]

基于51单片机秒表的程序的设计[1]

基于51单片机秒表的程序设计1.设计目的:(1)利用单片机定时器中断和定时器计数方式实现秒、分定时。

(2)通过LED显示程序的调整,熟悉8155与8051,8155与LED的接口技术,熟悉LED动态显示的控制过程。

(3)通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。

(4)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。

2.设计步骤与要求(1)要求:以8位LED右边2位显示秒,左边6位显示0,实现秒表计时显示。

以4×4矩阵键盘的KE0、KE1、KE2等3键分别实现启动、停止、清零等功能。

(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器1方式3计数,实现60秒计数。

用动态显示方式实现秒表计时显示,用键盘扫描方式取得KE0、KE1、KE2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。

(3)软件设计:软件整体设计思路是以键盘扫描和键盘处理作为主程序,LED动态显示作为子程序。

二者间的联系是:主程序查询有无按键,无按键时,调用二次LED动态显示子程序(约延时8ms)后再回到按键查询状态,不断循环;有按键时,LED动态显示子程序作为按键防抖延时被连续调用二次(约延时16ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确性和LED动态显示的稳定性。

秒定时采用定时器T0中断方式进行,60秒计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。

由上述设计思路可设计出软件流程图如图1.1所示。

(5)程序编制:编程时置KE0键为“启动”,置KE1键为“停止”,置KE2键为“清零”,因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”,每条指令后紧跟着一条无条件跳转指令“AJMP”,转至相应的按键处理程序,如不是上述3个按键值则跳回按键查询状态。

51单片机秒表程序

51单片机秒表程序
TH0=0Xd8;//给定时器赋初值,定时10ms
TL0=0Xf0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
}
P0=DisplayData[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void datapros()
{
DisplayData[0]=smgduan[min/10];
DisplayData[1]=smgduan[min%10];
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
datapros();
DigDisplay();
}
}
/*******************************************************************************

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)#include#include#defineucharunignedchar#defineuintunignedintbitbeep=P1^5;//蜂鸣器bitLED1=P1"6;//LED灯bitep=P2"7;//1602使能端bitr=P2八6;//1602bitrw=P2八5;//1602bit0二P3八4;//停止闹铃和小灯bit1二P3八5;//功能键bit2二P3飞;//增大键bit3二P3X;//减小键bit4二P3「;//bit5=P3^2;bit6二P3八3;bit7=P3^0;uchar1num,4num,count,count1,judge=0;charec,min,hour,miao,fen,hi,ec1,min1,diwei;voiddelay(uintz){ uint某,y;for(某二z;某〉0;某--)for(y=100;y〉0;y—);}voiddi(){beep=0;delay(50);beep=1;}bitlcd_bz()//测试LCD忙碌状态{bitreult;r=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();reult=(bit)(P0&0某80);ep=0;returnreult;}_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidwrite_data(uchardat)//写入字符显示数据到LCD{while(lcd_bz());//等待LCD空闲r=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_( );_nop_();_nop_();_nop_();ep=0;}ucharhi,ge;hi=dat/10;ge=dat;write_data(0某30+hi);write_data(0某30+ge);}voidwrite_alarm(ucharadd,uchardat){ucharhi1,ge1;hi1=dat/10;ge1=dat;count=0;//clearwrite_data('A');delay(5);hi=17;voidkeycan()//按键扫描{if(l==0){delay(5);if(1==0){1num++;while(!1);di(); if(1num==1){TR0=0;if(1num==2){if(1num==3){if(1num==4){1num=0;if(1num!=0){if(2==0){delay(5);if(2==0){while(!2);di();if(1num==1){ec++;if(ec==60)ec=0;min++;if(min==60)min=0;if(1num==3){hour++;if(hour==24)hour=0;delay(5);if(3==0){while(!3);di();if(1num==1){ec--;if(ec<0)ec=59;if(1num==2){min--;if(min<0)min=59;hour--;if(hour<0)hour=23;}voidkeycan1(){if(4==0){delay(5);if(4==0){4num++;while(!4);di();if(4num==1){TR0=0;if(4num==3){if(4num==4){if(4num!=0){if(5==0){delay(5);if(5==0){while(!5);di();if(4num==1){miao++;if(miao==60)miao=0; write_alarm(10,miao);if(4num==2){fen++;if(fen==60)fen=0;if(4num==3){hi++;if(hi==24)hi=0;write_alarm(4,hi);if(6==0){delay(5);if(6==0){while(!6);di();if(4num==1){miao--;if(miao<0)miao=59;if(4num==2){fen--;if(fen<0)fen=59;write_alarm(7,fen);if(4num==3){hi--;if(hi<0)hi=23;}}if(7==0){delay(5);if(7==0){while(!7)di();judge++;}}if(judge==2){TL0=0某b0;TH0=0某3c; {ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}if(judge==3){judge=0;ec1=0;min1=0;diwei=0;write_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);wr ite_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);} if(count==20){count=0;ec++;if(ec==60){ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}。

基于51单片机的数字秒表设计

基于51单片机的数字秒表设计

单片机系统课程设计成绩评定表设计课题:数字秒表学院名称:电气工程学院专业班级:自动1204学生:学号:指导教师:王黎设计地点:31-630设计时间:2013-12-29~2013-1-9单片机系统课程设计课程设计名称:数字秒表专业班级:自动1204学生姓名:学号:指导教师:王黎课程设计地点:31-630课程设计时间:2013-12-29~2013-1-9单片机系统课程设计任务书目录1绪论 (3)2系统概述 (4)2.1数字式秒表的设计意义 (4)2.2设计要求与分析 (5)3 硬件电路设计 (6)3.1基准脉冲的获取 (6)3.2键盘及控制电路 (12)3.3计数、译码及显示电路 (14)4 数字秒表系统软件设计 (16)4.1 主程序软件设计 (16)4.2 中断服务程序设计 (16)5调试与仿真 (19)5.1软件调试与烧写 (19)5.2 硬件仿真 (20)6. 结论 (21)参考文献: (23)附录 (24)附录一系统原理图 (24)附录二源程序代码 (25)1绪论21世纪,单片机的发展非常的迅速。

单片机是把主要计算机功能部件都集成在一块芯片上的微型计算机。

它是一种集计数和多种接口于一体的微控制器,被广泛应用在智能产品和工业自动化上,而51单片机是个单片机中最为典型和最有代表性的一种。

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。

该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是Atmel的AT89系列,它广泛应用于工业测控系统之中。

很多公司都有51系列的兼容机型推出,今后很长的一段时间将占有大量市场。

本次的设计任务是一个数字秒表,而秒表与普通的钟表不同,它的目的是对从某一时刻到另一时刻的时间间隔进行计时。

秒表的数字化常给人们的生活带来极大的方便,它广泛应用于社会的各个领域。

基于51单片机的秒表设计

基于51单片机的秒表设计

目录一,设计目标 (3)二,系统硬件设计 (4)三,系统软件设计 (7)四,系统调试与设计结果 (12)五,单片机实训小结 (13)设计目标近年来随着科学技术的发展,单片机的应用范围越来越广,也成为很多专业的必修课。

本文简单阐述了基于单片机的秒表设计。

本设计的主要特点是计时精度达到0.01秒,可以用来为各种体育竞赛计时等。

本设计的数字秒表采用AT89S52单片机为主要器件,利用其定时器的原理,结LED数码管以及外部中断电路来设计计时器。

将软硬件结合起来,使得系统能实现0~99.99秒的计时,计时精度位0.01秒。

当按下一个键1时,开始显示数字,即计时开始,再按下键2时,暂停计时并显示刚才的结果,这个时候如果再按键1,则继续计时,也就是显示的数字包括刚才的数据。

按下键3时,数据清零。

系统硬件设计1、1 总体方案的设计数字秒表具有显示直观、读取方便、精度高等优点,在计时中广泛应用。

本设计中用单片机和数码管组成数字秒,力求结构简单。

设计中包括硬件电路的设计和系统程序的设计。

硬件电路主要有主控制器、控制按钮与显示电路组成。

主控制器采用单片机AT89S52,显示电路采用四位共阴极数码管显示计时时间。

本设计利用AT89S52单片机的定时器,使其能精确计时。

利用键盘上的独立按键实现开始计时和暂停以及清零。

P0口输出段码数据,P2.0~P2.2连上译码器作为位选。

设计的基本要求是正确性。

计时器采用T0中断实现,定时溢出中断周期为1ms,当溢出中断后向CPU 发出溢出中断请求,每发出10次中断请求就对10ms位(即最后一位)加一,达到100次就对100ms位加一,以此类推,直到99.99s为止。

1.2 单片机的选择本设计在选取单片机时,充分借鉴了许多成型产品使用单片机的经验。

并根据自己的实际情况,选用了ATMEL公司的AT89S52。

ATMEL公司的89系列单片机以其卓越的性能、完善的兼容性、快捷便利的电擦写操作、低廉的价格完全替代了87C51/62和8751/52,低电压、低功耗,有DIP、PLCC、QFP封装,是目前性能最好、价格最低、最受欢迎的单片机之一。

51单片机,实现秒表功能

51单片机,实现秒表功能

严*****************************************************************************实现秒表功能说明:用5键控制.启动•停止・暂停.继续•清零采用中断控制方式.******************************************************************************/ #mclude<reg52.h>#inc lude<iiitrms.h> ^define uchar unsigned char ^define umt unsigned mt char cent=O;char second=0;char ininite=O;bit s2=0;bit s3=0;bit s4=0;bit s5=0;bit s6=0;严共阳数码管字型码引 严 0,1,2,3,4,5,6,7、&9,p ・,灭*/chai code dis_code[]={Oxc0,Oxf9,Oxa4>OxbO,0x99,0x92,0x82,0xf&0x80,0x90,0x0c,Ox 览Oxbf}; /*P 点显示代码序号可chai data fiiid_code[]={0,0.12.0,0,12,0.0};严*******************************************************/〃函 数名: void Delaylms(uint count)〃功能: 延时时间为Inis〃输入参数:countjms 计数 〃说明:总共延时时间为1 ms 乘以countxrystal= 12Mhz 严*******************************************************//*延迟函数*/void Delaylms(umt count) {uiiit j;wliile(count~!=0)foi(j=0;j<80:j++); }按S 2启动 按S3停止 按S4暂停按S 5继续按S6清零只有在清零或没有开始的情况下才有效 只有在启动的情况下才有效 只有在启动的情况下才有效 只有在暂停的情况下才有效 只有在停止的情况下才有效严***********************************************************************//*显示函数*/严***********************************************************************/ void dispQchar ij=Oxfe; chai- k; fbr(i=0;i<8;i-H-){P2=J ; k=find_code[i]; PO=dis_code[k]; Delaylms(l); j=_crol_(j4); }PO=Oxff;}*函数原型:keychuliQ; * 功 能:处理与键盘相连的Pl 丨1的内容,作为键值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KeySta[i] = 1; } } } //数码管显示函数,中断函数中调用 void LedScan() { static unsigned char i=0; P0=0XFF; P1=(P1&0XF8)|i; P0=LedBuff[i]; if(i<5) i++; else i=0; } //秒表计数加函数 void StopwatchCount() { if(StopwatchRunning) { DecimalPart++;
基于 51 单片机的秒表程序
#include<reg52.h>
sbit ADDR3=P1^3; sbit ENLED=P1^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7;
//单片机 I/O 口
unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
for(i=0; i<4; i++) { if(backup[i] != KeySta[i]) { if(backup[i] != 0) { if(i==1) StopwatchReset(); else if(i==2) StopwatchAction(); } backup[i] = KeySta[i]; } }
if(DecimalPart>=10) {
DecimalPart=0; IntegerPart++; if(IntegerPart>=10000) {
IntegerPart=0; } } StopwatchRefresh=1; } } /* T0 中断服务函数,用于数码管显示扫描与按键扫描 */ void InterruptTimer0() interrupt 1 { static unsigned char tmr10ms=0;
StopwatchRunning=0; else
StopwatchRunning=1; } //秒表复位函数 void StopwatchReset() {
StopwatchRunning=0; DecimalPart=0; IntegerPart=0; StopwatchRefresh=1; } //检测按键是否有动作,主函数中调用此函数 void KeyDriver() { unsigned char i; static unsigned char backup [4]= {1,1,1,1};
}
//按键扫描函数,需在定时中断中调用,推荐调用间隔 1ms void KeyScan() {
unsigned char i; static unsigned char keybuf[4] = {0xFF, 0xFF, 0xFF, 0xFF};
//将一行的 4 个按键值移入缓冲区 keybuf[0] = (keybuf[0] << 1) | KEY1; keybuf[1] = (keybuf[1] << 1) | KEY2; keybuf[2] = (keybuf[2] << 1) | KEY3; keybuf[3] = (keybuf[3] << 1) | KEY4; //消抖后更新按键状态 for (i=0; i<4; i++) //每行 4 个按键,所以循环 4 次 {
}; unsigned char LedBuff[6] = { //数码管显示缓冲区
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char KeySta[4] = {
1,1,1,1};
bit StopwatchRefresh=1; bit StopwatchRunning=0; unsigned char DecimalPart=0; unsigned int IntegerPart=0; unsigned char T0RH=0; unsigned char T0RL=0;
if(buf[i]==0) LedBuff[i+2]=0XFF;r(;i>=0;i--) {
LedBuff[i+2]=LedChar[buf[i]]; } LedBuff[2]&=0X7F;//第三个数码管显示小数点 } //秒表开始函数 void StopwatchAction() { if(StopwatchRunning)
{ if (StopwatchRefresh) { StopwatchRefresh=0; StopwatchDisplay(); } KeyDriver();
} } void ConfigTimer0(unsigned int ms) {
unsigned long tmp;
tmp=11059200/12; tmp=(tmp*ms)/1000; tmp=65536-tmp; tmp=tmp+18; T0RH=(unsigned char)(tmp>>8); T0RL=(unsigned char)tmp; TMOD&=0XF0; TMOD|=0X01; TH0=T0RH; TL0=T0RL; ET0=1; TR0=1; } void StopwatchDisplay() { signed char i; unsigned char buf[4];
void ConfigTimer0(unsigned int ms); void StopwatchDisplay(); void KeyDriver();
void main()
{
EA = 1;
//使能总中断
ENLED=0;
ADDR3=1;
P2=0XFE;
ConfigTimer0(2);
while (1)
if (keybuf[i]== 0x00) { //连续 4 次扫描值为 0,即 4*4ms 内都是按下状态时,可认为按键已稳定的按 下
KeySta[i] = 0; } else if (keybuf[i]==0xFF) { //连续 4 次扫描值为 1,即 4*4ms 内都是弹起状态时,可认为按键已稳定的弹 起
LedBuff[0]=LedChar[DecimalPart%10]; LedBuff[1]=LedChar[(DecimalPart/10)%10];
buf[0]=IntegerPart%10; buf[1]=(IntegerPart/10)%10; buf[2]=(IntegerPart/100)%10; buf[3]=(IntegerPart/1000)%10; for(i=3;i>=1;i--) {
TH0=T0RH; TL0=T0RL; LedScan(); KeyScan(); tmr10ms++; if(tmr10ms>=5) {
tmr10ms=0; StopwatchCount(); } }
相关文档
最新文档