导航:首页 > 操作系统 > 4位数字电子钟单片机

4位数字电子钟单片机

发布时间:2024-05-08 06:25:46

⑴ 51单片机数字秒表设计用4位数码管分别显示十秒,秒,百毫秒,十毫秒计时范围为10ms到99s

/***************************************************************************/

#include <reg51.h>

sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//数码管位选端口

char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码

void YS(char hs); void XS(int xm,int xs); void Time1(void);int n,i,m,s;

/***************************************************************************/

void main(void){Time1();while(1){XS(m,s);}}//主函数

/***************************************************************************/

void int1() interrupt 1 //定时器中断

{

TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;

if(n>1000){n=0;s++; if(s>59){s=0;m++;if(m>59){m=0;}}}

}

/***************************************************************************/

void Time1(void)//定时器初始化

{

TH0=(65536-921)/256; TL0=(65536-921)%256;

TMOD=0x01; EA=1; ET0=1; TR0=1;

}

/***************************************************************************/

void XS(int xm,int xs) //数码管显示

{

char d1,d2,d3,d4;

d1=(xs/1)%10; d2=(xs/10)%10; d3=(xm/1)%10; d4=(xm/10)%10;

P0=table[d1]; Axs=0; YS(10); Axs=1;//个位显示

P0=table[d2]; Bxs=0; YS(10); Bxs=1;//十位显示

P0=table[d3]; Cxs=0; YS(10); Cxs=1;//百位显示

P0=table[d4]; Dxs=0; YS(10); Dxs=1;//千位显示

}

/***************************************************************************/

void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数

/***************************************************************************/

数码管的端口用的可能不一样,自己改下

⑵ 姹傚崟鐗囨満4浣嶆暟瀛楅挓镄勭▼搴

#include<AT89X52.H>

#defineucharunsignedchar

#define FLASH_FREQ 100

sbitKEY1=P1^4; //瀹氢箟KEY1 鍒嗗姞1

sbitKEY2=P1^5; //瀹氢箟KEY2 绉掑姞1

#defineCOM1_ON(P2=0xf7) //11111110 //浣庣数骞崇偣浜

#defineCOM2_ON(P2=0xfb) //11111101

#defineCOM3_ON(P2=0xfd) //11111011

#defineCOM4_ON(P2=0xfe) //11110111

#defineCOMS_OFF(P2=0xff) /*鏁扮爜绠″叏𨱔瀹忓畾涔*/

#defineSEG_PORT (P0) /*娈电爜鏁版嵁杈揿嚭绔鍙*/

ucharcodeLED_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//鍏遍槼鏋,COM閲囩敤7404鍙栧弽椹卞姩

#defineDISPLAY_BIT 4 //鏁扮爜绠℃樉绀轰綅鏁

ucharDisBuff[DISPLAY_BIT]; //鏄剧ず缂揿啿鍖

bitDisDecemal=0;//鏄钖︽樉绀哄皬鏁扮偣

ucharshi=11,fen=59,miao=49;

voiddelay(ucharms)//1ms寤舵椂,12MHz

{

uchari,j;

for(i=ms;i>0;i--)

for(j=122;j>0;j--);

}

voidLED_DisplayTimer(ucharLED1,ucharLED2,ucharLED3,ucharLED4)

{

DisBuff[0]=LED_Tab[LED1];

DisBuff[1]=LED_Tab[LED2];

DisBuff[2]=LED_Tab[LED3];

DisBuff[3]=LED_Tab[LED4];

/**************灏忔暟镣归棯鐑佸湪杩欓噷鎺у埗*****/

if(DisDecemal==1)

DisBuff[1]&=0x7f; //镣逛寒灏忔暟镣

/**************************************/

}

voidTimer0_Init(void)//@12MHz,STC8952

{

TMOD=0x01;

TH0=(65536-5000)>>8; //閲嶈5ms镄勫埯鍊

TL0=(65536-5000);

IE=0x82;

TR0=1;

}

voidDisplay_Scan(void)//鍏遍槾鏋佹暟镰佺 <5ms璋幂敤涓娆

{

staticucharCOM;

COM++;

if(COM>=DISPLAY_BIT) COM=0; //COM镄勫煎湪0,1,2,3涔嬮棿鍒囨崲

COMS_OFF; //鍒囨崲鍓嶅皢鍏ㄩ儴鏄剧ず𨱌傛椂鍏抽棴,阆垮厤铏氩奖,镓璋撹櫄褰卞氨鏄鏁扮爜绠$湅璧锋潵"鍏ㄤ寒"

switch(COM)

{

case0:SEG_PORT=DisBuff[0]; //镞鍗佷綅

COM1_ON;

break;

case1:SEG_PORT=DisBuff[1]; //镞涓浣

COM2_ON;

break;

case2:SEG_PORT=DisBuff[2]; //鍒鍗佷綅

COM3_ON;

break;

case3:SEG_PORT=DisBuff[3]; //鍒涓浣

COM4_ON;

break;

}

}

voidKeyScan(void)//阌鐩樻壂鎻忕▼搴

{

if(KEY1==0)

{

delay(5);

if(KEY1==0)

{

shi++;

if(shi==24)

shi=0;

while(!KEY1)//绛夊緟鎸夐敭閲婃斁, 浠跨湡鎸夐敭闀挎椂闂翠笉閲婃斁,褰卞搷鏄剧ず

{

LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);

}

}

}

