导航:首页 > 操作系统 > 单片机数码管电子钟

单片机数码管电子钟

发布时间:2023-03-20 12:57:11

㈠ 利用单片机的定时器和数码管,设计一个电子时钟

给你个电路和程序,//前几天帮一个网友写,单片机定时时钟在调节功能,可以参考一下我程序

/***************************************************
* 6位数码管显示电子钟
*
* 功能: 按键加,按键减, 按键,启动和停止。
*
*
***************************************************/
#include "REG52.H"

sbit SHUG_01 = P2^0; //数码管1
sbit SHUG_02 = P2^1; //数码管2
sbit SHUG_03 = P2^2; //数码管3
sbit SHUG_04 = P2^3; //数码管4
sbit SHUG_05 = P2^4; //数码管5
sbit SHUG_06 = P2^5; //数码管6
sbit KEY0_01 = P0^0; //按键 启动或停止sbit KEY0_02 = P0^1; //按键 加
sbit KEY0_03 = P0^2; //按键减
sbit KEY0_04 = P0^3; //按键菜单
#define LED_DATA P1 //P1数据端口
unsigned char value_temp = 0;unsigned char value_Outk = 0;
unsigned char value_shio = 8;
unsigned char value_feno = 40;
unsigned char value_miao = 0;
unsigned char code value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极unsigned char code value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极带点

/*
* 延时1ms延时子函数
**/
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/* * 程序运行【启动和停止】子函数
**/
void Disp_layledketCmd(void)
{
/***小时***/
SHUG_01 = 1;
LED_DATA = value_tab0[value_shio / 10]; /*******小时的十位数显示***************/
Delay_1ms(5);
SHUG_01 = 0;
SHUG_02 = 1;
LED_DATA = value_tab1[value_shio % 10]; /*******小时的个位数显示***************/
Delay_1ms(5);
SHUG_02 = 0;
/***分钟***/ SHUG_03 = 1;
LED_DATA = value_tab0[value_feno / 10]; /*******分钟的十位数显示***************/
Delay_1ms(5);
SHUG_03 = 0;
SHUG_04 = 1;
LED_DATA = value_tab1[value_feno % 10]; /*******分钟的个位数显示***************/
Delay_1ms(5);
SHUG_04 = 0;
/***秒钟***/ SHUG_05 = 1;
LED_DATA = value_tab0[value_miao / 10]; /*******秒钟的十位数显示***************/
Delay_1ms(5);
SHUG_05 = 0;
SHUG_06 = 1;
LED_DATA = value_tab0[value_miao % 10]; /*******秒钟的个位数显示***************/
Delay_1ms(5);
SHUG_06 = 0;
}
/* * 定时器初始化定时50ms
**/
void Tero_Init(void)
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
EA = 1;
}
/* * 按键开关【启动和停止】子函数
**/
void Scan_keyoutCmd(void)
{
if(KEY0_01 == 0)
{
Delay_1ms(10);
if(KEY0_01 == 0)
{
TR0 = ~ TR0;
}
while(KEY0_01 == 0);
}
if(KEY0_02 == 0) {
Delay_1ms(10);
if(KEY0_02 == 0)
{
value_miao--;
if(value_miao == -1)
{
value_feno--;
value_miao = 59;
if(value_feno == -1)
{
value_shio--;
value_feno = 59;
if(value_shio == -1)
{
value_shio = 23;
}
}
}
while(KEY0_02 == 0);
}
}
if(KEY0_03 == 0) {
Delay_1ms(10);
if(KEY0_03 == 0)
{
value_miao++;
if(value_miao == 60)
{
value_miao = 0;
value_feno++;
if(value_feno == 60)
{
value_feno = 0;
value_shio++;
if(value_shio == 24)
{
value_shio = 0;
}
}
}
while(KEY0_03 == 0); //检测松手
}
}
}
/* * 函数主体
**/
int main(void)
{
P1 = P2 = P3 = 0x00;
Tero_Init();

while(1)
{
Scan_keyoutCmd();
Disp_layledketCmd(); //执行应运程序
}
}
/* * 定时器中断服务程序
**/
void Tmero()interrupt 1
{
TH0 = 0x4C;
TL0 = 0x00;
value_temp++;
if(value_temp == 20)
{
value_temp = 0;
value_miao++;
if(value_miao == 60)
{
value_feno++;
value_miao = 0;
if(value_feno == 60)
{
value_shio++;
value_feno = 0;
if(value_shio == 24)
{
value_shio = 0;
}
}
} }
}

㈡ 毕业设计单片机电子钟用数码管可以吗

可以的。
基于STC单片机的多功能电子钟的设计

云之初
摘要:随着社会的发展和人类科学技术的进步,人们通过观察太阳的自转、沙漏、摆钟到电子钟来认识时间。电子钟的出现使人们在发展过程中更方便地认识时间。与传统机械钟相比,它具有走时准确、直观显示、无机械传动装置等优点,被广泛应用于人们的日常生活中。在生活中。但目前市场上常见的一些电子钟功能单一,没有时间校准、闹钟、阴阳历、阳历等功能。这些功能在一定条件下不能满足我们生活和工作的需要。因此,研悔携制出满足上述要碧绝伏求、性价比高的多功能时钟已成为亟待解决的问题。本文针对目前市场上常见的一些电子钟存在的功能单一、时间校准不足、阴阳历和节气显示功能等缺点。设计开发了一种基于STC单片机的多功能电子钟。介绍了该系统的硬件电路和软件设计。它不仅可以实现年、月、日、周、时、分、秒的基本信息,还可以显示阳历、节气、阴历的信息。具有生日设定、时间校准、闹钟设定提醒等功能。物理装置的测试表明,该时钟具有精度高、功能多、运行稳定、电路简单等优点。
关键词:STC单片机;多功能电宏棚子钟;时间校准

