求4为7段共阳极数码管C语言程序,用定时计数

2023-01-16

高两位显示分钟低两位显示秒,每隔1S,秒钟变化一次,哪位大侠帮帮忙,谢谢啦。。。 /***源程序默认硬件环境:52单片机,12MHz晶振,四位共阳数码管,P0段选,P20-P23低电平位选,P23最高位,P20最低位***/
#include"reg52.h" //包含52头文件
#define TRUE 1 //定义布尔量'1':真
#define FALSE 0 //定义布尔量'0':假
#define uchar unsigned char //定义 无符号字符型数据 简称
#define uint unsigned int //定义 无符号整型数据 简称

#define th0 0x3c
#define tl0 0xb0 //50ms at 12MHz(定时器工作模式1 状态)
#define th1 0xfc
#define tl1 0x18 //1ms at 12MHz(定时器工作模式1 状态)
#define T1sAt50msCount 20 //定义 1s 在 50ms 计时基准状态下 的计数值 为20

#define SEG_Num 4
#define SEG_Data P0 //数码管段驱动接口
#define SEG_En P2 //数码管位驱动接口
#define SEG_AllOff (SEG_En|=0x0f) //关闭所有数码管(位驱动)
#define DisTimeAt1msCount 4 //单'位'数码管显示时间,数码管刷新频率f=1/(N*t),其中 N为数码管位数,t 为单'位'数码管显示时间

uchar SEG_B_List[10]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; //共阳数码管代码表"0-9"

uchar Sec,Min;
uchar bdata Flag=2;
sbit T1sTimesUpFlag=Flag^0;
sbit DisplayFlag=Flag^1;

void Timer0() interrupt 1 //定时器0中断函数

static uchar t50ms;
TL0=tl0;
TH0=th0;
t50ms=++t50ms%T1sAt50msCount; //先对50ms计时变量加1,后对变量范围进行限制(0~19)(即对20取模)
if(!t50ms) T1sTimesUpFlag=TRUE; //若计时变量归0,表示计时变量曾经到达20(1s),则对1s计时标志位 置位


void Timer1() interrupt 3

static uchar t1ms;
TL1=tl1;
TH1=th1;
t1ms=++t1ms%DisTimeAt1msCount; //先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE; //若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位


void TimerInit()

TMOD=0x11; //开启定时器0、定时器1,并都工作在模式1
TH0=th0;
TL0=tl0;
TR0=1; //启动T0定时器 计时
ET0=1; //允许定时器0中断
TH1=th1;
TL1=tl1;
TR1=1; //启动T1定时器 计时
ET1=1; //允许定时器1中断
EA=1; //开启系统中断功能


void TimesUpdata() //时间更新函数

if(T1sTimesUpFlag) //若 1s计时标志位 为 真,即 1s定时时间到

Sec=++Sec%60; //秒Sec在0-59范围内加1
if(!Sec) Min=++Min%60; //若秒Sec 重归0,则分Min在0-59范围内加1
T1sTimesUpFlag=FALSE; //清 1s计时标志位



float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数

float sum;
if(x==0 && y==0) return; //0 的 0 次方无意义
else if(x==0) sum=0; //可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1; //除上述情况外,任何数的 0 次方均为 1
else if(y==1) sum=x; //任何数的 1 次方 均为 本身
else if(y>1) sum=Pow_Self(x,--y)*x; //递归调用,降幂
return sum; //返回计算结果


void Display(uint dis_num) //显示函数,显示内容为 无符号整型数据 dis_num

static dis_loca; //定义静态变量 显示位置
dis_loca=++dis_loca%SEG_Num; //先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff; //关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10]; //将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
if(dis_loca==2) SEG_Data &=0x7f; //显示 小数点,用于区分 Min 跟 Sec
SEG_En&=~(1<<dis_loca); //开启本次需要显示的位驱动(低驱动)


void ClockDisplay() //时钟显示函数

if(DisplayFlag) //若 显示标志位 为 真

Display(Min*100+Sec); //调用 显示函数,显示内容为:高2位显示 分Min,低2位显示 秒Sec
DisplayFlag=FALSE; //清 显示标志



