ORG 0000H ;程序執行開始地址
LJMP START ;跳到標號START執行
ORG 0003H ;外中斷0中斷程序入口
LJMP REMO ;外中斷0中斷返回
ORG 000BH ;定時器T0中斷程序入口
LJMP TIME0 ;跳至INTTO執行
ORG 0013H ;外中斷1中斷程序入口
RETI ;外中斷1中斷返回
ORG 001BH ;定時器T1中斷程序入口
LJMP TIME1 ;跳至TIME1執行
ORG 0023H ;串列中斷程序入口地址
RETI ;串列中斷程序返回
;
TIME1: RETI
;
TIMEADD EQU 30H;30H做為軟體計數緩存
DISP1 EQU 31H;31H做為第一位顯示緩存
DISP2 EQU 32H;32H做為第二位顯示緩存
DISP3 EQU 33H;33H做為第三位顯示緩存
DISP4 EQU 34H;34H做為第四位顯示緩存
SECLED EQU P1.0;秒點顯示P1.0
HALFSEC EQU 35H;半秒計數緩存
UPKEY BIT P2.7;定義P2.7是UP鍵
SETKEY BIT P2.0;定義P2.0是SET鍵
BUZZ BIT P2.5;
;
;第1位使能P2.1
;第2位使能P2.2
;第3位使能P2.3
;第4位使能P2.4
;
ORG 0030H;
;
START:
MOV SP,#5FH;放堆棧
MOV P2,#0FFH;把P2置高
CLR P2.5;把p2.5置0
LCALL BUZZER;發出滴聲
LCALL BUZZER;按鍵滴聲
MOV TIMEADD,#0;軟體計數器清零
MOV TMOD,#11H;TIME0工作於方式1,TIME1工作於方式1
MOV TH0,#3CH;
MOV TL0,#0B0H;放定時預置數15536
MOV IE,#8BH;開INT0,TIME0,TIME1
MOV IP,#02H;TIME0中斷優先
SETB IT0;外部中斷0為負跳變方式觸發
SETB TR0;開始計數
MOV DISP1,#00H;
MOV DISP2,#00H;
MOV DISP3,#00H;
MOV DISP4,#00H;把所有顯示緩存清零
MOV HALFSEC,#00H;把半秒計數緩存清零
MOV DPTR,#TAB;
SCAN:
MOV A,DISP1;把第一位顯示緩存送入A
MOVC A,@A+DPTR;查表
SETB P2.4;
CLR P2.1;第一位顯示使能
MOV P0,A;查表得到的7段碼送給P0去顯示
LCALL DELAY;延時
MOV P0,#0FFH;顯示一小段時間後關掉7段顯示,去顯示下一位
MOV A,DISP2;
MOVC A,@A+DPTR;
SETB P2.1;
CLR P2.2;
MOV P0,A;
LCALL DELAY;
MOV P0,#0FFH;
MOV A,DISP3;
MOVC A,@A+DPTR;
SETB P2.2;
CLR P2.3;
MOV P0,A;
LCALL DELAY;
MOV P0,#0FFH;
MOV A,DISP4;
MOVC A,@A+DPTR;
SETB P2.3;
CLR P2.4;
MOV P0,A;
LCALL DELAY;
MOV P0,#0FFH;
JNB SETKEY,ADJUST;按鍵按下時去調整時間
;以下是進位程序
MOV A,DISP1;把第一位緩存送入A
CJNE A,#10,SCAN;如果第一位不等於10繼續掃描
MOV DISP1,#00H;如果第一位等於10了就把第一位清零
INC DISP2;第二位加1
MOV A,DISP2;
CJNE A,#6,SCAN;如果第二位不等於6繼續掃描
MOV DISP2,#00H;
INC DISP3;
MOV A,DISP4;
CJNE A,#2,PM;
MOV A,DISP3;
CJNE A,#4,SCAN;
MOV DISP3,#00H;
AJMP DIS4;
PM:
MOV A,DISP3;
CJNE A,#10,SCAN;
MOV DISP3,#00H;
DIS4:
INC DISP4;
MOV A,DISP4;
CJNE A,#3,SCAN;
MOV DISP4,#00H;
AJMP SCAN;
;
DELAY: ;延時子程序
MOV R7,#2
NOP
D1: MOV R6,#2
DJNZ R6,$
DJNZ R7,D1
RET
;
TAB: DB 88H,0EBH,91H,0A1H,0E2H,0A4H,84H,0E9H,80H,0A0H,0C0H,86H,9CH,83H,94H,0D4H,0FFH
;
;
;
;
;下面程序為設置時間用
ADJUST:
LCALL ADJDELAY;
JB SETKEY,SET1;
LCALL BUZZER;按鍵滴聲
JNB SETKEY,$
CLR TR0; 暫時關閉計時
ADJ4:
SETB P2.1;
CLR P2.4;
MOV A,DISP4;
MOVC A,@A+DPTR;
MOV P0,A;顯示第四位
JNB SETKEY,ADJ8;如果設置鍵有動作去調節第3位
JB UPKEY,ADJ4;加鍵是否按下
LCALL ADJDELAY;
JB UPKEY,ADJ4;延時後再檢查加鍵是否按下
LCALL BUZZER;按鍵滴聲
JNB UPKEY,$;等待加鍵松開
INC DISP4;第四位加1
MOV A,DISP4;
CJNE A,#3,ADJ4;第四位不等於3轉移
MOV DISP4,#00H;第四位等於3清零
AJMP ADJ4;再去顯示第四位
ADJ8:
LCALL ADJDELAY;
JB SETKEY,ADJ4;
LCALL BUZZER;按鍵滴聲
JNB SETKEY,$;
ADJ3:
SETB P2.4;
CLR P2.3;
MOV A,DISP3;
MOVC A,@A+DPTR;
MOV P0,A;顯示第三位
JNB SETKEY,ADJ7;
JB UPKEY,ADJ3;
LCALL ADJDELAY;
JB UPKEY,ADJ3;
LCALL BUZZER;按鍵滴聲
JNB UPKEY,$;
INC DISP3;第3位加1
MOV A,DISP4;
CJNE A,#2,PM1;
MOV A,DISP3;
CJNE A,#4,ADJ3;第3位不等於4轉移
MOV DISP3,#00H;第四位等於3清零
AJMP ADJ3;再去顯示第四位
PM1:
MOV A,DISP3;
CJNE A,#10,ADJ3;
MOV DISP3,#00H;
AJMP ADJ3;
SET1:
LCALL BUZZER;按鍵滴聲
LCALL BUZZER;按鍵滴聲
JNB SETKEY,$;
NOP;
MOV HALFSEC,#00H;清零秒針
SETB TR0;
LJMP SCAN;
ADJ7:
LCALL ADJDELAY;
JB SETKEY,ADJ3;
LCALL BUZZER;按鍵滴聲
JNB SETKEY,$;
ADJ2:
SETB P2.3;
CLR P2.2;
MOV A,DISP2;
MOVC A,@A+DPTR;
MOV P0,A;顯示第二位
JNB SETKEY,ADJ6;
JB UPKEY,ADJ2;
LCALL ADJDELAY;
JB UPKEY,ADJ2;
LCALL BUZZER;按鍵滴聲
JNB UPKEY,$;
INC DISP2;第2位加1
MOV A,DISP2;
CJNE A,#6,ADJ2;第2位不等於6轉移
MOV DISP2,#00H;第2位等於6清零
AJMP ADJ2;再去顯示第2位
ADJ6:
LCALL ADJDELAY;
JB SETKEY,ADJ2;
LCALL BUZZER;按鍵滴聲
JNB SETKEY,$;
ADJ1:
SETB P2.2;
CLR P2.1;
MOV A,DISP1;
MOVC A,@A+DPTR;
MOV P0,A;顯示第一位
JNB SETKEY,ADJ5;如果SET鍵有動作轉去抖
JB UPKEY,ADJ1;
LCALL ADJDELAY;
JB UPKEY,ADJ1;
LCALL BUZZER;按鍵滴聲
JNB UPKEY,$;
INC DISP1;第1位加1
MOV A,DISP1;
CJNE A,#10,ADJ1;第1位不等於10轉移
MOV DISP1,#00H;第1位等於10清零
AJMP ADJ1;再去顯示第1位
ADJ5:
LCALL ADJDELAY;
JB SETKEY,ADJ1;
AJMP SET1;
ADJDELAY:;是不是延時40MS?
MOV R7,#200
D3: MOV R6,#100
DJNZ R6,$
DJNZ R7,D3
RET
BUZZER: MOV R6,255;蜂鳴子程序
BUZZ1: CPL BUZZ;
MOV R7,#80;
DJNZ R7,$;
DJNZ R6,BUZZ1;
CLR BUZZ;
RET
;以上為設置時間用
;
REMO:
RETI;
;
;
;
TIME0:; TIME0中斷處理程序
MOV TH0,#3CH;
MOV TL0,#0B6H;重新放定時預置數15542,用預置數較正時間。
PUSH ACC;機器周期2
PUSH PSW;機器周期2
INC TIMEADD;軟體計數器加1,機器周期1
MOV A,TIMEADD;加1後送給A,機器周期1
CJNE A,#10,T_RET;如果A不等於10跳到T_RET,機器周期2
CPL SECLED;取反秒點LED,軟體計數器計時半秒,機器周期1
MOV TIMEADD,#00H;軟體計數器清零,機器周期1
INC HALFSEC;秒加1,機器周期1
MOV A,HALFSEC;機器周期1
CJNE A,#120,T_RET;把秒針緩存和120比較,不等跳轉T_RET,機器周期2
INC DISP1;第一位顯示加1,機器周期1
MOV HALFSEC,#00H;清零秒針,機器周期1
T_RET:
POP PSW
POP ACC
RETI
END
『貳』 匯編語言 8051單片機產生隨機數代碼
不可用。
這者襪時 8088 CPU 的匯編語言野譽。
硬體系統中,還有電池,時鍾不停。
每次讀出,首脊激就是隨機的數字。
『叄』 單片機8051基礎編程
51程序庫
http://www.programfan.com/blog/article.asp?id=19116
http://workingon.bokee.com/viewdiary.12218674.html
MCS-51單片機實用子程序庫
http://blog.tom.com/fangqidong/article/416.html
『肆』 誰能幫我寫一個8051單片機程序
你這是三個程序啊,單片機型號是?電路圖?
『伍』 8051單片機編程,代碼求解釋TH1,TL1賦初值
就是波特率計算公式而凳缺腔已,這樣做的好處是,只要改變宏設置就行,省得你棗衫使用不同波特率或晶振調試都得先算一下波特率對應的計數器設置,萬一算錯了扮滲還麻煩。。。。
『陸』 高人幫我解析下這個8051單片機程序
ORG 0000H ;起始地址
LJMP MAIN
ORG 000BH ;中斷地址
LJMP CLOCK
ORG 0050H
MAIN: MOV R7,#14H ;寄存器R7載入20
MOV 27H,#00H
MOV 28H,#00H
MOV 29H,#00H ;27H 28H 29H 三個寄存器初始化,即秒,分,時
MOV TMOD,#01H ;Timer0 選作定時器,選用工作模式1
MOV TL0,#0B0H
MOV TH0,#3CH ;往Timer0寄存器中載入計數初值3CB0H,即定時時間為50000us
ORL IE,#87H ;開啟外部中斷0,外部中純冊斷1 和 Timer0中斷
SETB TR0 ;開啟TIMER0
WAIT:
LCALL DZSPLAY ;調用顯示子程序
LJMP WAIT
CLOCK: DJNZ R7,NEXT ;R7自減,不為0則跳轉NEXT
INC 27H ;R7減到20次 即計時一秒後27H加1
MOV R7,#14H
MOV A, 27H ;27H的值載入累加器
CJNE A,#60,EXIT ;累巧褲游加器A不到60跳轉EXIT
MOV 27H,#00H ;
INC 28H ;累加器A計數到60,28H加1,27H清零
MOV A,#28H
CJNE A,#60,EXIT
MOV 28H,#00H ;累孝銷加器A計數到60,29H加1,28H清零
INC 29H
MOV A,29H
CJNE A,#24,EXIT ;累加器A計數到24,27H 28H 29H清零
MOV 29H ,#00H
MOV 28H,#00H
MOV 27H,#00H
EXIT:RETI ;返回
NEXT:
MOV TH0,#3CH
MOV TL0,#0B0H ;重新給計數器寄存器載入初值
RETI
DZSPLAY:
MOV A,27H ;顯示子程序,顯示秒,分,時
MOV B,#10 ;秒,分,時 分別除以10 分兩位顯示
DIV AB
MOV 32H,A
MOV 31H,B
MOV A,31H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR, A
MOV DPTR,#8002H
MOV A,#00000001B ;數碼管位選 顯示在最低位
MOVX @DPTR,A
ACALL DLAY
MOV A,32H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,#00000010B
MOVX @DPTR,A
ACALL DLAY
MOV A,28H
MOV B,#10
DIV AB
MOV 34H,A
MOV 33H,B
MOV A,33H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,#00000100B
MOVX @DPTR,A
ACALL DLAY
MOV A,34H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,#00001000B
MOVX @DPTR,A
ACALL DLAY
MOV A,29H
MOV B,#1O
DIV AB
MOV 36H,A
MOV 35H,B
MOV A,35H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,#00010000B
MOVX @DPTR,A
ACALL DLAY
MOV A,36H
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,#00100000B
MOVX @DPTR,A
ACALL DLAY
LJMP DZSPLAY
DLAY:MOV R1,#01H 延時子程序
DL2:MOV R2,#01H
DL1:NOP
NOP
DJNZ R2,DL1
DJNZ R1,DL2
RET
LEDSEG:DB 3FH,06H,5BH,4FH,66H,6DH,7DH 07H,7FH,6FH ;0-9數碼顯示管
指令不清楚看下單片機的書
『柒』 求此8051單片機程序代碼怎麼編寫
是一種形式多樣,筆墨靈活的文體
『捌』 用C語言編寫8051單片機程序
/********************************
/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定時器0,定時中斷2ms一次對數碼管顯示掃描;
/* 三個位管要以掃描方式顯示,使用共陽管,計數速度為1S;
/* 段A-H接到P0.1....7,位選為 P1.0,1,2;
/* 流水也以計數方式從200到250在P2口顯示,低電平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//共陽數字字形0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe};//低電平有效數字個十百位選擇
unsigned char buf[3]={0,0,2};//計算中的個十百位暫時存放處
unsigned char one,ten,second;//個十位變數和流水燈顯示3秒的時間變數
unsigned char rate;//掃描速度,調整以適應顯示效果
unsigned char stop=0, flag=1,flag1=0;//閃爍3秒的標志位,用於主函數對中斷的關斷參數傳遞
unsigned int t,tt;//2ms變數
unsigned char rate;//與變數t同步,輔助賦值變
/**********主函數**********/
main(void)
{
TMOD=0X01;
TH0=0xf8;//定時2ms
TL0=0x30;
ET0=1;
EA=1;
TR0=1;
while(1)
{ if(stop==1)//判斷stop信號,為1後便關閉定時器
{ TR0=0;
ET0=0;
EA=0;
}
}
}
/*******************中斷*******************/
void timer0() interrupt 1
{
TH0=0xf8;//重新賦值定時2ms
TL0=0x30;
if(flag==0)//定義用於判斷計數是否到了250,若到了則不再計數,轉向else執行流水燈閃爍任務
{
t++;
if(t==500)
{ t=0;
one++;
P2=200+ten*10+one; //在P2口的流水等,也是從200開始計數。
if(one==10)
{ one=0;
ten++;
if(ten==5)
{ flag=1;//轉向執行閃爍任務
}
}
}
}
else//flag已經==1;轉向else執行流水燈閃爍任務
{ tt++;
if(tt==500)
{ tt=0;
second++;
P2=~P2;//流水燈全部以1S速度閃爍
if(second==3)stop=1;//判斷3秒時間到,關閉中斷,停止閃爍,數碼管熄滅
}
}
rate++;
P0=0XFF;//消隱
if(rate==3)rate=0;
P0=num_disp[buf[rate]];
P1=bit_sel[rate];
buf[0]=one;
buf[1]=ten;
//因為百位沒有變,所以不用賦值
}
『玖』 求一個用匯編語言編寫一個8051單片機的時鍾程序(急急急啊)
給你當參缺春祥考...不足功能自己改...有問題再發問..
;P1.4小時調整伏搏 P1.5分種調整
CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA
K1 BIT P1.4
K2 BIT P1.5
RSEG DATA_SEG
KEY_S: DS 1
KEY_V: DS 1
DIS_DIGIT: DS 1
SEC: DS 1
DIS_INDEX: DS 1
HOUR: DS 1
MIN: DS 1
SEC100: DS 1
DIS_BUF: DS 8
BUF_HOUR_H EQU DIS_BUF ; 小時十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小時個森氏位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分個位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒個位
RSEG STACK_SEG
STACK: DS 20
;===============================================================================
CSEG AT 0000H
JMP MAIN
CSEG AT 0000BH
LJMP TIMER0
CSEG AT 0001BH
LJMP TIMER1
;===============================================================================
RSEG CODE_SEG
MAIN:
USING 0
MOV SP, #(STACK-1) ;
MOV P0,#0FFH
MOV P2,#0FFH
MOV TMOD,#011H ; 定時器0, 1工作模式1, 16位定時方式
MOV TH0,#0FCH
MOV TL0,#017H
MOV TH1,#0DCH
CLR A
MOV TL1,A
MOV HOUR,#12 ;
CLR A ;
MOV MIN,A
MOV SEC,A
MOV SEC100,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_H,A ; 時十位
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A ; 時個位
MOV A,MIN
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 分個位
MOV A,SEC
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_SEC_H,A ; 秒十位
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_SEC_L,A ; 秒個位
MOV BUF_HOUR_H+02H,#0BFH
MOV BUF_HOUR_H+05H,#0BFH
MOV DIS_DIGIT,#0FEH
CLR A
MOV DIS_INDEX,A
MOV IE,#08AH ; 使能timer0,1 中斷
SETB TR0
SETB TR1
MOV KEY_V,#03H
MAIN_LP:
LCALL SCAN_KEY ; 鍵掃描
JZ MAIN_LP ; 無鍵返回
MOV R7,#10 ; 延時10ms
LCALL DELAYMS ; 延時去抖動
LCALL SCAN_KEY ; 再次掃描
JZ MAIN_LP ; 無鍵返回
MOV KEY_V,KEY_S ; 保存鍵值
LCALL PROC_KEY ; 鍵處理
SJMP MAIN_LP ; 調回主循環
;===============================================================================
SCAN_KEY:
; 掃鍵掃描子程序
; 保存按鍵狀態到key_s
; 返回: A --- 按鍵是否按下(BOOL)
CLR A
MOV C,K1 ; 讀按鍵K1
MOV ACC.0,C
MOV C,K2 ; 讀按鍵K2
MOV ACC.1,C
MOV KEY_S,A ; 保存按鍵狀態到key_s
XRL A,KEY_V
RET
;===============================================================================
PROC_KEY:
; 鍵處理子程序
; 傳入參數: KEY_V --- 按鍵值
; 返回值: 無
CLR EA
MOV A,KEY_V
JNB ACC.0,PROC_K1
JNB ACC.1,PROC_K2
SJMP END_PROC_KEY
PROC_K1: ; 按鍵k1處理
LCALL INC_HOUR ; 小時加1
SJMP END_PROC_KEY
PROC_K2: ; 按鍵K2處理
INC MIN ; 分鍾加1
MOV A,MIN ;
SETB C
SUBB A,#59
JC K2_UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1
CLR A ;
MOV MIN,A
K2_UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位
END_PROC_KEY:
SETB EA
RET
;===============================================================================
USING 0
TIMER0:
; 定時器0中斷服程序, 用於數碼管的動態掃描
; DIS_INDEX --- 顯示索引, 用於標識當前顯示的數碼管和緩沖區的偏移量
; DIS_DIGIT --- 位選通值, 傳送到P2口用於選通當前數碼管的數值, 如等於0xfe時,
; 選通P2.0口數碼管
; DIS_BUF --- 顯於緩沖區基地址
PUSH ACC
PUSH PSW
PUSH AR0
MOV TH0,#0FCH
MOV TL0,#017H
MOV P2,#0FFH ; 先關閉所有數碼管
MOV A,#DIS_BUF ; 獲得顯示緩沖區基地址
ADD A,DIS_INDEX ; 獲得偏移量
MOV R0,A ; R0 = 基地址 + 偏移量
MOV A,@R0 ; 獲得顯示代碼
MOV P0,A ; 顯示代碼傳送到P0口
MOV P2,DIS_DIGIT
MOV A,DIS_DIGIT ; 位選通值左移, 下次中斷時選通下一位數碼管
RL A
MOV DIS_DIGIT,A
INC DIS_INDEX ; DIS_INDEX加1, 下次中斷時顯示下一位
ANL DIS_INDEX,#0x07 ; 當DIS_INDEX等於8(0000 1000)時, 清0
POP AR0
POP PSW
POP ACC
RETI
;===============================================================================
USING 0
TIMER1:
; 定時器1中斷服務程序, 產生時基信號10ms
;
;
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
MOV TH1,#0DCH
INC SEC100
MOV A,SEC100
CLR C
SUBB A,#100 ; 是否中斷100次(達到1s)
JC END_TIMER1 ; < 1S
MOV SEC100,#00H ; 達到1s
LCALL INC_SEC ; 秒加1
END_TIMER1:
POP DPL
POP DPH
POP B
POP ACC
POP PSW
RETI ;
;===============================================================================
INC_SEC:
INC SEC
MOV A,SEC
SETB C
SUBB A,#59 ;
JC UPDATE_SEC
CLR A
MOV SEC,A
LCALL INC_MIN
UPDATE_SEC:
MOV A,SEC
MOV B,#10
DIV AB ; A = SEC / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_SEC_H,A ;
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B ; A = SEC % 10
MOVC A,@A+DPTR
MOV BUF_SEC_L,A
RET
;===============================================================================
INC_MIN:
INC MIN ; 分鍾加1
MOV A,MIN ;
SETB C
SUBB A,#59
JC UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1
CLR A ;
MOV MIN,A
LCALL INC_HOUR ; 小時加1
UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位
RET
;===============================================================================
INC_HOUR:
INC HOUR ; 小時加1
MOV A,HOUR
SETB C
SUBB A,#24
JC UPDATE_HOUR ; 如果小時等於24,則小時清0
CLR A
MOV HOUR,A ; 小時清0
UPDATE_HOUR:
MOV A,HOUR
SETB C
SUBB A,#10
JC UPDATE_HOUR1 ; 如果小時小於10,則十位0不顯示
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_HOUR_H,A
SJMP UPDATE_HOUR2
UPDATE_HOUR1:
MOV BUF_HOUR_H,#0FFH
UPDATE_HOUR2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A
RET
;===============================================================================
DELAYMS:
; 延時子程序
; 傳入參數:R7 --- 延時值(MS)
; 返回值:無
MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:
RET
; END OF DELAYMS
;===============================================================================
DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH
END
『拾』 8051單片機匯編程序請教
你的第二次修改,還有一處不足:
……
;CLR C
MOV DPTR,#TABLE
LOOP:
CLR A ;這里少了一句,下面每次讀出的,
;就不知道是什麼了
MOVC A,@A+DPTR
JNZ CONT_P
INC R2
SJMP NEXT
……
可以正常計數的程序如下。
;=========================================
ORG 0H
MOV A,#00H
MOV R2,A
MOV R3,A
MOV R4,A
MOV R6,A
MOV R5,#40
;CLR C
MOV DPTR,#TABLE
LOOP:
CLR A
MOVC A,@A+DPTR
JNZ CONT_P
; CJNE A,#00H,CONT_P
INC R2
SJMP NEXT
CONT_P:
JB ACC.7, CONT_N
INC R3
SJMP NEXT
CONT_N:
INC R4
NEXT:
INC DPTR
DJNZ R5, LOOP
MOV P0,R4
SJMP $
; 實際個數 保存單元 統計個數
;零個數 14 R2 21
;正數個數 19 R3 19
;負數個數: 7 R4 0
;其實是零和負數沒有分開統計,請高手指教一下,謝謝!
ORG 400H
TABLE:
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 02H, 05H, 00H,0FFH, 26H, 34H, 00H, 00H, 00H, 00H
END