㈢ 51单片机电子钟程序数码管显示

#include<reg51.h>

#define uchar unsigned char

sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
la=0;
P0=table[shi2];
la=1;
la=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[shi1]|0x80;
la=1;
la=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[fen2];
la=1;
la=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[fen1]|0x80;
la=1;
la=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[miao2];
la=1;
la=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[miao1];
la=1;
la=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan0()
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xbb:
ok=0;
break;

case 0x7b:
ok=1;
break;
}
}
}
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void main()
{
TMOD=0x01;

TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;

while(1)
{ keyscan0();

if(ok==1)
{ TR0=1;
wei=0;

if(pp==20)
{ pp=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24) //为24h一个循环,若要12h,只需在此改为12即可。
{
s=0;
}
}
}
}

a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else
{ TR0=0;
keyscan();
if(key!=10)
{

switch(wei)
{
case 1: if(key<3) //小时最高位为2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //当小时最高位为2时,低位最高为4
break;
case 3: if(key<7) //分钟最高位为6
b1=key;
else
wei--;
break;
case 4: b0=key; break;
case 5: if(key<7) //秒最高位为6
c1=key;
else
wei--;
break;
case 6: c0=key; break;
}
key=10;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,b1,b0,c1,c0);
}
}
}

void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}

㈣ 谁能告诉我51单片机简单的led数码管时钟程序 24小时制的(c语言版的)

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位码
P0=(tab[shi/10]); //段码
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位码
P0=0x40; //段码
delay(2);
P2=3; //位码
P0=(tab[fen/10]); //段码
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位码
P0=0x40; //段码
delay(2);
P2=6; //位码
P0=(tab[miao/10]); //段码
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);

}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{

if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}

}

}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}

/*还有什么不明白继续追加*/

㈤ 利用AT89C51单片机设计简易电子钟(六位),通过8位LED数码管实现时间显示;系统可以通过三个按键实现时间


程序设计思路:1.利用单片机内部定时器作为计时器,调用timer函数;2、设计一套按键子程序;(3)设计一套数码显示管子程序。下列提供一套程序供参考。


#include<iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int


const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9对应字符

const uchar key_value[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

uchar data[4]={0}; //显示初始值为0

uint count=0; //初始计数值为0

uchar keynum;



void port_init() //端口初始化函数

{DDRA=0XFF; //端口A为推挽1输出

PORTA=0XFF;

PORTB=0XFF; //端口B为推挽1输出

DDRB=0XFF;

DDRC=0XFF; //端口C为不带上拉电阻的输入

PORTC=0XFF;

DDRD=0XFF; //端口D低4位为输出

PORTD=0X0F;

}



void delay(uint j) //延时函数

{uint k;

while(j--)

{for(k=1000;k>0;k--) ;}

}



void display(uchar *p) //显示函数

{uchar i,sel=0x01;

for(i=0;i<4;i++)

{PORTA=sel; //选通最右边的数码管

PORTB=table[p[i]]; //送字型码

delay(1);

sel=sel<<1; //左移一位

}

}



uchar get_key(void)

{if((PIND&0X0F)!=0X0F) delay(3);

{

PORTD=0XEF;

switch(PIND&0X0F)

{case 0x0e: keynum=key_value[0];break;

case 0x0d: keynum=key_value[4];break;

case 0x0b: keynum=key_value[8];break;

case 0x07: keynum=key_value[12];break;

default:break;

}

PORTD=0xdf;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[1];break;

case 0x0d:keynum=key_value[5];break;

case 0x0b:keynum=key_value[9];break;

case 0x07:keynum=key_value[13];break;

default:break;

}


PORTD=0xbf;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[2];break;

case 0x0d:keynum=key_value[6];break;

case 0x0b:keynum=key_value[10];break;

case 0x07:keynum=key_value[14];break;

default:break;

}

PORTD=0x7f;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[3];break;

case 0x0d:keynum=key_value[7];break;

case 0x0b:keynum=key_value[11];break;

case 0x07:keynum=key_value[15];break;

default:break;

}

while((PIND&0x0f)!=0x0f);

}


return keynum;

}


void process(uint i,uchar *q) //拆分BCD码函数,显示千、百、十、个位

{ q[0]=i/1000;

i=i%1000;

q[1]=i/100;

i=i%100;

q[2]=i/10;

i=i%10;

q[3]=i;

}


void main(void)

{port_init();

PORTB=0xff;

PORTA=0X00;

delay(50);

PORTA=0xff;

while(1)

{get_key();

count=keynum;

process(count,data);

display(data);

}

}

阅读全文

与单片机数码管电子钟相关的资料

热点内容
程序员不时尚 浏览:745
不付费看网站 浏览:230
《代人受过》训诫文 浏览:258
1n.d5h49m6. 浏览:687
linuxweb目录权限 浏览:945
WWW 5a5e 浏览:544
id3v2java 浏览:222
怎么打开mysql命令行 浏览:522
linux文件星号 浏览:632
小城与小妈去北京旅游叫什么小说 浏览:230
pdf阅读器推荐 浏览:81
能免费看英语电影的软件 浏览:126
有部电影女主半夜出去卖淫 浏览:628
西门子编程试题 浏览:82
android转动360 浏览:334
服务器为什么要重装系统 浏览:438
华为尝鲜怎么还是原来的安卓系统 浏览:595
女主是警察的小说 浏览:792
魔兽宏命令是什么 浏览:250
《法国空姐》啄木鸟种子 浏览:95