void main()

TimerInit(); //调用 定时器初始化函数
while(1) //循环系统

TimesUpdata(); //调用 时间更新函数
ClockDisplay(); //调用 时钟显示函数

参考知识1 #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;
sbit WE=P2^7;
uchar num, num1,num2,sf,yf,sm,ym;
void display(uchar ,uchar ,uchar ,uchar );
uchar code table[]=0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71;void delay_ms(uint x)

uint i;
uchar j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);

void main()

TMOD=0X10;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET1=1;
TR1=1;
while(1)

if(num==20)

num=0;
num1++;
if(num1==60)

num2++;
num1=0;

if(num2==60)

num1=0;
num2=0;


sf=num2/10;
yf=num2%10;
sm=num1/10;
ym=num1%10;
display( sf, yf, sm, ym);


void time1() interrupt 3

TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num++;

void display(uchar sf,uchar yf,uchar sm,uchar ym)

DU=1;
P0=table[sf];
DU=0;
P0=0XFF;
WE=1;
P0=0XFE;
WE=0;
delay_ms(5);

DU=1;
P0=table[yf];
DU=0;
P0=0XFF;
WE=1;
P0=0XFD;
WE=0;
delay_ms(5);

DU=1;
P0=table[sm];
DU=0;
P0=0XFF;
WE=1;
P0=0XFb;
WE=0;
delay_ms(5);

DU=1;
P0=table[ym];
DU=0;
P0=0XFF;
WE=1;
P0=0XF7;
WE=0;
delay_ms(5);

参考资料:自己写的!在我的单片机上没问题!

相似知识
共阳极四位七段数码管(12个引脚)怎么连接到单片机上啊 参考知识1哦,这个啊……正面看的话,上面6脚,下面6脚,共12脚上面从左到右是1,a,f,2,3,b下面从左到右是e,d,dp,c,g,4其中1,2,3,4是4个数码管的位选,因为是共阳,所以这几脚高
共阳极四位七段数码管(12个引脚)怎么连接到单片机上啊 哦,这个啊……正面看的话,上面6脚,下面6脚,共12脚上面从左到右是1,a,f,2,3,b下面从左到右是e,d,dp,c,g,4其中1,2,3,4是4个数码管的位选,因为是共阳,所以这几脚高电平时才有
C语言程序4位7段数码管共阴改共阳 共阳极:位选为高电平(即1)选中数码管,各段选为低电平(即0接地时)选中各数码段,由0到f的编码为:ucharcodetable[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8
动态四位七段共阳极数码管显示实验如图所示,为啥要在abcdefg哪里接几个电阻,解释一下作用 图中一排的8个电阻是上拉电阻。因为51单片机的P0口是“准”双向口,拉电流(输出电流)的能力不足,所以在实际使用时一般需要添加上拉电阻,这样在输出高电平的时候才能保证有足够的电流提供给负载。好好学习天
四位共阳极数码管如何设置位选c语言编码 如果是AT89***或者STC**单片机,如图依图完整的控制代码没时间弄你可以百度,资源多的是,如果只想知道数码位的控制方法可以说一下,根据你图示,只要在三极管的基极加上低电平就可以给相应的数码位加电
7段共阴数码管怎样能在proteus里找到 数码管在proteus的“Optoelectronics”元件库中。在Optoelectronics库中含有Cathode的器件均为共阴极的。6个7段数码管的是:颜色6Digit7-SegmentCa
七段数码管上下中间引脚该怎么接? 七段数码管的GND属于共阴极,接地(低电平)。共阳极的数码管,中间就是接正极(高电平)。数码管中间的两个脚,内部己经有短接。七段数码管分为共阳极及共阴极,共阳极的七段数码管的正极(或阳极)为八个发光二
手动计数器:一位数码管,一个按键,按下一次数码管加1,计数上限为9 参考知识1是8个数码管?首先用8个十进制计数器互相连接,形成10X8=100000000进制计数器然后让按键作为一个clk输入,你可以设置成ifclk'eventandclk='1&#