用4个动态数码管显示,实现0~9999计数功能,延时为1s,用c语言。

如题所述

/***数显秒表,范围0~9999***/
/***源程序默认硬件环境:52单片机,12MHz晶振,4位共阳数码管,P0 口段选,P10~P13 高电平位选(NPN三极管驱动),P13为最高位数码管***/
#include"reg52.h" //包含52头文件
#define TRUE 1 //定义布尔量'1':真
#define FALSE 0 //定义布尔量'0':假
#define uchar unsigned char //定义 无符号字符型数据 简称
#define uint unsigned int //定义 无符号整型数据 简称
#define th0 0xfc
#define tl0 0x18 //1ms at 12MHz(定时器工作模式1 状态)
#define SEG_Num 4 //数码管位数
#define SEG_Data P0 //数码管段驱动接口
#define SEG_En P1 //数码管位驱动接口
#define SEG_AllOff (SEG_En&=0xf0) //关闭所有数码管(位驱动)
#define DisTimeAt1msCount 4 //单'位'数码管显示时间,数码管刷新频率f=1/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间
#define T1sAt1msCount 1000 //1秒 计数值(在定时器为1ms 情况下计数)
#define TimesEnd 10000 //显示内容范围 0~9999
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管代码表"0-9"
uint Sec;
uchar bdata Flag=1;
sbit DisplayFlag=Flag^0; //显示标志位
sbit TimesUpFlag=Flag^1; //时间更新标志位
void Timer0() interrupt 1 //定时器0中断函数
{
static uchar t1ms; //定义静态变量 t1ms 定时计数寄存空间
static uint t1ms_sec;
TL0=tl0;
TH0=th0; //重赋 1ms 定时初值
t1ms=++t1ms%DisTimeAt1msCount; //先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE; //若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
t1ms_sec=++t1ms_sec%T1sAt1msCount; //在 T1sAt1msCount(1000) 范围内加1
if(!t1ms_sec) TimesUpFlag=TRUE; //若 归0,则1s 时间到,时间更新标志位 置位
}
void SystemInit() //系统初始化函数
{
TMOD=0x01; //关闭定时器1,开启定时器0,且工作在模式1(16位定时器)
TH0=th0;
TL0=tl0; //装定时初值(1ms at 12MHz)
TR0=1; //启动计时
ET0=1; //允许定时器0中断
EA=1; //开启系统中断功能
}

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 TimesUpdata() //时间更新 函数
{
if(TimesUpFlag) //若 时间更新标志 为真
{
Sec=++Sec%TimesEnd; //Sec (秒)在 TimesEnd (0~999) 范围内加1
TimesUpFlag=FALSE; //清 时间更新标志位
}
}
void Display(uint dis_num) //显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca; //定义静态变量 显示位置
if(DisplayFlag) //若显示标志位为真(单'位'显示时间结束),则执行以下任务
{
DisplayFlag=FALSE; //清显示标志位
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)上的数值转成代码,并送到数据端口
SEG_En|=1<<dis_loca; //开启本次需要显示的位驱动
}
}
void main() //主函数
{
SystemInit(); //调用 系统初始化函数
while(1) //循环系统
{
TimesUpdata(); //调用 时间更新函数
Display(Sec); //调用 显示函数 显示内容为 Sec
}
}追问

要那么复杂啊?

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-26
硬件的我不懂。软件实现可以。
#include<stdio.h>
#include <unistd.h>
int main()
{
int i=0;
sleep(1);
printf("%d\n",i++);
return 0;
}

用4个动态数码管显示,实现0~9999计数功能,延时为1s,用c语言。
define SEG_AllOff(SEG_En&=0xf0)\/\/关闭所有数码管(位驱动)define DisTimeAt1msCount4\/\/单'位'数码管显示时间,数码管刷新频率f=1\/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间 define T1sAt1msCount1000\/\/1秒 计数值(在定时器为1ms 情况下计数)define TimesEnd10000\/\/显示内容范围 ...

四位一体共阳级数码管动态显示c语言编程
\/\/满意请采纳\/\/这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止\/\/使用时需采用锁存器#include <reg52.h>#include"stdio.h"unsigned char code LED[]={0xc0, 0xf9, 0xa4,0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};unsigned charLEDbuff[]={0xff,0xff,0xff...

单片机数码管显示0到999c语言程序怎么编
unsigned char xs_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned int time=0,s,sz;delay(unsigned int k){ unsigned int i,j;for(i=0;i<k;i++)for(j=0;j<125;j++);}INT_0()interrupt 0 { delay(10);if(INT0==0){sz++; if(sz>2){sz=0;}...

...4位数码管从0显示到9999,然后再从0到9999计数,并且在显示完一次后...
4、键盘输入与屏幕显示的字符不一致。此种故障可能是由于电路板上产生短路现象造成的,其表现是按这一键却显示为同一列的其他字符,此时可用万用表或示波器进行测量,确定故障点后进行修复。5、按下一个键产生一串多种字符,或按键时字符乱跳,这种现象是由逻辑电路故障造成的。先选中某一列字符,若是不...

这是一个4位共阳数码管动态显示9999~1(每次变化值为1)。为什么不能点亮...
你既然用共阳数码管,那位码就应该是1有效,可是你的程序却是0有效。所以,显示子程序有问题。更重要的问题出在主程序,主程序没有while(1)语句,肯定是错误的。主程序问题太多了,自己看吧。还有那两个计数i和b,计数到9999的要用整型的,才能计到9999,而你有char型的,最大才是255。再看一下...

51单片机 编写4个LED数码管同时循环显示0—9的数字 的程序。
0xc0, 0xf9, 0xa4, 0xb0, 0x99, \/\/0-4 0x92, 0x82, 0xf8, 0x80, 0x90};\/\/5-9 while(1) { P0 = SEG[n1]; \/\/P0口,外接共阳数码管的段选端 delay(2000);n1++; if(n1 > 9) n1 = 0;} } 4个(任意个)共阳数码管的段选端,接在 P0,其位选,都接电源即可。

要设计一个电子秒表,从00.00到99.99,4位数码管显示 2个按键 开始\/暂停...
定时器0.01秒刷新,数码管动态显示。用一个变量存当前时间的数据,点开始键打开定时器,暂停关闭定时器就行了。

用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器...
用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。用proteus做的时钟 可以显示年月日时分秒 可调整时间 有图 \/ includereg52.h

C语言 数码管的动态显示0—99 P1接段码,P2接位码 救命啊 没学过就叫...
status = 0;} break;} } void Display_Init(void){ PORTC = 0x00;PORTD = 0x00;DDRD = 0xFF;DDRC = 0x03;} void Display(void){ static unsigned char flag = 0;unsigned char temp1 = 0;unsigned char temp2 = 0;temp1 = count \/ 10;temp2 = count % 10;PORTC |= 0x03;swit...

51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等_百度...
include <reg52.h>\/\/P0是数码管。P1是LED.P2是按键sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;#define uchar unsigned char#define ulint unsigned long#define Frequency 10\/\/定时器中断时间 = f*T#define Time 1\/\/一个周期...

相似回答