㈠ 單片機查表程序
DEC A
因為要用自然數作為表的偏移,而自然數是從1開始的、表格偏移是從0開始的,所以當然要減1咯。例如要查2的平方,實際就是要查找表格偏移+1的元素。
RL A
因為表格每個元素是兩個位元組,所以偏移地址要乘以2。還是以查2的平方為例,它對應於表格偏移+1的元素,但因為每個元素佔用2個位元組,所以地址偏移量實際是(+1)×2 = +2h。
㈡ 8051單片機跑表問題
用定時器產生固定的時間(一般為毫秒級),然後對它計數(產生秒),以秒,分,時進位就是了(電子表),加兩個按鍵實現復位和停止就行了(馬表了)!
這是思路,具體程序如下:
0-9999999.9 跑馬表
Count EQU 40H
TimeCount EQU 3FH
K1 BIT P1.4 ;啟動計時
K2 BIT P1.5 ;暫停計時
K3 BIT P1.6
K4 BIT P1.7 ;計時單元清零
BEEP BIT P3.7
;**********************************************************
ORG 0000H
JMP MAIN
ORG 000BH
JMP TIMER0
ORG 0030H
;**********************************************************
; 主程序
;**********************************************************
MAIN:
MOV SP,#60H
MOV TMOD,#01
SETB EA
SETB ET0
MOV TH0,#4CH ;50ms定時
MOV TL0,#00H
CALL M_CLR ;計時單元清零
MAIN1:
JB K1,MAIN2
CALL BEEP_BL
CALL DELAY ;調顯示延時
SETB TR0 ;啟動中斷
MAIN2:
JB K2,MAIN3
CALL BEEP_BL
CALL DELAY ;調顯示延時
CLR TR0 ;停止中斷
MAIN3:
JB K4,MAIN4
CALL BEEP_BL
CALL DELAY ;調顯示延時
CALL M_CLR ;計時單元清零
MAIN4:
CALL DISP
JMP MAIN1
;**********************************************************
; 計時單元清零子程序
;**********************************************************
M_CLR:
MOV R0,#Count
MOV A,#00H
CLR_1:
MOV @R0,A ;清零
INC R0
CJNE R0,#49H,CLR_1
RET
;**********************************************************
; 鍵延時子程序
;**********************************************************
DELAY:
MOV R4,#05H
DELAY1:
CALL DISP
DJNZ R4,DELAY1
RET
;**********************************************************
; 顯示子程序
;**********************************************************
DISP:
MOV R0,#Count ;獲得顯示單元首地址
MOV R1,#07FH ;從第一個數碼管開始
MOV R2,#08H ;共顯示8位數碼管
DISP1:
MOV A,@R0 ;獲得當前位地址
MOV DPTR,#TABLE ;獲得表頭
MOVC A,@A+DPTR ;查表獲得顯示數據
MOV P0,A ;顯示數據
MOV P2,R1 ;開始顯示當前位
MOV A,R1 ;准備顯示下一位
CJNE A,#0BFH,DISP2
CLR P0.7 ;加小數點
DISP2:
RR A
MOV R1,A ;下一位
INC R0 ;取下一個單元地址
LCALL DELAY2MS ;延時 2 MS
DJNZ R2,DISP1 ;重復顯示下一個
MOV P2,#0FFH ;關閉顯示
RET ;顯示完成,返回
;**********************************************************
;顯示延時子程序
;**********************************************************
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
;**********************************************************
; 中斷服務子程序
;**********************************************************
TIMER0:
PUSH ACC
MOV TH0,#4CH ;50ms定時
MOV TL0,#00H
INC TimeCount
MOV A,TimeCount
CJNE A,#2,T_END
MOV TimeCount,#00H
INC Count ;小數位
MOV A,Count
CJNE A,#10,T_END
MOV Count,#00H
INC Count+1 ;個位
MOV A,Count+1
CJNE A,#10,T_END
MOV Count+1,#00H
INC Count+2 ;十位
MOV A,Count+2
CJNE A,#10,T_END
MOV Count+2,#00H
INC Count+3 ;百位
MOV A,Count+3
CJNE A,#10,T_END
MOV Count+3,#00H
INC Count+4 ;千位
MOV A,Count+4
CJNE A,#10,T_END
MOV Count+4,#00H
INC Count+5 ;萬位
MOV A,Count+5
CJNE A,#10,T_END
MOV Count+5,#00H
INC Count+6 ;十萬位
MOV A,Count+6
CJNE A,#10,T_END
MOV Count+6,#00H
INC Count+7 ;百萬位
MOV A,Count+7
CJNE A,#10,T_END
MOV Count+7,#00H
T_END:
POP ACC
RETI
;**********************************************************
;蜂鳴器響一聲子程序
;**********************************************************
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP
DJNZ R6,BL2
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
;**********************************************************
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H ,90H,0FFH
DB 88H,83H,0C6H,0A1H,86H,8EH
;**********************************************************
END
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Count;
sbit K1 = P1^4;
sbit K2 = P1^5;
sbit K3 = P1^6;
sbit K4 = P1^7;
sbit DIN = P0^7; //小數點
sbit BEEP = P3^7; //蜂鳴器
uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff};
uchar data display[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code scan_bit[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*********************************************************
延時函數
*********************************************************/
void Delay(uint num)//延時函數
{
while( --num );
}
/*********************************************************
蜂鳴器響一聲
**********************************************************/
void beep()
{
unsigned char y;
for (y=0;y<150;y++)
{
Delay(50);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
}
/********************************************************
顯示函數
*********************************************************/
play()
{
uchar i;
for(i=0;i<8;i++)
{
P0=LEDData[display[i]]; //顯示個位
P2=scan_bit[i];
if(scan_bit[i]==0xbf)
DIN=0; //加小數點
Delay(100);
}
P2=0xff; //關閉顯示
}
/********************************************************
鍵延時函數
*********************************************************/
key_time()
{
uchar k;
for(k=0;k<15;k++)
play();
}
/********************************************************
主函數
*********************************************************/
main()
{
uchar j;
P0=0xff;
P2=0xff;
Count=0x00;
TMOD=0x01;
TH0=0x4c; TL0=0x00; //50ms定時
EA=1; ET0=1;
while(1)
{
if(K1==0)
{
beep();
key_time();
TR0=1; //啟動中斷
}
if(K2==0)
{
beep();
key_time();
TR0=0; //停止中斷
}
if(K4==0)
{
beep();
key_time();
for(j=0;j<8;j++)
display[j]=0x00; //計時單元清零
}
play();
}
}
/*********************************************************
Time0中斷函數
**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定時
TL0=0x00;
Count++;
if(Count==2)
{
Count=0;
display[0]++; //0.1S
}
if(display[0]==10)
{
display[0]=0;
display[1]++; //個位
}
if(display[1]==10)
{
display[1]=0;
display[2]++; //十位
}
if(display[2]==10)
{
display[2]=0;
display[3]++; //百位
}
if(display[3]==10)
{
display[3]=0;
display[4]++; //千位
}
if(display[4]==10)
{
display[4]=0;
display[5]++; //萬位
}
if(display[5]==10)
{
display[5]=0;
display[6]++; //十萬位
}
if(display[6]==10)
{
display[6]=0;
display[7]++; //百萬位
}
if(display[7]==10)
{
display[7]=0;
}
}
/*********************************************************/
㈢ 單片機秒錶
下面的兩篇希望對你有所幫助
單片機秒錶
http://wenku..com/view/def806aedd3383c4bb4cd29e.html
單片機秒錶課程設計
http://wenku..com/view/994ce7d8ce2f0066f533224a.html
㈣ 關於單片機查表程序
如下:
ORG 0000H
BUF1 EQU 30H
BUF2 EQU 40H
N EQU 0AH
MOV 30H, #05H ;00~09H,加上這行,就是給定30H單元數據。
MOV R0, #5 ;這里不應該是5, 應該是BUF1
MOV R1, #BUF2 ;以下不變
……
㈤ 單片機向量表
你說的是不是單片機中斷向量表
指的是單片機不同的中斷源產生的中斷程序的起始地址
如51單片機定時器0產生的中斷時會跳到程序存儲器的地址000BH處去執行
定時器1產生的中斷會跳到程序存儲器的地址001BH處去執行
不同的中斷源對應的不同的程序地址就組成了中斷向量表
㈥ 單片機查表
題目已經說了,每個最大允許值,都是雙位元組的。所以以位元組為單位計算偏移量時應當乘以2,
㈦ 單片機查表程序
後一問A的值應為58H。
執行完MOV A,#5H後,PC為52H。
執行MOV A,@A+PC時,會預先將PC指向下一條指令(PC+1),之後再執行加法。參見51指令集手冊。
㈧ 單片機查表程序編寫 急!
org 0000h
mov 30h, #1
mov 31h, #3
mov 32h, #5
mov 33h, #7
mov 34h, #9
mov 35h, #2
mov 36h, #4
mov 37h, #6
mov 38h, #8
mov 39h, #10
call SQRT
sjmp $
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H
MOV R1, #40H
MOV R2, #10
LOOP:
MOV A, @R0
ADD A, #S_TAB - ($ + 4)
MOVC A, @A + PC
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
;完
㈨ 51單片機查表
DPTR是一個16位的數據指針,程序里就是標號TABLE的地址,你改了這地址里的內容,地址值還是不變的。
㈩ 單片機 表格問題
MOVC就是片內數據查表啊,你弄錯了吧,MOVX是訪問片外的
下面的程序,如果A原本=1,那麼查表後A=0078H
mov dptr,#HIGHTAB
movc a,@a+dptr
HIGHTAB: DW 0000H,0078H,0156H,0234H,0312H,0390H,0468H,0546H
DW 0625H,0703H,0781H,0859H,0937H,1015H,1093H,1171H
DW 1250H,1328H,1406H,1484H,1562H,1640H,1718H,1796H
DW 1875H,1953H,2031H,2109H,2187H,2265H,2343H,2421H
DW 2500H,2578H,2656H,2734H,2812H,2890H,2968H,3046H
DW 3125H,3203H,3281H,3359H,3437H,3515H,3593H,3671H
DW 3750H,3828H,3906H,3984H,4062H,4140H,4218H,4297H
DW 4375H,4453H,4531H,4609H,4687H,4765H,4843H,4922H
DW 5000H,5078H,5156H,5234H,5312H,5390H,5468H,5547H
DW 5625H,5703H,5781H,5859H,5937H,6015H,6093H,6172H
DW 6250H,6328H,6406H,6484H,6562H,6640H,6718H,6797H
DW 6875H,6953H,7031H,7109H,7187H,7265H,7343H,7422H
DW 7500H,7578H,7656H,7734H,7812H,7890H,7968H,8047H
DW 8125H,8203H,8281H,8359H,8437H,8515H,8594H,8672H
DW 8750H,8828H,8906H,8984H,9026H,9140H,9219H,9297H
DW 9375H,9453H,9531H,9609H,9687H,9765H,9844H,9922H