51单片机定时器汇编程序

51单片机定时器汇编程序,第1张

试试下列程序:

;

ORG 0000H

SJMP BEGIN

ORG 000BH

MOV TH0, #3CH ;定时100ms

MOV TL0, #0B0H

DJNZ R7, E_T0

MOV R7, #5

SETB F0 ;每500ms置一

E_T0:RETI

;------------------------------------

BEGIN:

MOV TMOD, #01H ;T0定时方式1

MOV TH0, #3CH ;50ms@12MHz

MOV TL0, #0B0H ;100ms@6MHz

MOV R7, #5

SETB TR0

SETB ET0

SETB EA

;------------------------

M_LOOP:

MOV A, #255

L1:

MOV P1, A

JNB F0, $

CLR F0

CLR C

RLC A

JC L1

;------------------------

L2:

MOV P1, A

JNB F0, $

CLR F0

SETB C

RRC A

JNC L2

;------------------------

MOV R2, #8 ;全亮全灭8次

L3:

MOV P1, #0 ;全亮

JNB F0, $

CLR F0

MOV P1, #255;全灭

JNB F0, $

CLR F0

DJNZ R2, L3

;------------------------

JMP M_LOOP

;------------------------------------

END

本程序可实现:

L1-L8依次点亮----L1-L8依次熄灭----8个灯全亮全灭8次~循环 各时序间隔05s。

#include <AT89X51H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义显示用的段码

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义显示用的位码

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //定义显示缓冲区

unsigned char dispbitcnt; //定义显示的位

unsigned char second; //定义秒

unsigned char minite; //定义分钟

unsigned char hour;//定义小时

unsigned int tcnt;//定义定时累加器

unsigned char mstcnt;//定义毫秒累加器

unsigned char i,j;

void main(void) //主函数

{

TMOD=0x02; //设置定时器工作模式

TH0=0x06; //设置初值

TL0=0x06;

TR0=1; //开定时器

ET0=1; //开定时器中断

EA=1; //开总中断

while(1)

{

if(P0_0==0) //判断P00口的按键是否按下

{

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

for(j=248;j>0;j--);//延时消抖

if (P0_0==0) //判断按键真的按下了

{

second++; //秒加1

if(second==60) //秒加到60?

{

second=0; //秒清零

}

dispbuf[0]=second%10; //取秒的个位放在显示缓冲

dispbuf[1]=second/10; //取秒的十位放在显示缓冲

while(P0_0==0); //等待,知道按键松开

}

}

if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的

{

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

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

if(P0_1==0)

{

minite++;

if(minite==60)

{

minite=0;

}

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}

}

if(P0_2==0) //p02的按键按下,设置小时,请参考秒的程序,一样的

{

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

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

if(P0_2==0)

{

hour++;

if(hour==24)

{

hour=0;

}

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}

}

}

}

void t0(void) interrupt 1 using 0 //定时器中断函数

{

mstcnt++; //累加器加一

if(mstcnt==8) //计时满8毫秒?

{

mstcnt=0; //累加器清零

P1=dispcode[dispbuf[dispbitcnt]]; //送显示段码

P3=dispbitcode[dispbitcnt]; //送显示位码

dispbitcnt++; //显示位加1

if(dispbitcnt==8) //8位都显示完了?

{

dispbitcnt=0; //从第一位开始显示

}

}

tcnt++; //累加器加一

if(tcnt==4000) //记满1秒

{

tcnt=0; //累加器清零

second++; //秒加一

if(second==60) //秒满60?

{

second=0; //秒清零

minite++; //分钟加一

if(minite==60) //分钟满60

{

minite=0; //分钟清零

hour++; //小时加1

if(hour==24) //小时满24

{

hour=0; //小时清零

}

}

}

dispbuf[0]=second%10; //将时分秒的个位与十位分开,装在显示区

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

}

}

其实这个程序不难,仔细想想,有不懂的再问我吧

STC的芯片的话是用串口下载,接单片机的P30和31。

AT的芯片的话是用ISP下载,是接在单片机的P15 1617 还有复位引脚。

如果有usb下载器很简单的,下载器vcc接单片机vcc(注意单片机电压时5x还是33v)下载器gnd接单片机gnd,下载器rxd接单片机txd,下载器txd接单片机rxd。

如果是STC单片机,有ISP功能,只要连P30和P31两根线,用MAX232和电脑串口连起来就能下载程序。

如果是一般的单片机就要连P0、P2、P3口。其中两个作地址线,一个作数据线,还要连几根辅助线。因此没有ISP功能的单片机要下载程序需要专门的编程器。

扩展资料:

51单片机的基本结构就可以。设备上,一般是建议购买一个仿真器,例如,的“双功能下载线”就具有良好的稳定性和较快的下载速度,上位机可扩展,可以下载更多的单片机及嵌入式芯片。

通过实验,这样才可以进行实际的,全面的学习。日后在工作上,仿真器也大有用处。还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板,如图,即为,单片机最小系统。

参考资料来源:百度百科-51单片机

51单片机内部包含的功能组件及作用主要有:

1、cpu主芯片(内部通过总线连接扩展的设备)

2、时钟电路(为单片机提供震荡脉冲)

3、电源电路(为单片机提供电源)

4、内部数据存储器RAM(包括通用数据寄存器和专用寄存器SFR,主要是数据存储区。)

