導航:首頁 > 操作系統 > 單片機表

單片機表

發布時間:2022-02-02 15:06:30

單片機查表程序

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

閱讀全文

與單片機表相關的資料

熱點內容
javamap底層 瀏覽:263
賣華為雲伺服器 瀏覽:105
中穎單片機燒錄器 瀏覽:841
pdf轉換成圖片免費軟體 瀏覽:454
編程語言怎麼做出來的 瀏覽:617
文件夾英文名排序 瀏覽:56
西二旗最高程序員 瀏覽:99
台灣寫真內部加密無刪減視頻 瀏覽:830
在線照片壓縮變小 瀏覽:654
隱藏配置文件夾 瀏覽:186
php分布式模塊化開發 瀏覽:389
wula是什麼app 瀏覽:832
豌豆莢里怎麼降低安卓手機版本 瀏覽:371
桌面的文件夾怎樣解散 瀏覽:796
貴州貴陽山洞伺服器雲空間 瀏覽:221
年薪48萬程序員老公 瀏覽:917
使用預構建的python 瀏覽:532
加密對沖基金交易有限公司 瀏覽:357
煙台製冷壓縮機價格 瀏覽:249
平板能用騰訊雲伺服器嗎 瀏覽:867