新闻动态
资质荣誉
联系我们
【新手求助![抱拳]!】|数码管显示时钟
发布时间:2020-11-14 09:58:15 来源:大电流电感厂家 查看: 次
用动态扫描方法和定时器0在数码管的后五位显示出秒表,精确到1%秒,即最后一位显示1%秒,一直循环下去
数码管显示为 ×××:×× 。
我的代码如下://程序运行的结果是数码管压根不亮……求大神指教[抱拳]
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2; //138译码器,用于控制数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
u8 b,s,g,sf,bf,tempt,x;
void initial(); //初始化子函数
void delay(u16 a); //延时子函数
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf); //显示子函数
void main()
{
initial();
while(1)
{
if(x==10) //x在定时器中,每1ms++
{
tempt++;
if(tempt==100000) //加到五位数则tempt清零
tempt=0;
b=tempt/10000; //b即百,即×××:××中第一位,b××:××
s=tempt%10000/1000; //s即十,即×××:××中第一位,×s×:××
g=tempt%1000/100; //以此类推
sf=tempt%100/10;
bf=tempt%10;
display(b,s,g,sf,bf);
}
}
}
void delay(u16 a)
{
while(a--);
}
void initial()
{
tempt=0;
b=0;
s=0;
g=0;
bf=0;
sf=0;
TMOD|=0x01; //TMOD=TMOD|0x01
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18; //初值使定时器显示1ms
EA=1;
ET0=1;
TR0=1;
}
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf)
{
u8 i;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
LSA=0;LSB=0;LSC=0; break; //LSA,LSB,LSC为138译码器的三个输入端
P0=smgduan[bf]; //LSA=0;LSB=0;LSC=0位选第一个数码管
delay(50);
case 1:
LSA=1;LSB=0;LSC=0; break;
P0=smgduan[sf];
delay(50);
case 2:
LSA=0;LSB=1;LSC=0; break;
P0=smgduan[g];
delay(50);
case 3:
LSA=1;LSB=1;LSC=0; break;
P0=smgduan[s];
delay(50);
case 4:
LSA=0;LSB=0;LSC=1; break;
P0=smgduan[b];
delay(50);
}
delay(50);
P0=0x00; //消影
}
}
void timer0() interrupt 1 //定时器0
{
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18;
x++;
}
看看最小系统的复位电路和时钟电路
数码管显示为 ×××:×× 。
我的代码如下://程序运行的结果是数码管压根不亮……求大神指教[抱拳]
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2; //138译码器,用于控制数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
u8 b,s,g,sf,bf,tempt,x;
void initial(); //初始化子函数
void delay(u16 a); //延时子函数
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf); //显示子函数
void main()
{
initial();
while(1)
{
if(x==10) //x在定时器中,每1ms++
{
tempt++;
if(tempt==100000) //加到五位数则tempt清零
tempt=0;
b=tempt/10000; //b即百,即×××:××中第一位,b××:××
s=tempt%10000/1000; //s即十,即×××:××中第一位,×s×:××
g=tempt%1000/100; //以此类推
sf=tempt%100/10;
bf=tempt%10;
display(b,s,g,sf,bf);
}
}
}
void delay(u16 a)
{
while(a--);
}
void initial()
{
tempt=0;
b=0;
s=0;
g=0;
bf=0;
sf=0;
TMOD|=0x01; //TMOD=TMOD|0x01
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18; //初值使定时器显示1ms
EA=1;
ET0=1;
TR0=1;
}
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf)
{
u8 i;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
LSA=0;LSB=0;LSC=0; break; //LSA,LSB,LSC为138译码器的三个输入端
P0=smgduan[bf]; //LSA=0;LSB=0;LSC=0位选第一个数码管
delay(50);
case 1:
LSA=1;LSB=0;LSC=0; break;
P0=smgduan[sf];
delay(50);
case 2:
LSA=0;LSB=1;LSC=0; break;
P0=smgduan[g];
delay(50);
case 3:
LSA=1;LSB=1;LSC=0; break;
P0=smgduan[s];
delay(50);
case 4:
LSA=0;LSB=0;LSC=1; break;
P0=smgduan[b];
delay(50);
}
delay(50);
P0=0x00; //消影
}
}
void timer0() interrupt 1 //定时器0
{
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18;
x++;
}
看看位选断码对不对
是不是共阴或共阳数码管选错了
太子的空间 发表于 2017-8-25 01:29
是不是共阴或共阳数码管选错了
战胜心魔 发表于 2017-8-24 20:24
看看位选断码对不对
战胜心魔 发表于 2017-8-24 20:24
看看位选断码对不对
看看最小系统的复位电路和时钟电路
基于CORTEX的STM32的三相电能表方案背景电能表是用来测量电能的仪表,又称电度表,火表,电能表,千瓦小时表,指测量各种电学量的仪表。基于ARM的方案已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的A
基于ADI ADE7755的单相复费率电能表设计方案1.1 DDSF系列电能表设计方案概述DDSF系列电能表的硬件电路设计由电源电路设计、计量电路设计、通讯电路设计、MCU及其它部分电路设计四大部分组成。其中核心部分是计量电路的设计,它是电能表计量准确
[变压器]脉冲变压器驱动的疑问 本帖最后由 poorhack 于 2015-7-14 10:23 编辑 如下图所示,脉冲变压器的驱动电路,由于电流,功率都很小,所以直接用三极管驱动。 不知道用npn和pnp这两种电路有什么区别。 第一张图在实际实验时发现变压器初级电压并不高,导致次级放大电压也不高,我尝试在初级并联一个谐振电容,效果也不好,求解。 已经解决了,是三极管选型选错满意回复