求助大神,数码管数字时钟问题
写了一个数码管显示数字时钟,但是时间对不上是怎么回事呢?代码如下:
#include<reg52.h> //数码管显示电子时钟
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //段码
uint minute, hour , second,h1, h2, m1, m2, s1 ,s2, count;
void delay(uint z) //延时函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
hour = 0;
minute = 0;
second = 0;
count = 0;
}
void display()
{
dula=1;//控制段选
P0=table; //秒个位
dula=0;
P0=0xff;//消影先不送
wela=1;//控制位选
P0=0X7f;
wela=0;
delay(1);
dula=1;//控制段选
P0=table; //秒十位
dula=0;
P0=0xff;//消影先不送
wela=1;//控制位选
P0=0Xbf;
wela=0;
delay(1);
dula=1;//控制段选
P0=table;//分个位数
dula=0;
P0=0xff;
wela=1;//控制位选
P0=0Xef;
wela=0;
delay(1);
dula=1;//控制段选
P0=table;//分十位数
dula=0;
P0=0xff;
wela=1;//控制位选
P0=0Xf7;
wela=0;
delay(1);
dula=1;//控制段选
P0=table;//时个位数
dula=0;
P0=0xff;//消影先不送
wela=1;//控制位选
P0=0Xfd;
wela=0;
delay(1);
dula=1;//控制段选
P0=table;//时十位数
dula=0;
P0=0xff;//消影先不送
wela=1;//控制位选
P0=0Xfe;
wela=0;
delay(1);
}
void timer0() interrupt 1//定时器0
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
count++;
if(count == 10000)
count = 0;
second ++ ;
if(second == 60)
{
second = 0;
minute ++;
if(minute == 60)
{
minute = 0;
hour ++;
if(hour == 24)
{
hour = 0;
}
}
}
s2 = second % 10;
s1 = second / 10;
m2 = minute % 10;
m1 = minute /10;
h2= hour % 10;
h1 = hour / 10;
}
void main()
{
init();
while(1)
{
display();
}
}
主要问题是、:时间显示太快了 会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗? 傻眼貓咪 发表于 2022-6-4 12:49
会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗?
对是4位数码管了 本帖最后由 傻眼貓咪 于 2022-6-4 15:26 编辑
stephen杜 发表于 2022-6-4 14:16
对是4位数码管了
我对单片机比较不熟,很久之前玩的,现在电脑要安装编译器和连接单片机很麻烦所以没有玩。
我是用 Arduino 呈现 4 位七段数码管的,我的 Arduino 代码,希望对你有帮助:#define pinA 2
#define pinB 3
#define pinC 4
#define pinD 5
#define pinE 7
#define pinF 12
#define pinG 8
#define pinDP 13
#define D1 6
#define D2 9
#define D3 10
#define D4 11
uint8_t pin = { pinA, pinB, pinC, pinD, pinE, pinF, pinG, pinDP, D1, D2, D3, D4 };
void setup() {
for (int i = 0; i < 12; ++i) {
pinMode(pin, OUTPUT); // 设为输出电位
}
Serial.begin(9600);
}
// num 为数字,D 为位,共有 4位(个、十、百、千位)
void foo(int num, int D) {
int digits = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}// 9
};
for (int i = 0; i < 7; ++i) digitalWrite(pin, digits);
digitalWrite(pinDP, LOW); // 设为低电位
for (int i = 8; i < 12; ++i) digitalWrite(pin, 1);
if(D <= 4) digitalWrite(pin, LOW); // 设为低电位
}
void foo3(int num) {
if (num < 10) {
foo(num, 1);
delay(5);
}
else if (num < 100) {
int a, b;
a = num / 10;
b = num % 10;
foo(a, 2);
delay(5);
foo(b, 1);
delay(5);
}
else if (num < 1000) {
int a, b, c, d;
a = num / 100;
b = num % 100 / 10;
c = num % 10;
d = 0;
foo(a, 3);
delay(5);
foo(b, 2);
delay(5);
foo(c, 1);
delay(5);
foo(d, 5);
delay(5);
}
else {
int a, b, c, d;
a = num / 1000;
b = num % 1000 / 100;
c = num % 100 / 10;
d = num % 10;
foo(a, 4);
delay(5);
foo(b, 3);
delay(5);
foo(c, 2);
delay(5);
foo(d, 1);
delay(5);
}
}
int foo2(int num) {
int T = (millis()/1000)%10; // 当程序开始时,millis()函数开始计时(以毫秒为单位),计满50天后,又从0开始一直循环计时
// T 时间线和 foo3() 七段数码管开关函数时间不会互相影响(foo3()只会重复打印当时应该显示的时间)
while (((millis()/1000)%10) - T < 1) {
foo3(num);
}
return T + 1;
}
// 主函数
void loop() {
int x;
for (int num = 0; num < 10000; ++num) {
x = foo2(num);
}
} 傻眼貓咪 发表于 2022-6-4 15:24
我对单片机比较不熟,很久之前玩的,现在电脑要安装编译器和连接单片机很麻烦所以没有玩。
我是用 Ard ...
谢谢 我只是想了解一下单片机的原理 stephen杜 发表于 2022-6-8 20:07
谢谢 我只是想了解一下单片机的原理
好的 {:10_257:} 好像确实是延时delay函数的问题:
① 你前面没有自己编出一个void delay{}函数可以调用,而且主函数应该是main不用void,在main函数里调用 vioid delay ()。
② delay () 函数括号里的数不是想当然的,不能认为 delay (5)就是5ms,这个数和单片机的晶振有关,不同的数值代表了不同的ms,这个具体上网简单学习一下你就会了。
我举一个简单的例子:
void delay(j) //将括号里的数赋值给j
{
uint i;
for(i=0;i<j;i++);//根据j的大小确定时间长度,
}
然后mian函数里就可以直接赋值调用了。
PS:这个delay函数你可以先用流水灯试。{:10_254:}
页:
[1]