else if(KEY2==0)

{

delay(5);

if(KEY2==0)

{

fen++;

if(fen==60)

fen=0;

while(!KEY2)//绛夊緟鎸夐敭閲婃斁

{

LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);

}

}

}

}

voidmain()

{

Timer0_Init();

while(1)

{

LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);

KeyScan(); //阌鐩樻壂鎻

}

}

voidTimer0(void)interrupt1 using3 //鍓嶅彴绋嫔簭

{

staticucharflashFREQ;//闂鐑侀戠巼鎺у埗

staticucharmms;//缁熻′腑鏂娆℃暟,锅氭椂阍熺殑锘哄嗳婧

flashFREQ++;

mms++;

TH0=(65536-5000)>>8; //閲嶈5ms镄勫埯鍊

TL0=(65536-5000);

if(mms==200)//5*200=1000

{

mms=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

shi=0;

}

}

}

Display_Scan(); //锷ㄦ佹壂鎻忔暟镰佺 <5ms璋幂敤涓娆

if(flashFREQ>=FLASH_FREQ)

flashFREQ=0; //闂鐑佽℃椂

if(flashFREQ>=FLASH_FREQ/2)//闂鐑佸叾瀹炲氨鏄涓鍗婃椂闂存e父鏄剧ず,涓鍗婃椂闂翠笉鏄剧ず钥屽凡,镓浠ユ垜浠鐪嬭捣𨱒ユ槸闂鐑佹晥鏋

DisDecemal=1;

else

DisDecemal=0;

}

鎸夐敭浣犺嚜宸辨洿鏀,杩欎釜绋嫔簭閲岀殑鏁扮爜绠℃壂鎻忕▼搴忓緢缁忓吀,鎸夐敭绋嫔簭鍐欑殑寰堟悡,涓嶈繃瀵逛粯浣犵殑璇剧▼璁捐℃槸镙规湰閮芥湪链夐梾棰樼殑!!!!!!!!!!!

⑶ 51单片机求这个时钟的c语言程序

以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。

/**** 本程序中,晶振为12MHz, ****/
/**** 时间控制采用定时中断控制方式。 ****/
/**** 模式和时间调整采用查询方式。 ****/

#include<reg52.h>

sbit P20=P2^0; //分个位控制端
sbit P21=P2^1; //分十位控制端
sbit P22=P2^2; //时个位控制端
sbit P23=P2^3; //时十位控制端
sbit led=P2^7; //second display led

sbit key0=P3^0; //模式设置
sbit key1=P3^1; //加
sbit key2=P3^2; //减

unsigned char hour,min,sec,T50ms;
unsigned char modstate; //模式状态

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

void init(); //初始化子程序声明
void delay500us(unsigned char X); //延时子程序声明
void display(); //显示子程序声明
void display001(); //显示子程序声明
void display002(); //显示子程序声明
void keyscan(); //按键识别子程序声明

void main()
{
init();
while(1)
{
keyscan();
}
}

void init() //初始化子程序
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
ET0=1;
EA=1;
TR0=1;
}

void delay500us(unsigned char X)
{
unsigned char i,j;
for(i=X;i>0;i--)
for(j=248;j>0;j--);
}

void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;

T50ms++;
if(T50ms>=20)
{
T50ms=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)hour=0;
}
}
}
}

void display()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);

P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);

P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(5);

P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(5);

if(T50ms<=10)led=0;
if(T50ms>10)led=1;
}

void display001()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(10);

P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(10);
}

void display002()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(10);

P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(10);
}

void keyscan() //按键识别钟程序
{
while(modstate==0)
{
display();
if(key0==0)
{
display();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display001(); //等待按键释放。
}
}
//****************************************************************************//
while(modstate==1)
{
display001();
if(key0==0)
{
display001();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display002(); //等待按键释放。
}

if(key1==0)
{
display001();
if(key1==0)
{
hour++;
if(hour>=24)hour=0;
while(key1==0)display001();
}
}
if(key2==0)
{
display001();
if(key2==0)
{
hour--;
if(hour>=24)hour=0;
while(key2==0)display001();
}
}
}
//****************************************************************************//
while(modstate==2)
{
display002();
if(key0==0)
{
display002();
if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display(); //等待按键释放。
}

if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
if(key2==0)
{
display002();
if(key2==0)
{
min--;
if(min>=60)min=0;
while(key2==0)display002();
}
}
}
}

阅读全文

与4位数字电子钟单片机相关的资料

热点内容
汉语命令形 浏览:193
ACG官网下载的游戏怎么解压 浏览:963
stata交叉项命令 浏览:470
程序员老公烫头 浏览:692
服务器文件地址格式 浏览:131
securecrtandroid 浏览:176
短字符串压缩 浏览:863
u盘插入后显示加密格式化 浏览:944
我的世界怎么用命令方块获得超级武器 浏览:382
狗语翻译器app链接怎么下 浏览:905
选择排序算法的流程图 浏览:881
如何对文件夹开启共享 浏览:527
常用的磁盘调度算法 浏览:662
怎么用返利app返利 浏览:127
java代码快速 浏览:243
单片机左移右移后是补1还是0 浏览:599
湛江一号命令 浏览:333
导出命令行 浏览:274
C和php交互 浏览:600
苹果手机里的通讯录如何导入安卓手机 浏览:170