导航:首页 > 操作系统 > 单片机表

单片机表

发布时间: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

阅读全文

与单片机表相关的资料

热点内容
pdf转换成图片免费软件 浏览:454
编程语言怎么做出来的 浏览:617
文件夹英文名排序 浏览:56
西二旗最高程序员 浏览:99
台湾写真内部加密无删减视频 浏览:830
在线照片压缩变小 浏览:654
隐藏配置文件夹 浏览:186
php分布式模块化开发 浏览:389
wula是什么app 浏览:832
豌豆荚里怎么降低安卓手机版本 浏览:371
桌面的文件夹怎样解散 浏览:796
贵州贵阳山洞服务器云空间 浏览:221
年薪48万程序员老公 浏览:917
使用预构建的python 浏览:532
加密对冲基金交易有限公司 浏览:357
烟台制冷压缩机价格 浏览:249
平板能用腾讯云服务器吗 浏览:867
有js基础学python 浏览:599
程序员可以回老家盖房子吗 浏览:555
pythonserial波特率 浏览:578