当前位置:首页 » 焊接工艺 » 什么是四位LED数字时钟焊接

什么是四位LED数字时钟焊接

发布时间: 2021-02-28 11:22:41

1. 电子秒表设计:设计一个4位LED数码显示“秒表”,显示时间为00.00~99.99秒,每0.01秒自动加一。

这个学单片机的应该很好写,有两种方法:一、不精确的话用延时子程序就行;精确的话用定时器。

2. 5.简易电子时钟:用4位LED数码管分别显示小时数分钟和秒数,两个按键,一个为功能键,

基于AVR单片机Mega16的电子时钟设计

摘要: Mega16是一款采用先进RISC精简指令,内置A/D的8位单片机,可支专持低电压联机Flash和EEPROM写功属能;同时还支持Basic和C等高级语言编程。用它设计电子时钟不仅成本低,硬件简单,而且很容易实现系统移植。介绍了如何利用AVR系列单片机Mega16及1602字符液晶来设计电子时钟的方法,同时给出了相应的电路原理及部分语言程序。
求采纳为满意回答。

3. 四位数字时钟设计 C语言程序

^#include<stdio.h>
#include<reg51.h>
sbit p20=P2^;
sbit p21=P2^1;
sbit led=P2^7;
main()
{
unsigned int dis_1[4]={0x01,0x02,0x04,0x08};
unsigned int dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int s,m,m1,m2,h,h1,h2,i,j,k;
for(h=0;h<24;h++){
for(m=0;m<60;m++){
for(s=0;s<60;s++){
if(p20==0)h++;
if(h==24)h=0;
if(p21==0)m++;
if(m==60)m=0;
h1=h/10;
h2=h%10;
m1=m/10;
m2=m%10;
for(i=0;i<240;i++){
for(j=0;j<5;j++){
for(k=0;k<10;k++){
P1=dis_1[0];
P0=dis_2[h1];
}
}
for(j=0;j<5;j++){
for(k=0;k<10;k++){
P1=dis_1[1];
P0=dis_2[h2];
}
}
for(j=0;j<5;j++){
for(k=0;k<10;k++){
P1=dis_1[2];
P0=dis_2[m1];
}
}
for(j=0;j<5;j++){
for(k=0;k<10;k++){
P1=dis_1[3];
P0=dis_2[m2];
}
}
if(i<120)led=0;
else led=1;
}
}
}
}
}

4. 51单片机4位LED电子钟怎么编程

以下是6位数码管显示;供参考

#include "reg51.h"
#include "intrins.h"
#include <absacc.h>

#define unit unsigned int
#define char unsigned char
sbit deng1=P0^;
sbit deng2=P0^2;
sbit kong=P0^0;

