标题: 小白求助制作秒表,单片机代码问题 [打印本页]
作者: Afan的单片机 时间: 2017-11-2 22:39
标题: 小白求助制作秒表,单片机代码问题
以上是代码,功能是实现秒表计时,60清零,精确到后两位,我觉得代码没问题啊
以下是仿真
- #include<reg51.h>
- #include<intrins.h>
- char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- int number=0;
- char score[]={0,0,0,0};
- void timer0(void) interrupt 1
- {
- number++;
- score[1]=number/1000;
- score[2]=(number-score[1]*1000)/100;
- score[3]=(number-score[1]*1000-score[2]*100)/10;
- score[4]=number-score[1]*1000-score[2]*100-score[3]*10;
- if (number>6000){number=0;}
- TL0=0Xf0;
- TH0=0Xd8;
- }
- main(){
- int k=0;
- int wei=0x01;
- TMOD=0X01;
- TH0=0Xd8;
- TL0=0Xf0;//10ms
- TR0=1;
- ET0=1;
- EA=1;
- while(1){
- for(k=1;k<5;k++)
- { P2=led[score[k]];
- wei=_crol_(wei,2);
- P3=wei;
- }
- }
- }
复制代码
作者: Afan的单片机 时间: 2017-11-2 23:00
有人吗
作者: yzwzfyz 时间: 2017-11-3 10:10
不知道你要表达的意思是什么!
作者: 王朗的诱惑 时间: 2017-11-3 12:58
数组寻址是从0开始吧?score[0]开始。还有取余数用%就行了,不用那么麻烦。
作者: spark399 时间: 2017-11-3 14:16
声明处:05.char score[]={0,0,0,0};初始为4个元素,编译器分配4个存储空间,数组长度为4,最大有效下标3:有效下标score[0]---score[3];“ for(k=1;k<5;k++)”中k=1~5,一是错位,二是最后一个数据超出地址空间了。
作者: Afan的单片机 时间: 2017-11-3 17:02
秒表计时呢
作者: Afan的单片机 时间: 2017-11-3 17:04
我改成了for(k=0;k<4;k++),为什么还是不能正常显示呢
作者: Afan的单片机 时间: 2017-11-3 17:05
改动了以下:
#include<reg51.h>
#include<intrins.h>
char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number=0;
char score[]={0,0,0,0};
void timer0(void) interrupt 1
{
number++;
score[0]=number/1000;
score[1]=(number-score[1]*1000)/100;
score[2]=(number-score[1]*1000-score[2]*100)/10;
score[3]=(number-score[1]*1000-score[2]*100)%10;
if (number>6000){number=0;}
TL0=0Xf0;
TH0=0Xd8;
}
main(){
int k=0;
int wei=0x01;
TMOD=0X01;
TH0=0Xd8;
TL0=0Xf0;//10ms
TR0=1;
ET0=1;
EA=1;
while(1){
for(k=0;k<4;k++)
{ P2=led[score[k]];
wei=_crol_(wei,2);
P3=wei;
}
}
}
作者: Afan的单片机 时间: 2017-11-3 17:11
是1-4呢,5不满足条件
作者: zl2168 时间: 2017-11-3 21:08
本帖最后由 zl2168 于 2017-11-3 21:10 编辑
实例93 99.9秒秒表
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。若需99.99秒,硬件电路增加一位595。软件程序增加0.01s(10ms)计数器,并修改相应计数显示程序。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: Afan的单片机 时间: 2017-11-3 23:14
额。。。感谢 但是我的哪里错了呢
作者: zjb2106558 时间: 2017-11-4 09:26
位扫描要加延时,不然看不到效果
作者: zjb2106558 时间: 2017-11-4 09:28
位扫描要有延时
作者: zl2168 时间: 2017-11-4 09:56
读懂正确有效程序,就知道自己错在哪儿了!
作者: 王朗的诱惑 时间: 2017-11-4 11:44
score[1]=(number-score[1]*1000)/100;后面的score[1]也得跟着改成score[0]呀。剩下那几句也是……。
作者: Afan的单片机 时间: 2017-11-5 22:27
是的 为什么
作者: Afan的单片机 时间: 2017-11-5 22:37
#include<reg51.h>
#include<intrins.h>
char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number=0;
sbit LED = P2^7;
char score[]={0,0,0,0};
char key=0;
void delayms(unsigned int x)
{
unsigned char t;
while(x--)
for (t=0;t<120;t++);
}
void timer0(void) interrupt 1
{
number++;
score[0]=number/1000;
score[1]=number%1000/100;
score[2]=number%100/10;
score[3]=number%100%10;
if (number>6000){number=0;}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
main(){
int k=0;
int wei=0x01;
TMOD=0X01;
TH0=(65536-12000)/256;
TL0=(65536-12000)%256;
TR0=1;
ET0=1;
EA=1;
key=0xff&P1;
if(key=0xff)
{
while(1){
for(k=0;k<4;k++)
{ P2=led[score[k]];
P3=wei;
if (P3==0x04){LED=0;}
delayms(15);
P2=0xff;
wei=_crol_(wei,2);
}
}
}
if(key!=0xff) TR0=0;
}
这样怎么不能实现按键暂停呢啊
-
1.jpg
(114.74 KB, 下载次数: 39)
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |