关于51单片机做60秒计时器实现数字秒表程序算法的问题

FastCGI Error
FastCGI Error
The FastCGI Handler was unable to process the request.
Error Details:
The FastCGI process has failed frequently recently. Try the request again in a while
Error Number: - (0x).
Error Description: ???,?¨u??í?ó
HTTP Error 500 - Server Error.Internet Information Services (IIS)51单片机秒表实验报告_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机秒表实验报告
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩15页未读,
定制HR最喜欢的简历
你可能喜欢51单片机秒表C语言程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
51单片机秒表C语言程序
此程序的电路图下载: 注意:只需要看数码管部分即可,其他部分可忽略掉. 程序是用c语言编写的,采用的单片机型号是stc89c52
#include &reg52.h&
& typedef unsigned char uchar8;
& typedef unsigned int uint16;
& typedef unsigned long ulong32;
& sbit ENLED = P1^4;
& sbit ADDR0 = P1^0;
& sbit ADDR1 = P1^1;
& sbit ADDR2 = P1^2;
& sbit ADDR3 = P1^3;
& uchar8 led_char[] = {
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90
& uchar8 zifu_led[] = {
0xff,0xff,0xff,
0xff,0xff,0xff
& void main()
uchar8 cnt = 0;
uchar8 key = 0;
ulong32 sec = 0;
ADDR3 = 1;&
ENLED = 0;
TMOD = 0x01;
TH0 = 0xB7;
TL0 = 0x00;
& while(1)
&if(1 == TF0)
TH0 = 0xB7;
TL0 = 0x00;
if(100 = cnt)
zifu_led[0] = sec%10;
zifu_led[1] = sec/10%10;
zifu_led[2] = sec/100%10;
zifu_led[3] = sec/1000%10;
zifu_led[4] = sec/10000%10;
zifu_led[5] = sec/;
&switch(key)
&case 0:P0 = 0ADDR2 = 0; ADDR1 = 0; ADDR0 = 0;P0 = led_char[zifu_led[0]];key++;
&case 1:P0 = 0ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;P0 = led_char[zifu_led[1]];key++;
&case 2:P0 = 0ADDR2 = 0; ADDR1 = 1; ADDR0 = 0;P0 = led_char[zifu_led[2]];key++;
&case 3:P0 = 0ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;P0 = led_char[zifu_led[3]];key++;
&case 4:P0 = 0ADDR2 = 1; ADDR1 = 0; ADDR0 = 0;P0 = led_char[zifu_led[4]];key++;
&case 5:P0 = 0ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;P0 = led_char[zifu_led[5]];key = 0;
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机课程设计-基于单片机的数字秒表设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口11:32 提问
C语言 单片机秒表程序
本人是一个新手 对于下边的c程序每一个子函数能看懂,但是像这么多子函数放到一起
就晕了,想请亲们帮我把这个程序的流程梳理梳理中断是何时工作,各个子函数怎么在这个整体里运行 越详细越好,本人十分感谢!
/* 设计的秒表计数到小数点后两位,(ms)用到六个数码管一个小数点加两位小数*/
#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;
unsigned char code LedChar[] = {
//数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
unsigned char LedBuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
//数码管显示缓存区
unsigned char KeySta[4]={1,1,1,1};
bit StopwatchRunning=0;
bit StopwatchRefresh=1;
unsigned char IntegerPart=0;//整数部分
unsigned char DecimalPart=0;//小数部分
void ConfigTimer0(unsigned int ms);
void StopwatchDisplay();
void KeyDriver();
void main()
P2=0XFE;//P2.0置零选第四行按键
ConfigTimer0(2);//T0定时2ms
if(StopwatchRefresh)
//如果刷新需要调用显示函数
StopwatchRefresh=0;
StopwatchDisplay();
KeyDriver();
/*配置并启动T0 ms就是T0的定时时间*/
void ConfigTimer0(unsigned int ms)
tmp=(tmp*ms)/1000; //
ms/1000=1s
f*T=机械周期个数
tmp=65536-
tmp=tmp+18;
T0RH=(unsigned char)(tmp&&8);
T0LH=(unsigned char)
TMOD&=0xF0;
TMOD|=0x01;
/*秒表计数显示函数*/
void StopwatchDisplay()
unsigned char buf[4];//同理数据转换的缓冲区
/*小数部分转换到低2位*/
LedBuf[0]=LedChar[DecimalPart%10];
LedBuf[1]=LedChar[DecimalPart/10];
/*整数部分换到高4位 注意这里和小数部分区别是要用到缓存*/
buf[0]= IntegerPart%10;
buf[0]= IntegerPart/10%10;
buf[0]= IntegerPart/100%10;
buf[0]= IntegerPart/1000%10;
for(i=3;i&=1;i++)//把高位为零的换成空字符
if(buf[i]==0)
LedBuf[i+2]=0xFF;//置空
for(;i&=0;i--)
LedBuf[i+2]=LedChar[buf[i]];
LedBuf[i+2]=0x7F;//运行到整数的最后一位上顺便点亮小数点
/*秒表复位*/
StopwatchReset()
StopwatchRunning=0; //停止秒表
IntegerPart=0;
DecimalPart=0;
StopwatchReset=1//重置刷新标志
/*秒表启停函数*/
void StopwatchAction()
if(StopwatchRunning)//若是已经启动则停止
StopwatchRunning=0;
StopwatchRunning=1;//若是已经停止则启动
/*按键驱动函数,检测到有按键动作,调度相应动作函数,只有两个按键另外四个。注意:需要在主函数调用*/
void KeyDriver()
static unsigned char backup[4]=[1,1,1,1];
for(i=0;i&4;i++)
if(backup[i]!=KeySta[i])
if(backup[i]!=0)
StopwatchReset();
else if(i==2)
StopwatchAction();
backup[i]=KeySta[i];
/*数码管动态扫描刷新函数,注意:需在定时中断中调用*/
static unsigned char i=0;
P1=(P1&0xF8)|i;
P0=LedBUF[i];
//在C里,i&5 i=0 继续走!!!
void KeyScan()
static unsigned char keybuff[4]={
0xFF,0xFF,0xFF,0xFF
keybuff[0]=(keybuff[0]&&1)| KEY1;
keybuff[1]=(keybuff[1]&&1)| KEY1;
keybuff[2]=(keybuff[2]&&1)| KEY1;
keybuff[3]=(keybuff[3]&&1)| KEY1;
for(i=0;i&4;i++)
if(keybuff[i]==0x00)//连续8次扫描为0, 2ms*8(得移动8位上面才能有结果)
KeySta[i]=0;
else if(keybuff[i]==0xFF)
KeySta[i]=1;
/* 秒表计数函数,每隔10ms调用一次进行秒表计数累加 */
void StopwatchCount()
if (StopwatchRunning)
//当处于运行状态时递增计数值
DecimalPart++;
//小数部分+1
if (DecimalPart &= 100)
//小数部分计到100时进位到整数部分
DecimalPart = 0;
IntegerPart++;
//整数部分+1
if (IntegerPart &= 10000)
//整数部分计到10000时归零
IntegerPart = 0;
StopwatchRefresh = 1;
//设置秒表计数刷新标志
/*T0中断函数,完成数码管扫描、按键扫描与秒表计数*/
void InterruptTimer0() interrupt 1
static unsigned char tmr10ms =0;
LedScan();
KeyScan();
//定时10ms进行一次秒表计数
tmr10ms++;
if(tmr10ms&=5)
//2ms一次 2*5=10ms
tmr10ms=0;
StopwatchCount();
按赞数排序
使用定时器计时数码管显示
简单化应该做一个树状图,从main()开始。
main开始 纸上画一下就好了
main是一个线程  定时器也是一个线程
画一个流程图就很清楚了
可以从main{}函数入手,使用keil的调试功能,一步一步进行调试,这样可以很好的清楚怎么工作了
可以把程序看成两部分,一部分是while循环,另一部分是中断函数。
首先看while(1)是一个恒成立的循环,系统在空闲的时候,就会运行while里面的函数,也就是StopwatchDisplay();
KeyDriver();
。另外在运行
while(1)语句块的时候,系统在还会计时。比如说,中断设置的是2秒,那么当计时到2秒的时候,系统就会停下当前执行的语句(并记录下当前语句的下一行,中断结束后,从这里继续运行),跑去执行中断函数 InterruptTimer0() ,中断函数里面有函数LedScan();
KeyScan(); StopwatchCount(); 当中断函数执行完了之后,系统就又跑去上次停下来的地方继续运行。循环往复。
大概就是这个流程。。你要是还有什么不明白可以追问。
比较难的就是中断,这里跳了一下,不是连续运行的
每次中断到了
自动跳到中断函数执行
这个就是中断时间控制
时间片查询的方式运行比较好
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
实现秒表计数功能,使用定时器和外部中断实现。8号按键代表计时开始/结束,C号按键代表重置为0,为了演示方便,这里上限定为15秒。
代码中有详细的注释:
sbit WEI=P2^7;
sbit DUAN=P2^6;
sbit L1=P3^4;
unsigned char code dofly_DuanMa[11]={0x3f,0x06,0x5b,0x4f,0x66,0x
//以前写过一个计时程序,是用汇编语言写的,只用了一个按键实现计时器的启动、暂停和复位。//有位网友要求用C语言写一遍,并提供了部分程序,在下面的博文留言中可以看到://http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/2ece818af7a3f20bc9fc7aca.html//但是这个程序有不少错误,设定定时器的方式时,使用了T0,但
单片机课程设计,简单的51单片机秒表程序,内含详细代码解释。
下午自学了一下单片机的前几章的知识,理解了数码管的显示原理以及静态显示和动态扫描的编程方法。其中,比较重要的几个概念有:数码管公共端类型(共阴极、共阳极)、位选(决定多位数码管中哪一位显示)、段选(决定数码管显示的数字),另外还有锁存器(教材P36,可通过控制锁存端来改变数据输出的状态)。
上周单片机实验课的内容是编一个秒表,在4位数码管中分别显示分和秒还有分秒,即最多可显示“9:59.9”。这
是基于51单片机的秒表程序,4位共阳数码管
数码管显示秒表
具体要求,采用动态扫描的方式让,6个数码管前三个显示秒数,后两个显示毫秒。第四个不用。秒数精确到1%。
单片机秒表程序
1.一个精度为0.1s的秒表系统。
2.有启动按钮、暂停按钮及清零按钮。
3每到一秒钟有声音提醒功能,可通过按钮打开及关闭该提醒音。
压缩包中包含proteus仿真图、hex文件和C语言源代码,代码中写有详尽的注释,一看就能懂
;有位网友写了一个倒计时秒表的程序,程序中的变量,采用了逐次加一的方法。;变量加一,怎么能够倒计时呢?;原来,程序中段码的排列次序,反过来了。;于是:;当变量是0的时候,查找出来9的段码,送去显示;;当变量是1的时候,查找出来8的段码,送去显示;;……;当变量是9的时候,查找出来1的段码,送去显示。;更改一下七段码表的次序,竟然可以使程序由正计时,变成倒计时!;构思极为巧妙。;PROTEUS 仿真
求用单片机设计一个秒表AT89C51要求1、按开关K1秒表开始计时,再按开关K1计时暂停,按开关K2秒表复位。
2、如果可以的话顺便发一下电路图
3、最好是用汇编编写程序谢谢 悬赏分:100 - 解决时间: 08:33 最佳答案:;--------------------------------------------------------;说明:为了提高精度,

我要回帖

更多关于 51单片机秒表程序0-99 的文章

 

随机推荐