1.是个循环,而且是个死循环。他在单片机中是银搏春常要用到的,功能就是只要单片机上电它使程序不停里执行死循环里的内容!
2.这个看你的单片机的硬件电路了,你最好也先看锋耐懂硬件电路才编程。通常LED的公共端是用三极管选通的!看来你的LED是共阳极接法的,就是8个LED正极共同接到三极管的发射极,集电极接VCC,基极连到P1口的接法,如果你会三极管,应该就能看懂为什么了!P1=0,三极管正向导通,VCC加到LED上,如果LED的另一端接的是低电平,使LED正偏,则LED亮。想想吧~~
3。CPU不停地执行while(1)里面的语句,但是当有中断发生时,CPU得先去执行中断,然后才能返回到while处继续执行,也就相当等待中断了!也就是说:有中断发生CPU就立该执行中断,没有的话就一银敏直执行while(1)里面的~~
1.执行CALL指令前SP=40H,A=30H,但是在SUBR中对SP压栈2009H,在执行RET指令后将2009H送回PC,造成单片机跳转到0x2009处继续执行指令,但这个位置不是程序碧谈坦中规定的指令开始地址,所以运行后侍悄A=30H,SP=42H
2.A是8位的寄存器吧?0+1+2+.....+100得到的是16位的数据,A里装不下呢,程序这么写,结果的高字节在R3,低字节悔桐在R2:
MOV R0,#101 ;0~100是101个数字
MOV R1,#00
MOV A,#0
MOV B,#0
LOOP:
CLR C
MOV A,R2
ADD A,R1
MOV R2,A
MOV R3,A
ADDC A,#0
MOV R3,A
INC R1
DJNZ R0,LOOP
3.没说清顺序呢,那我认为50H和60H是高两位数,51H和61H是低两位数:
CLR C
MOV A,51H
ADD A,61H
DA
MOV 41H,A
MOV A,50H
ADDC A,60H
DA
MOV 40H,A
MOV
(橘核1)下述程序执吵帆行后,SP=?A=?B=?
ORG 2000H
MOV SP, #40H
MOV A , #30H a=30h
LCALL SUBR
ADD A, #10H a=40h
MOV B, A b=40h
L1: SJMP L1
SUBR: MOV DPTR,#2009H
PUSH DPL 09h
PUSH DPH 20h
RET
所以,升伍雹a=40h,b=40h,sp=2009h
我这里有个单片机得程序看对您有用么:
RS BIT P2.0 ;LCD引脚定义
RW BIT P2.1
E BIT P2.2
DQ BIT P1.7
T_RST BIT P3.5 ;DS1302引脚定义
T_CLK BIT P3.6
T_IO BIT P3.7
SEC EQU 30H ;单片机内部RAM分配
MIN EQU 31H
HOUR EQU 32H
DAY EQU 33H
MON EQU 34H
WEEK EQU 35H
YEAR EQU 36H
TEMPL EQU 28H ;存伍脊羡从DS18B20读出的低位
TEMPH EQU 29H ;存高位
TEMP1 EQU 40H ;符号位与百位公用一个单元
TEMP2 EQU 41H
TEMP3 EQU 42H
TEMP4 EQU 43H ;小数位存放单元
WDL EQU 51H
WDH EQU 52H
WENDU EQU 55H
CEWEN EQU 56H
ORG 0000H
JMP START
ORG 0030H
START: MOV SP ,#70H ;设置堆栈入口
MOV HOUR,#10H ;时间设置为2011年05月15号10时0分0秒
MOV MIN,#00H
MOV SEC,#00H
MOV DAY,#15H
MOV MON,#05H
MOV WEEK,#05H
MOV YEAR,#11H
MOV WDL,#10H ;温度设置为腔拍10-30
MOV WDH,#1EH
MOV WENDU,#22H ;设定温度值20
LCALL INIT_1602 ;初始化1602入口
LCALL SETDS1302 ;初始化1302入口
LCALL GET1302
LCALL DISPLAY ;显示程序入野链口
LCALL INIT_1820 ;初始化入口
MAIN: LCALL DISPLAY
LCALL DELAY1
LCALL GET1302 ;读1302
LCALL GET_TEMPER ;调用读温度子程序
LCALL TOBCD ;十六转BCD码
LCALL OUTPUT
JMP MAIN
OUTPUT:
CLR C
MOV A,56H
CJNE A,52H,PD1 ;不等则转PD1
SJMP BUBAOJING
PD1: JC BUBAOJING ;Cy=1则转
SJMP BAOJING1
CLR C
MOV A,56H
CJNE A,51H,PD2
PD2: NOP
JC BAOJING2
RET
BAOJING1: SETB P2.6 ;报警
RET
BAOJING2: SETB P2.7 ;低温加热
SETB P2.6
RET
BUBAOJING: CLR P2.7
CLR P2.6
RET
;****************************进入1602 进入1602 进入1602 **************************8
INIT_1602: LCALL DELAY5 ;初始化1602 获得稳定电流
LCALL DELAY5
LCALL DELAY5
MOV P0,#01H ;清屏
LCALL WR1602
MOV P0,#0CH ;显示开关设置
LCALL WR1602
MOV P0,#38H ;屏幕大小设置
LCALL WR1602
RET
WR1602: CLR RS ;写使能程序
CLR RW
CLR E
LCALL DELAY
SETB E
RET
DELAY: MOV R4,#05
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
;****************************** 进入显示 进入显示 进入显示**********************************************
DISPLAY: MOV P0,#0C0H ;DDRAM第二行首地址0C0h
LCALL WR1602 ;写入使能1602第一行的初始地址80到8F总共16个
MOV A,HOUR ;读小时 第二行从C0到CF 一共十六个
SWAP A ;高低位交换
ANL A,#0FH ;保留高4位
LCALL RWYX ; 跳入显示使能
MOV P0,#0C1H ;第二行第二个地址
LCALL WR1602
MOV A,HOUR
ANL A,#0FH ;保留低四位
LCALL RWYX
MOV P0,#0C2H ;第三个地址
LCALL WR1602
MOV P0,#3AH ;显示冒号,这是lcd1602 CGRAM冒号的地址
LCALL MAOHAO
MOV P0,#0C3H ;
MOV A,MIN
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#0C4H ;
LCALL WR1602
MOV A,MIN
ANL A,#0FH
LCALL RWYX
MOV P0,#0C5H ;
LCALL WR1602
MOV P0,#3AH ;写冒号
LCALL MAOHAO
MOV P0,#0C6H ;
MOV A,SEC
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#0C7H ;
LCALL WR1602
MOV A,SEC
ANL A,#0FH
LCALL RWYX
MOV P0,#80H ;第一行首地址
LCALL WR1602
MOV P0,#32H ;显示2
LCALL MAOHAO
MOV P0,#81H ;第二个地址
LCALL WR1602
MOV P0,#30H ;显示0
LCALL MAOHAO
MOV P0,#82H
LCALL WR1602
MOV A,YEAR
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#83H
LCALL WR1602
MOV A ,YEAR
ANL A,#0FH
LCALL RWYX
MOV P0,#84H ;冒号
LCALL WR1602
MOV P0,#2FH
LCALL MAOHAO
MOV P0,#85H
LCALL WR1602
MOV A,MON
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#86H
LCALL WR1602
MOV A,MON
ANL A,#0FH
LCALL RWYX
MOV P0,#87H
LCALL WR1602
MOV P0,#2FH
LCALL MAOHAO
MOV P0,#88H
LCALL WR1602
MOV A,DAY
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#89H
LCALL WR1602
MOV A,DAY
ANL A,#0FH
LCALL RWYX
MOV P0,#8AH
LCALL WR1602
MOV P0,#20H
LCALL MAOHAO
MOV P0 ,#8BH
LCALL WR1602
MOV P0 ,#20H
LCALL MAOHAO
MOV P0,#8CH ;
MOV A,WENDU
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#8DH ;
LCALL WR1602
MOV A,WENDU
ANL A,#0FH
LCALL RWYX
MOV P0,#08EH
LCALL WR1602
MOV P0,#0DFH
LCALL MAOHAO
MOV P0,#08FH
LCALL WR1602
MOV P0,#43H ;温度C
LCALL MAOHAO
MOV P0,#0CDH
LCALL WR1602
MOV A,TEMP4
LCALL RWYX
MOV P0,#0CCH
LCALL WR1602
MOV P0,#0A4H
LCALL MAOHAO
MOV P0,#0CBH
LCALL WR1602
MOV A,TEMP3
LCALL RWYX
MOV P0,#0CAH
LCALL WR1602
MOV A,TEMP2
LCALL RWYX
MOV P0,#0C9H
LCALL WR1602
MOV A,TEMP1
LCALL RWYX
MOV P0,#0CEH
LCALL WR1602
MOV P0,#0DFH
LCALL MAOHAO
MOV P0,#0CFH
LCALL WR1602
MOV P0,#43H
LCALL MAOHAO
RET
RWYX: MOV DPTR,#TAB
MOVC A, @A+DPTR
MOV P0 ,A
MAOHAO: SETB RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;***************************************进入1302 进入1302 进入1302 *************
SETDS1302:
CLR T_RST ;初始化
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;送控制命令
LCALL INPUTBYTE
MOV B,#00H ;在第0页开始写
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SEC ;送入秒
MOV R1,#80H ;开始写秒
MOV R7,#7 ;写七次 年到秒总共七个数字
SETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE
MOV A,@R0
MOV B,A
LCALL INPUTBYTE
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE ;写单字节程序入口
MOV B,#80H
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
GET1302:
MOV R0,#SEC ;读1302
MOV R1,#81H
MOV R7,#7
GETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE
LCALL OUTPUTBYTE
MOV @R0,A
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
INPUTBYTE:
MOV R4,#8
INPUTLOOP:
MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET
OUTPUTBYTE: ;读单字节入口
clr a
clr c
MOV R4,#8
OUTPUTLOOP:
NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
;**************************进入13B20 **************************进入13B20 ********************
;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
SETB P1.0
LCALL RST18B20 ;复位DS18B20
JB 00H,DSS2
RET
DSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#44H ;向DS18B20发出温度转换命令
LCALL WR18B20
LCALL DELAY_1S
LCALL RST18B20 ;准备读温度前先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#0BEH ;向DS18B20发出读温度命令
LCALL WR18B20
LCALL RE18B20 ;读出温度数据
RET
;------ DS18B20复位初始化程序 ------
RST18B20:
SETB P1.0
NOP
CLR P1.0
MOV R0,#06BH ;主机发出复位低脉冲
MOV R1,#03H
DSR1: DJNZ R0,DSR1
MOV R0,#6BH ;660us复位低点平
DJNZ R1,DSR1
SETB P1.0 ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DSR2: JNB P1.0,DSR3 ;等待DS18B20回应
DJNZ R0,DSR2
LJMP DSR4
DSR3: SETB 00H ;置标志位,表示DS1820存在
LJMP DSR5
DSR4: CLR 00H ;清标志位,表示DS1820不存在
LJMP DSR7
DSR5: MOV R0,#06BH
DSR6: DJNZ R0,DSR6 ;延时一段时间
DSR7: SETB P1.0
RET
;------ 写DS18B20的子程序 ------
WR18B20:
MOV R2,#8 ;写一个字节8bit命令
CLR C
SETB P1.0
NOP
WR1: CLR P1.0
MOV R3,#6
DJNZ R3,$ ;12us左右延时
RRC A
MOV P1.0,C
MOV R3,#23
DJNZ R3,$ ;50us延时,确保DS18B20电平采样正确
SETB P1.0
NOP
DJNZ R2,WR1
SETB P1.0
RET
;------ 从DS18B20中读温度数据程序 ------
RE18B20:
MOV R4,#2
MOV R1,#2FH
RE00: MOV R2,#8
RE01: CLR C
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
NOP
SETB P1.0
MOV R3,#09
RE10: DJNZ R3,RE10 ;延时12us
MOV C,P1.0
MOV R3,#23
RE20: DJNZ R3,RE20 ;延时50us
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
B2T_CH: MOV 38H,#1
JNB 77H,POS ;温度高于零度,则转移
MOV A,2FH
CPL A
INC A
MOV 2FH,A
MOV A,2EH
CPL A
MOV 2EH,A
MOV 38H,#0
POS: MOV A,2FH
ANL A,#0FH ;小数点后保留四位
MOV R1,#04
MOV R0,#3CH
DIG: MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV @R0,A
MOV A,B
INC R0
DJNZ R1,DIG
;整数位操作
MOV A,2FH
ANL A,#0F0H
RR A
RR A
RR A
RR A
MOV 2DH,A
MOV A,2EH
ANL A,#0FH
RL A
RL A
RL A
RL A
ORL A,2DH
MOV 2DH,A ;整数位存在2DH地址中
MOV CEWEN,2DH
MOV A,CEWEN
SWAP A ;高低位交换
ANL A,#0FH ;保留高4位
MOV TEMP2,A
MOV A,CEWEN
ANL A,#0FH ;保留低四位
MOV TEMP3,A
MOV A,2DH
MOV B,#10
DIV AB
MOV 3BH,B
MOV B,#10
DIV AB
MOV 3AH,B
MOV 39H,A
RET
;*************************************************延时*******************************************************8
DELAY5: MOV R1,#10
DL6: MOV R2,#249
DL7: DJNZ R2,DL7
DJNZ R1,DL6
RET
DELAY1:
MOV R6,#14H
DL8: MOV R7,#19H
DL9: DJNZ R7,DL9
DJNZ R6,DL8
RET
TAB1: DB "WEEK",00H
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,20H ;这里前十位的是0-9的代码,是lcd1602中CDRAM中的地址。20h是空不显示还有一个负号忘记写了。20h和忘了的负号是用于ds18b20的负好显示 ;
END
是很简单,只是你态度很不好,还是自己翻书去吧~
不好意思,我只懂C语言。