5、程序存储器ROM(主要是存储程序,51系列有4K内部程序ROM,可以外扩64K。)

6、并行端口48位(P0,P1,P2,P3主要是数据交换接口。)

7、串行口(TXD,RXD用于串口通信。)

8、中断系统(外中断0,定时计数T0,外中断1,定时计数T1,串口中断。)

9、定时/计数器(16位用于外部的计数和定时功能。)

扩展资料

Proteus 自从有了单片机也就有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。它代表着汇编语言单片机开发系统的最新发展,首创多项便利技术,将开发的编程、仿真、调试、写入、加密等所有过程一气呵成,中间不须任何编译或汇编。

功能特性

1、可以仿真63K程序空间,接近64K 的16位地址空间。

2、可以仿真64Kxdata 空间,全部64K 的16位地址空间。

3、可以真实仿真全部32 条IO脚。

4、完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等 *** 作。

5、可以使用C51语言或者ASM汇编语言进行调试。

6、可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值。

7、可选 使用用户晶振,支持0-40MHZ晶振频率。

8、片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真。

9、可以仿真双DPTR 指针。

10、可以仿真去除ALE 信号输出。

11、自适应300-38400bps 的所有波特率通讯。

12、体积非常细小,非常方便插入到用户板中插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障。

13、仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座 。

14、仿真时监控和用户代码分离,不可能产生不能仿真的软故障。

15、RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。

参考资料百度百科--51单片机

ORG 0160H

FIND: MOV SP,#60H ;保护工作寄存器

MOV R0,#10H

MOV R1,#00H

MOV DPTR,#7000H ;给R0,R1,DPTR赋初值

;初始化

FIND1: MOVX A,@DPTR ;读外部RAM/IO口

CJNE A,#00H,FIND2 ;A与0相等(即A为0),则转移到FIND2

INC R1 ;R1=R1+1

FIND2: INC DPTR ;DPTR=DPTR+1

DJNZ R0,FIND1 ;如果R0-1不为0则转移到FIND1

MOV A,R1 ;(R1)->(A)

MOV R0,#79H ;79H->(R0)

ANL A,#0FH ;A与0FH,将高4位清零,保留低4位

MOV @R0,A ;(A)->((R0))

;上面四行的功能:将r1的第四位取出来存放在79H中

INC R0 ;R0加1

MOV A,R1 ;(R1)->(A)

SWAP A ;A的高低半字节交换

ANL A,#0FH ;A与0FH,清零高4位,保留低4位

MOV @R0,A ;(A)->((R0)

;上面五行的功能:将R1的高四位取出来存放在80H中

INC R0 ;R0加1

MOV A,#10H ;10H->A

MOV R4,#04H ;04H->R4

;为子程序FIND3初始化

FIND3: MOV @R0,A ;(A)->((R0))

INC R0 ;R0加1

DJNZ R4,FIND3 ;如果R4-1不等于0,则转移到FIND3

;子程序FIND3的功能:在从(R0)开始的四个字节中分别存放10H。

FIND4: LCALL DISP ;调用DISP

SJMP FIND4

;子程序FIND4的功能:永无休止的调用DISP

;这个指令好像是错的SJMP 的语法是

;SJMP rel

;目标地址=PC+2+rel

;rel是相对偏移量

;

;可以改为AJMP FIND4或者LJMP FIND4

DISP: SETB 0D4H ;置位0D4H

MOV R1,#7EH

MOV R2,#20H

MOV R3,#00H ;给R1,R2,R3赋值

;上面四行的功能:为子程序DISP初始化

DISP1: MOV DPTR,#0FF21H ;给DPTR赋值

MOV A,R2 ;(R2)->A,保护A中的内容

MOVX @DPTR,A ;(A)->((DPTR)),写外部RAM/IO

MOV DPTR,#DATA1 ;#DATA1->DPTR

MOV A,@R1 ;((R0))->A,间接寻址

MOVC A,@A+DPTR ;MOVC是查表指令

;上面这三行的功能是查表

MOV DPTR,#0FF22H ;#0FF22H->DPTR

MOVX @DPTR,A ;(A)->((DPTR)),写外部RAM

DISP2: DJNZ R3,DISP2 ;R3-1不等于0,则转移到DISP2,等待R3-1等于0

DEC R1 ;R1减一

;R1用作循环变量

CLR C ;清零进位标志位C

;借助循环右移清零最高位,与下面的判断语句JNZ一起限制了循环次数最多为7次

MOV A,R2 ;(R2)->A

RRC A ;经过进位位的累加器循环右移一位

MOV R2,A ;(A)->R2

;上面这四行的功能:将R2中的值取出,带进位循环右移,在存进R2

JNZ DISP1 ;累加器A非零则转移到DISP1

MOV A,#0FFH ;0FFH->A

MOV DPTR,#0FF22H ;0FF2H->DPTR

MOVX @DPTR,A ;(A)->((DPTR))

CLR 0D4H ;清零字节地址是0D4H

RET ;子程序返回

DATA1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH

;上面就是表格

END ;伪指令END是汇编语言源程序的结束标志

以上就是关于51单片机定时器汇编程序全部的内容,包括:51单片机定时器汇编程序、一个51单片机电子钟程序,求详细的解释啊急急急!!!、给51单片机下程序接哪几个引脚等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9864882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存