char code dis_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00, 0xff };
/*共阴LED数码管段码 0 1 2 3 4 5 6 7 8 9 10 A B C D E F 灭 */
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//定义计数单元初值0,6个
unsigned long data miao;
char code weisao[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描控制字
char data BUFFER[1]={0}; //定时器记数变量
char data wei=-1; //时间设置时选种位
char c=0; //闪烁次数变量
bit flag=0; //标志位
char j1,j; //计数标志
void delayxms( char t) //1*T毫秒延时
{
char i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}

ledxian() //LED显示子程序
{
char k;
for(k=0;k<6;k++)
{
if(wei==-1) //当WEI为-1时正常显示
{
P1=dis_7[timedata[k]];//各位时间显示值转段码
}
else //WEI不为-1时再判断哪一位K闪
{
if(k==wei) //K=WEI时闪等扫过128次时闪
{
if(j==128)
{
//j1++;
//if(j1==1)
flag=~flag; //J到128时标志位取反
}
j++;

if(!flag)
{
P1=dis_7[16]; //灭LED灯
if(j==0)
{
if(c<15) //选种后闪烁次数
{
c++ ;
}
else //20次到了清WEI标志,清闪烁次数标志
{
wei=-1;
c=0;
ET0=1; //定时中断开
}

}
}
else
{
P1=dis_7[timedata[k]]; //FLAG=1时正常显示

}
}
else
{
P1=dis_7[timedata[k]]; //J不到128则正常显示
}
}
P2=~weisao[k]; //位扫描
delayxms(1); //1毫秒延时
P2=~0xff; //屏蔽

}
}
//////////////////主函数///////////////////
void main(void)
{
P1=0xff; //初始化端口
IT0=1; //外部中0断为跳沿触发方式
EX0=1; //外部中0允许
IT1=1; //外部中1断为跳沿触发方式
EX1=1; //外部中1允许
EA=1; //开中断
ET0=1; //允许定时器0
TMOD=0x11; //T0中断工作方式1
TH0=-5240/256; //
TL0=-5240%256;
TR0=1; //TRO为T0的运行控制位,开启中断,启动定时器
TH1=-5240/256; //
TL1=-5240%256;
ET1=1;

while(1)
{
ledxian() ; //调用LED显示子程序
}

}

void timer0(void) interrupt 1 using 1 //定时器0中断,用第1组寄存器
{
ET0=0; //关T0中断
TH0=-5240/256;//定时器初值5MS
TL0=-5240%256;
BUFFER[0]=BUFFER[0]+1;
if(BUFFER[0]==200) //1秒时间到加1
{
BUFFER[0]=0;//时间到附0
/*timedata[0]++; //秒个位加1
if(timedata[0]>=10) //秒个位到10则进秒十位
{
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6) //秒十位到6则进分个位
{
timedata[1]=0;timedata[2]++;
if(timedata[2]>=10) //分个位位到10则进分十位
{
timedata[2]=0;timedata[3]++;
if(timedata[3]>=6) //分十位到6则进小时个位
{
timedata[3]=0;timedata[4]++;
if(timedata[4]>=10) //小时个位到10则进小时十位
{
timedata[4]=0;timedata[5]++;
}
if(timedata[5]==2) //当小时为24时下一个变0
{
if (timedata[4]==4)
{
timedata[4]=0;timedata[5]=0;
}
}
}
}
}
}*/

miao++;
if(miao==86400)
{
miao=0;
}
timedata[0]=miao%10;
timedata[1]=(miao%60)/10;
timedata[2]=(miao/60)%10;
timedata[3]=((miao/60)%60)/10;
timedata[4]=(miao/3600)%10;
timedata[5]=(miao/3600)/10;

}
ET0=1; //开中断
}

void timer1(void) interrupt 3
{
TR1=0;
ET1=0; //关T1中断
EX0=1;
EX1=1;
TH1=-5240/256;//定时器初值5MS
TL1=-5240%256;
ET1=1;
}

void INT00(void) interrupt 0 using 2 //外部中断0设置时间时调准位,用第2组寄存器
{

EX0 = 0; //关中断
TR1=1;
wei++; //中断一次加1
ET0=0; //定时中断关
if(wei>=6)
{
wei=-1; //当到最高位5时付初值-1
ET0=1; //定时中断开

}
j=0;
//j1=0;

/*for (k=0;k<9;k++)
{
P1=dis_7[16];//各位时间显示值转段码
//P1=0X06;
P2=~weisao[wei]; //位扫描

delayxms(300); //1毫秒延时
P1=dis_7[0];
delayxms(300);
//TR0=0;
}*/

//EX0 = 1; //开中断
}

void INT11(void) interrupt 2 using 3 //外部中断时种调准(+1),用第3组寄存器
{
EX1 = 0; //关中断
TR1=1;
switch(wei) //判断要调准的是哪一位
{
case 0 :
{
if(timedata[wei]<9) // 秒个位时加到10时返回0
{

timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 1 :
{
if(timedata[wei]<5) // 秒十位时加到6时返回0
{

timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 2:
{
if(timedata[wei]<9) // 分个位时加到10时返回0
{

timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 3:
{
if(timedata[wei]<5) // 分十位时加到6时返回0
{

timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 4:
{ // 小时个位设置
if(timedata[5]==0 || timedata[5]==1 ) //当小时十位是0或1时加到10返回到0
{
if(timedata[wei]<9)
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;}
}
else //当小时十位是2时加到3返回到0
{
if(timedata[wei]<4)
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}

}
break;
case 5:
{
if(timedata[wei]<2) //小时十位到3返回到0
{

timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
default: break;
//////////////////////////////////////////
}

miao=(timedata[0]+timedata[1]*10)+(timedata[2]+timedata[3]*10)*60+(timedata[4]+timedata[5]*10)*3600;

//EX1 = 1; //开中断

}

5. 4位数字时钟工作原理 跪求

其原理都是一样的、把1
2
4
5
7
8
10
11
拿掉【剩下的数字是12
3
6
9
这不就是四位数字的时钟吗、把这四位数字改成1
2
3
4
不就行了吗、它走的速度也是按一分钟60秒的速度走的】。

6. led数字电子时钟工作原理

如果是LED的电子钟我来抄简单的说下吧,就是个数字电路,先用晶振分频得到个1HZ的频率,再用数字IC记录下来,改成6进制和12进制,再用译码器变成7段BCD码通过数码管显示出来,比如用晶振32.768+CD4060分频就能得到1HZ的时钟频率,再用CD4518改成6进制且。

7. 电子时钟制作套件 四位led数字单片机时钟有哪些元件

单片机,四位数码管,限流电阻12个,按钮,晶振,两个瓷片电容(30pf),复位电阻(4.7k以上)和电容(4.7uf以上),三极管四个,5v电源,蜂鸣器(可选)

8. 求单片机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)//闪烁其实就是一半时间正常显示,一半时间不显示而已,所以我们看起来是闪烁效果

DisDecemal=1;

else

DisDecemal=0;

}

按键你自己更改,这个程序里的数码管扫描程序很经典,按键程序写的很搓,不过对付你的课程设计是根本都木有问题的!!!!!!!!!!!

9. 一个ds1302+stc89c52+四位led的数字钟连续运行半小时慢五分钟,关闭单片机让ds1302用备用电池二天正常。

可以 再试试 去掉单片机,用单片机 供电电源供电,如果二天也正常,
那么是单片机版程序有问题,就是权可能 有向ds1302写入数据过程 影响走时。
如果二天不正常,那么就是ds1302质量有问题。
一般前一种 可能性大一点。

10. 求LED数字时钟设计的详细步骤

这个很简单,没人会给你详细步骤的,晚上我传代码给你

;************* 数码管电子时钟 *******************;
;*MCU: AT892051 ;
;*MCU-crystal: 12M ;
;*Version: 01 ;
;*Last Updata: 2007-6-13 ;
;*Author: zhaojun ;
;*Description: ;
;定时器T0、T1溢出周期为50MS,T0为秒计数用 ;
;T1为调整时闪烁用 ;
;P3.7为调整按钮,P1口为字符输出口,采用共阳显示管 ;
;************************************************;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AT89C2051时钟程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1 ;跳至INTT1执行
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
START: MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H(标志用)
MOV 7AH,#0AH ;放入"熄灭符"数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#3CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1: LCALL DISPLAY ;调用显示子程序
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
SJMP START1 ;P3.7口为1时跳回START1
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
MOV R0,#71H ;指向秒计时单元(71H-72H)
ACALL ADD1 ;调用加1程序(加1秒操作)
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时小时计时单元清0
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H ;
MOV 75H,79H ;
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 闪动调时 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1: PUSH ACC ;中断现场保护
PUSH PSW ;
MOV TL1,#0B0H ;装定时器T1定时初值
MOV TH1,#3CH ;
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R2,#06H ;重装0.3秒定时用初值
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
MOV 72H,76H ;02H位为0时正常显示
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT1OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
MOV 74H,78H ;
MOV 75H,79H ;
AJMP INTT1OUT ;转中断退出
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
MOV 74H,7AH ;
MOV 75H,7AH ;
AJMP INTT1OUT ;转中断退出
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
SETMM: CLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
JB P3.7,CLOSEDIS;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4: JB P3.7,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
JB P3.7,CLOSE ;是干扰返回CLOSE等待
WAITH: JNB P3.7,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
SETHH1: JNB P3.7,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6: JB P3.7,SET7 ;等待按键按下
LCALL DL05S ;有键按下延时0.5秒
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
LCALL ADD1 ;调加1子程序
MOV A,R3 ;
CLR C ;
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键释放
LCALL DISPLAY ;延时削抖
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开定时器T0中断(计时开始)
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分)
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
AJMP SET4
SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
AJMP SET6
SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P3,A ;从P3口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放入P1口
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P3.5 ;一次显示结束,P3口复位
MOV P1,#0FFH ;P1口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0FFH
;共阳段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
;
END ;程序结束

热点内容
线切割怎么导图 发布:2021-03-15 14:26:06 浏览:709
1台皮秒机器多少钱 发布:2021-03-15 14:25:49 浏览:623
焊接法兰如何根据口径配螺栓 发布:2021-03-15 14:24:39 浏览:883
印章雕刻机小型多少钱 发布:2021-03-15 14:22:33 浏览:395
切割机三五零木工貝片多少钱 发布:2021-03-15 14:22:30 浏览:432
加工盗砖片什么榉好 发布:2021-03-15 14:16:57 浏览:320
北洋机器局制造的银元什么样 发布:2021-03-15 14:16:52 浏览:662
未来小七机器人怎么更新 发布:2021-03-15 14:16:33 浏览:622
rexroth加工中心乱刀怎么自动调整 发布:2021-03-15 14:15:05 浏览:450
机械键盘的键帽怎么选 发布:2021-03-15 14:15:02 浏览:506