试试下列程序:
;
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单片机下程序接哪几个引脚等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)