㈠ 用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。
用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。
用proteus做的时钟
可以显示年月日时分秒
可调整时间
有图
*/
#includereg52.h
㈡ 求程序用AT89C51单片机......用六位数码管实现数字时钟,显示时分秒,用两个按键可分别调整时、分。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,miao,fen,shi;
sbit m=P3^0;
sbit n=P3^1;
uchar code table[]={ //数码管编码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void display(uchar miao,uchar fen,uchar shi);
void delay(uint z);
void init();
void main()
{
init();//初始化子程序
miao=0;
shi=0;
fen=0;
while(1)
{
display(miao,fen,shi);
}
}void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void display(uchar miao,uchar fen,uchar shi) // 显示子函数
{
P0=0x00;
P0=table[miao%10];
P2=0x7f;
delay(1);
P0=0x00;
P0=table[miao/10];
P2=0xbf;
delay(1); P0=0x00;
P0=table[fen%10];
P2=0xdf;
delay(1);
P0=0x00;
P0=table[fen/10];
P2=0xef;
delay(1);
P0=0x00;
P0=table[shi%10];
P2=0xf7;
delay(1); P0=0x00;
P0=table[shi/10];
P2=0xfb;
delay(1);
}void init() // 初始化子函数
{
temp=0;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //租茄并定时器初值,定时50ms(12M晶振),由于考虑MCU指令处理时间,此处赋初值位45872
EA=1;
ET0=1;
TR0=1;
}void timer0() interrupt 1 //定时计数器中纳族断
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; 、
aa++;
if(aa==20) //中断2次位1S,秒加1
{
miao++;
aa=0;
if(miao==60)
{
fen++; // 满60S, 分加1,秒清0
miao=0;
if(fen==60)
{
shi++; // 小时弊迹加1
fen=0;
if(shi==24) shi=0; //小时满
}
}
}
if(m==0) // 调分
{
delay(2);
if(m==0) fen++;
if(fen==60) fen=0;
delay(2);
while(!m);
}
if(n==0) // 调小时
{
delay(2);
if(n==0) shi++;
if(shi==24) shi=0;
delay(2);
while(!n);
}
}
㈢ 单片机控制8位数码管,显示年月日和时分秒,但是这两者该如何切换呢
切换方式可以有两种,一种是手动的,就是用一个按钮,按一下显示年月日,再按一下显示时钟,再按就重复了。
另一种是自动切换,可以定时几秒钟一切换显示。
你注意一下共交车上的时钟和温度的显示就是自动切换的,可以用这种方式比较好。
㈣ 51单片机6位数码管显示时间
C51单片机六位数码管时钟
用数码管dot分隔时分秒
用三个按键设置时间:
SET键:小时设定->分钟设定->结束设定,小时设定状态时表示小时的两位数码管闪烁,分钟设定时表示分钟的两位数码管闪烁
CHANGE键:在小时设定状态和分钟设定状态改变数值
SET S键:秒置零
C语言代码:
//main.c
#include <REGX52.H>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
#define KEY P2
#define KEYMASK 0x07
sbit LE1 = P2^6; //定义位控口
sbit LE2 = P2^7; //定义段控口
UCHAR KeyPressDown = 0x00;
UCHAR KeyRelease = 0x00;
UCHAR LastKey = 0x00;
UCHAR MODE ;
extern UCHAR HH;
extern UCHAR MM;
extern UCHAR SS;
extern bit T_CYCLE ;
extern void T0_Init(void); //初始化定时器,函数定义在Timer.c
UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(UINT t) //延时t时钟周期
{
while (t--) ;
}
void H_Increase(void) //小时增1
{
if(HH<23) HH++;
else
{
HH = 0;
}
}
void M_Increase(void) //分钟增1
{
if(MM<59) MM++;
else
{
MM = 0;
H_Increase();
}
}
void S_Increase(void) //秒增1
{
if(SS<59) SS++;
else
{
SS = 0;
M_Increase();
}
}
void display(UCHAR SEG,UCHAR Digi) //显示一位数码管,SEG = 0-9数字,Digi = 第0-6位
{
LE2 = 1;
P0 = (0x01<<Digi) ;
LE2 = 0;
P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
if (Digi==1||Digi==3) P0 &= 0x7f ; //显示分隔符
delay(50);
P0 = 0xff;
LE1 = 0;
}
void main(void)
{
P0 = 0xff;
LE1 = 0;
LE2 = 0;
T0_Init();
while(1)
{
if(MODE != 1 || T_CYCLE)
{
display(HH/10,0); //显示小时十位数
display(HH%10,1); //显示小时个位数
}
if(MODE != 2 || T_CYCLE)
{
display(MM/10,2); //显示分钟十位数
display(MM%10,3); //显示分钟个位数
}
display(SS/10,4); //显示秒十位数
display(SS%10,5); //显示秒个位数
}
}
void key_Process(void) //按键处理程序
{
UCHAR CurrKey;
KEY |= KEYMASK; //将按键对应的IO设置为输入状态
CurrKey = (~KEY) & KEYMASK;
KeyPressDown = (~LastKey) & CurrKey;
KeyRelease = LastKey & (~CurrKey);
LastKey = CurrKey;
switch(KeyRelease)
{
case 1:
if(MODE == 2) MODE = 0;
else MODE ++;
break;
case 2:
if(MODE == 1) H_Increase() ;
if(MODE == 2) M_Increase() ;
break;
case 4:
SS = 0;
break;
default: break;
}
}
//Timer.c
#include <reg52.h>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
UCHAR HH = 14; //小时初始值
UCHAR MM = 2; //分钟初始值
UCHAR SS = 55; //秒初始值
UINT u_10ms = 0; //10ms计数
bit T_CYCLE = 0;
extern void key_Process(void);
extern void S_Increase(void);
void T0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01;
//定时器赋初始值,定时时间为10ms。
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
IE = 0x82;
}
void T0_INTSrv(void) interrupt 1
{
//定时器重新开始计时。
TH0 = 0xd8;
TL0 = 0xf0;
u_10ms ++;
if (u_10ms%20==0) // 200 ms
{
T_CYCLE = ! T_CYCLE; //闪烁循环
}
if (u_10ms>99) // 1000 ms = 1 second
{
u_10ms = 0;
S_Increase();
}
key_Process(); //SET按键处理
}
Proreus仿真电路: