AT89S52单片机分秒计时显示汇编编程,4块晶体管,完成分、秒计时。低两位0-59计秒,高两位0

作者&投稿:晁疯 (若有异议请与网页底部的电邮联系)
AT89S52单片机分秒计时显示汇编编程,4块晶体管,完成分、秒计时。低两位0-59计秒,高两位0~

个人觉得你对P0端口的描述要求有点不太可能,使用端口扩展吗?
下面以常规方式制作的电路:为了节省端口,使用锁存器来分时复用P0口。

//52头文件
#include //特殊寄存器定义

//变量类型宏
#define uint unsigned int //无符整型变量
#define uchr unsigned char //无符字符变量

//变量定义
uchr aa; //中断计次
uchr miao,fen; //秒,分计数
uchr q,b,s,g;//显示位的值

//段、位锁存端
sbit dula=P2^6; //段码锁存控制
sbit wela=P2^7; //位码锁存控制
sbit puase=P1^0;//暂停~启动

//共阴数码管显示编码
uchr code table[]= //指定存放到程序ROM区
{
0x3f,0x06,0x5b,0x4f,//0~3
0x66,0x6d,0x7d,0x07,//4~7
0x7f,0x6f,0x77,0x7c,//8~B
0x39,0x5e,0x79,0x71,//C~F
};

//延时程序
void delay(uint z) //延时函数
{
uint x,y; //循环变量
for(x=z;x>0;x--) //嵌套循环
for(y=110;y>0;y--);
}

//显示程序
void display()
{
q=fen/10;b=fen%10;
s=miao/10;g=miao%10;

wela=1;P0=0xfe;//左起第1位数码管
wela=0;
dula=1;P0=table[q];//显示千位值(分十位)
dula=0;
P0=0xff; delay(5);

wela=1;P0=0xfd;//左起第2位数码管
wela=0;
dula=1;P0=table[b]|0x80;//显示百位值(分个位,加上点)
dula=0;
P0=0xff; delay(5);

wela=1; P0=0xfb;//左起第3位数码管
wela=0;
dula=1; P0=table[s];//显示十位值(秒十位)
dula=0;
P0=0xff; delay(5);

wela=1; P0=0xf7;//左起第4位数码管
wela=0;
dula=1; P0=table[g];//显示个位值(秒个位)
dula=0;
P0=0xff; delay(5);
}

//初始化程序
void init()//定时器T0初始设置
{
miao=0;fen=0;

TMOD=0x01;//定时器T0工作方式1
TH0=(65536-50000)/256;//装定时50ms初值
TL0=(65536-50000)%256;
EA=1; ET0=1;//开总中断,开T0中断
TR0=0;//关闭T0 定时计时
}

//主程序
void main()
{
init();//初始化
while(1) //循环
{
if(!puase)//按键
{
delay(5);//延时消抖
if(!puase)TR0=~TR0;//启动~暂停
}
display(); //依次显示从个位到千位
}
}

//中断服务程序
void timer0() interrupt 1//T0中断服务程序
{
TH0=(65536-50000)/256;//重装定时初值
TL0=(65536-50000)%256;
aa++;//中断次数 +1

if(aa==20)//如果中断20次,即 1 秒钟
{
aa=0;//中断计次值清0,重新计数
miao++;//秒 +1
if(miao==60)//如果秒为60(即1分钟),
{
miao=0;//秒计数清0
fen++;//分 +1
if(fen==60)fen=0;//分计数到60 (即1小时)分计数清 0
}
}
}

ORG 0000H
JMP BEGIN
ORG 000BH
LJMP T0ISR
ORG 0030H
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
;---------------------------------------
BEGIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
MOV DPTR,#TABLE
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
INC R2
CJNE R2,#10,T0E
MOV R2,#0
T0E:
RETI
END

ORG 0000H ;上电复位

LJMP MAIN ;跳到MAIN

ORG 000BH ;T0中断程序入口

LJMP INTT0 ;跳到T0开始执行程序

ORG 0100H ;程序开始地址

MAIN:

MOV @R0,#70H ;准备70H-79H共10个字节空间

MOV R7,#09H ;将9送入R7中

CLRDISP:

MOV @R0,#00H ;将70H-79H初始化为00H

INC R0 ;R0内数值加1

DJNZ R7,CLRDISP ;寄存器减 1, 若不为0跳转CLRDISP


MOV TMOD,#01H ;设T0为16位定时器(工作方式1)

MOV TH0,#3CH ;赋初始值(定时50ms初值高8位)

MOV TL0,#0B0H ;赋初始值(定时50ms初值低8位)

SETB EA ;CPU开中断

SETB ET0 ;允许T0中断

SETB TR0 ;启动T0

MOV R4,#14H ;1S设定初始值(将20送R4,即每中断20次为1S)


LOOP: LCALL DISP ;调用显示程序

JB P1.1,LOOP1 ;判断P1.1有无按键(P1.1位为1 跳转到LOOP2)否则往下执行

LCALL MIN_SET ;调用分设定程序

AJMP LOOP ;跳转LOOP循环查询

LOOP1:

JB P1.2,LOOP2 ;判断P1.2有无按下(P1.2位为1 跳转到LOOP3)否则往下执行

LCALL CLR0 ;调用清零程序,这里只清零秒

AJMP LOOP ;跳转LOOP循环

LOOP2:

AJMP LOOP ;跳转LOOP循环


MIN_SET:

CALL DISP ;调用显示程序

JNB P1.1,MIN_SET ;P1.1按下跳到调分程序

INC 76H ;分的个位加1

MOV R5,76H

CJNE R5,#10,MIS1 ;个位不为10跳到MIS1

MOV 76H,#0 ;个位清零

INC 77H ;十位加1

MOV R5,77H

CJNE R5,#6,MIS1 ;十位不为6跳到MIS1

MOV 77H,#0 ;分清零

MOV 76H,#0

RET

MIS1:

RET ;调分返回

INTT0:

PUSH ACC ;入栈,保护现场

PUSH PSW

CLR ET0 ;关闭中观允许

CLR TR0 ;关闭中断

MOV A,#0B7H ;中断响应时间同步修正

ADD A,TL0 ;低8位初值修正

MOV TL0,A

MOV A,#3CH ;高8位初值修正

ADDC A,TH0

MOV TH0,A

SETB TR0 ;开启定时器T0

DJNZ R4,OUT ;20次中断未到中断退出

ADDS:

MOV R4,#14H ;20次中断到重赋初值

MOV R0,#71H ;指向秒计时单元

ACALL ADD1 ;调用ADD1

MOV A,R3 ;秒数据放入A

CLR C ;清零进位标志

CJNE A,#60H,ADDMM ;秒是否到了60,是则跳转

ADDMM:

JC OUT ;小于60秒中断退出

ACALL CLR0 ;等于60秒调用CLR0清零秒

MOV R0,#77H ;指向分计时单元

ACALL ADD1 ;调用ADD1

MOV A,R3 ;分数据放入A

CLR C ;清零进位标志

CJNE A,#60H,ADDH ;分是否到了60,是则跳转

ADDH:

JC OUT ;小于60分时中断退出

ACALL CLR0 ;等于60分调用CLR0清零秒


OUT:

MOV 72H,76H ;将分的存储地址转移

MOV 73H,77H

POP PSW ;恢复现场

POP ACC

SETB ET0

RETI

CLR0:

CLR A ;清零A

MOV @R0,A ;清零R0存放地址中的数据

DEC R0 ;R0地址减1

MOV @R0,A

RET

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     ;子程序返回 

DISP:    

MOV R1,#70H   ;指向显示数据首址    

MOV R5,#01H   ;扫描控制字初值  

PLAY:  

MOV A,R5     ;扫描字放入A    

MOV P2,A     ;从P2口输出    

MOV A,@R1     ;取显示数据到A    

MOV DPTR,#TABLE   ;取段码表地址    

MOVC A,@A+DPTR   ;查显示数据对应段码    

MOV P0,A     ;段码放入P0口    

LCALL DL1MS   ;显示1MS    

INC R1     ;指向下一地址    

MOV A,R5     ;扫描控制字放入A    

JB ACC.3,ENDOUT   ;ACC.3=0时一次显示结束    

RL A     ;A中数据循环左移    

MOV R5,A     ;放回R5内    

AJMP PLAY     ;跳回PLAY循环  

ENDOUT:

CLR P2.5     ;一次显示结束,P2口复位     

RET     ;子程序返回  

TABLE:   ;共阳数码管显示编码

DB 0C0H,0F9H,0A4H,0B0H, 99H ;0~4

DB      92H, 82H, 0F8H,80H,  90H ;5~9

DL1MS:       ;1毫秒延时程序   

MOV R6,#14H  

DL1:    MOV R7,#19H  

DL2:    DJNZ R7,DL2    

DJNZ R6,DL1    

RET    

END



软件仿真实现,可以吗?


C51单片机分类
有些有EEPROM(STC89C52),有些没有(AT89S52);有些ROM有8K(AT89S52),有些只有2K;有些RAM有256B,而有些只有128BIT;有些40个管脚(AT89C51、89C52、89S52),有些20个管脚(AT89C2051、89C4051);有些有内部晶振,有些没有;但这些都是稍微一点点的区别,基本都还是算一样的。单片机是一...

单片机 什么是时钟周期 8051的一个机器周期包括几个时钟周期
89s52 80c51都是12T的也就是12个晶振周期为一个机器周期,现在又6t以及1t高速51.

单片机8951,8952有什么区别呢,可以用8952代替8951吗?
单片机8951和8952 同属于51内核的单片机,引脚,封装都是一样的。有直插40脚的,引脚功能也是一样的,区别:1,,8952有 8个中断源,而8951 只有5个中断源;2,,8952多了一个定时器T2;3,,8952内部有8K的程序存储空间,256直接的运行空间,8951只有4k的程序存储空间,128直接的运行空间;主要就是...

急需单片机编程求助!希望大家可以帮帮忙 我把作业要求附在下面。大家...
include<AT89X52.H>\/\/89S52寄存器定义头文件 \/*--延迟子程序(有参函数),t=n*10ms--*\/ void delay(unsigned char n){ unsigned char i,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);} void main(){ while(1){P1=0x00;\/\/全灭 if((P0_0==0)&&(...

51单片机 有几种了
51单片机的种类的种类非常多,主要有:1,Intel(英特尔)的:80C31、80C51、87C51,80C32、80C52、87C52等;2,ATMEL(艾德梅尔)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等;3,Philips(飞利浦)、华邦、Dallas(拉达斯)、Siemens(西门子)等公司的许多产品;4,STC(国产宏晶)单片机:89c51...

大家好,我想用BS18B20 和单片机89S52做个温度显示(数码管显示),谁有...
unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); \/\/ 跳过读序号列号的操作 WriteOneChar(0x44); \/\/ 启动温度转换 delay_18B20(100);Init_DS18B20();WriteOneChar(0xCC); \/\/跳过读序号列号的操作 WriteOneChar(0xBE); \/\/读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=...

stc89c52单片机和51单片机的区别
1、种类不同:51系列单片机是指51内核,stc89c5X基本都是51内核的种类。2、大小不同:最后一个数字表示E2prom的大小,E2prom=X*4K,c51就是4K,c52就是8k。3、配件不同:52还多了一个定时器,所以可以说52是51(这个51是指stc89c51,不是51内核)的增强型。如下图,可以很清晰的看出两者之间的...

51单片机测脉冲速度问题
实际上,这是你检测的脉冲个数,在“两个”相邻的数字上变化,如100、101。你反过来换算一下,36,是不是对应一个脉冲?这说明,“测频”的方法,精度已经达到极限。这时,采用“测周”的方法,精度会提高很多。测周,是测量两个下降(或上升)沿之间的时间,约100Hz的信号,单片机可得到10000的时间...

你好 请问一下 2011年的电子设计大赛会用什么芯片???
单片机最小系统芯片89s52,滤波芯片7805,运算放大器Lm430,是必用的,此外,比较器LM339,波形发生器MAX038,以及各种定时,时钟,温度,声音传感器等。具体根据你所选的项目而定。这里有一个电子设计大赛的常用芯片表:ADS1146IPW 用于温度传感器的 16 位模数转换器 30 ADS1148IPW 用于温度传感器...

哪位好心人给我一个51单片机C语言让蜂鸣器唱生日歌的程序啊,谢谢啦...
while(1){ i=0;while(i<75){ \/\/音乐数组长度 ,唱完从头再来 k=sszymmh[i]+7*sszymmh[i+1]-1;timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh[i+2];i=i+3;song();} } } P12接J31的7脚,我在板子上已经测试过了,用的是89S52 花时间编的,希望你能采纳 ...

桃城区17618163890: 单片机AT89S52制作一个4未显示只显示分跟秒的电子时钟.急求用C语言写的程序 -
巢柄悉君: 硬件:用四位共阳数码管,位选用s8550驱动,段选用74HC595或者164驱动 计时芯片采用DS1302,在宏晶网站上有DS1302的驱动程序库,可以引用 程序:用数码管的动态扫描,4位每位之间每位显示时间(1到3ms都行),放在大循环里 ( while(1) { ;//显示程序 } ) 轮流显示四位,

桃城区17618163890: 求AT89S52单片机 9999秒倒计时 asm程序? -
巢柄悉君: 用AT89S52单片机 做9999秒倒计时,应该四位数码管显示,用定时器定时得到1秒,就可以计秒了. asm程序是汇编程序,不是组合程序.

桃城区17618163890: 单片机AT89S52,LCD12864液晶显示电子钟设计 -
巢柄悉君: 我也是这个,有稍微不同,这周就要交了 (1)、能正确显示时间、日期和星期显示格式为:时间:XX小时:XX分:XX秒;日期:XX年:XX月:XX日;星期:X.(2)、时间能够由按键调整,误差小于1S.(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3秒).(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响2秒,每两声之间时间间隔1秒).液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间.

桃城区17618163890: 8255汇编实现时钟显示程序如下,现在连到at89s52单片机,怎么加一段定时亮灯程序? -
巢柄悉君: 要使P1.0在1分钟的时候亮灯,过1分钟灭灯, MIN的内容是0~59,要使它在为1的时候亮灯. 可以如下改动,见小写文字: …… LOOP3:INC SEC ;计时+1程序,秒,分,时开始计时.MOV A, SECCJNE A,#60,LOOP1INC MINMOV SEC,#...

桃城区17618163890: 求个at89s52单片机的c语言简易时钟代码 -
巢柄悉君: 液晶为RT1602C. 该简易时钟可以通过key1与key2分别对分与时调整. 不当地方,敬请批评指正! #include <reg52.h>#define uint unsigned int#define uchar unsigned char sbit rs=P3^4; sbit en=P3^5; sbit key1=P2^0; sbit key2=P2^1; uchar ...

桃城区17618163890: 单片机时钟 《AT89S51》 1、四位数码管显示时分、分秒,以24小时计时运行 -
巢柄悉君: 调时程序: MAIN:JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时JNB P3.2,NLTZ1;按下2键进行闹铃设置JNB P3.3,DSTZ;按下3键进行定时设置ACALL DISP;调用显...

桃城区17618163890: 用89S52单片机设计一个6位显示的电子计时系统.6位LED分别显示时、分、秒(各两位).
巢柄悉君: 读书时的课程设计中的部份,当时觉得写的还不错,现在看起来有点夸张,有很大的发挥简化空间,很多语句都不成熟,但是还是完成了设计要求了,这是未简化的版本,里面有电路图和程序(用汇编语言写的),现放在我的空间里,自己去下吧http://www.hsz.ik8.com/baidu/mcu.rar 里面可设两个闹钟,可以设置开和关.可以调时间还有日期也能调包括年月日小时分钟秒. 这是我以前回答过的题,为什么不搜索一下呢

桃城区17618163890: AT89S52单片机 汇编语言 通过计时器编写0 - 9的循环显示 -
巢柄悉君: ORG 0000H JMP BEGIN ORG 000BH LJMP T0ISR ORG 0030H TABLE: ; 共阴极数码管显示代码表 DB 3FH,06H,5BH,4FH,66H ;01234 DB 6DH,7DH,07H,7FH,6fh ;56789;--------------------------------------- BEGIN:MOV TMOD,#01H MOV TH0,#...

桃城区17618163890: 求一个基于单片机的用汇编语言写的倒计时程序 -
巢柄悉君: 刚写的程序,可以通过S0(功能键),S1(加键),S2(减键)设定初值,倒数为00-00-00时蜂鸣器响,通过八位LED显示;#include#include#define uchar unsigned char #define uint unsigned int uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,...

桃城区17618163890: 用AT89S52做个百分钟倒计时,同时也有个时间显示. 求C程序和原理图. -
巢柄悉君: 你这里有个疑问,既然说 B键控制百位,时间显示方式却是时分秒,百位指哪儿;其实既然叫百分钟倒计时,就用分、秒显示格式即可,直观,程序也会简单些,除了秒位是60进制外,分可按十进制运算;此作业可参考单片机时钟显示电路及代码.去掉时,分由最大计数59,改为 99;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网