关于单片机程序怎么解释的问题。

作者&投稿:穆红 (若有异议请与网页底部的电邮联系)
单片机程序解释~

CNTA EQU 30H ;定义CNTA为寄存器30H
COUNT EQU 31H ;定义COUNT为寄存器31H

ORG 00H ;程序开始
LJMP START ;开始程序入口
ORG 0BH ;定时器T0中断程序入口地址,不过最好用ORG 000BH
LJMP T0X ;T0中断程序入口
ORG 0030H ;主程序开始地址,初始化开始
START: MOV CNTA,#00H ;
MOV COUNT,#00H
MOV TMOD,#01H ;定时器T0工作方式1
MOV TH0,#(65536-1000) / 256 ;这是C的方式,不知道汇编支持不支持?
MOV TL0,#(65536-1000) MOD 256
SETB TR0 ;T0计时开始
SETB ET0 ;开T0中断
SETB EA ;开总中断(你这边最好按 SETB EA
SETB ET0
SETB TR0的顺序)
WT: JB P2.0,WT ;判断P2.0,如果是高,等待。
MOV R6,#5 ;如果P2.0为低,延时开始
MOV R7,#248 ;这个延时是为了消抖
D1: DJNZ R7,$ ;以防误判
DJNZ R6,D1
JB P2.0,WT ;延时结束,继续判断P2.0的状态,如果不为低,继续等待
INC COUNT ;如果为低,COUNT加1
MOV A,COUNT ;判断COUNT的数值
CJNE A,#03H,NEXT ;如果COUNT不等于3,转到 NEXT执行
MOV COUNT,#00H ;如果是3,清COUNT为0
NEXT: JNB P2.0,$ ;等待P2.0为高
SJMP WT ;如果P2.0释放,循环

T0X: NOP ;T0中断服务程序
MOV TH0,#(65536-1000) / 256 ;重装初值
MOV TL0,#(65536-1000) MOD 256
MOV DPTR,#TAB ;把表的基址赋予DPTR
MOV A,CNTA ;把变址给A
MOVC A,@A+DPTR ;查表
MOV P3,A ;把查出的表值给P3口
MOV DPTR,#GRAPH ;把GRAPH赋予DPTR
MOV A,COUNT ;把COUNT值给A
MOV B,#8 ;
MUL AB ;AB相乘,值放A里
ADD A,CNTA ;A加CNTA的值放A里做变址
MOVC A,@A+DPTR ;查表
MOV P1,A ;查表值给P1口
INC CNTA ;连续查
MOV A,CNTA
CJNE A,#8,NEX ;不到8次,中断返回,下次接着上个地址查表
MOV CNTA,#00H ;8次到了,从头开始
NEX: RETI ;中断返回指令

TAB: DB ;表0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
GRAPH: DB 12H,14H,3CH,48H,3CH,14H,12H,00H
DB 00H,00H,38H,44H,44H,44H,38H,00H
DB 30H,48H,44H,22H,44H,48H,30H,00H
END

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8个数码管的位选择信号表
uchar code display[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; //1-8的共阴字码表
sbit wei=P3^7; //P3.7用于控制哪位显示
sbit rest=P2^7; //P2.7用于复位
void delay(uint z) //延时函数,入口参数Z.具体延时于晶振频率有关
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
main() //主函数
{
uchar i,temp;
P0=0xff; //P0口全部拉高,置1
delay(10); //延时delay(10)MS
wei=1; //P3.7置1
while(1) //循环扫描P1口按键状态
{
temp=0xfe; //temp存扫描码
for(i=0;i<8;i++) //循环8次,即扫描8个按键
{
if(P1==temp) //如果P1口读入的状态等于当前扫描码
{
delay(10); //延时去抖
if(P1==temp) //再读P1口比较
{
while(1) //确定按键有效,进入循环体
{
if(rest==0) //如果P2.7==0
{
delay(10); //延时去抖
if(rest==0) //确定P2.7脚按键按下
{
P0=0xff; //P0口拉高
P3=0; //P3口送0 ,即熄灭所有LED数码管
while(rest==0); //如果P2.7的按键一直按下,则等待
break; //如果P2.7按键弹开,则跳出循环体,重新扫描按键
}
}
else //如果P2.7==1,即复位键没有按下
{
P0=table[i]; //P0口送出P1口按键对应位的位控号
P3=display[i]; //P3口送对应的段码值,形成显示
}
}
}
}
temp=(temp<<1)|0x01; //temp左环移,扫描下一按键
}
}
}
该程序实现的功能大概是:将P1口按键的状态显示到对应位的LED管上,比如按下第2个键,会在第2个数码管上显示2同时按下多个键也一样,按下哪几个就对应显示哪几个键的值.按下复位按键后,所有数码管
熄灭.
希望我猜得对,忽忽

GET: MOV R1 A //R1=A
ANL A, #0FH //逻辑与 A=A&0F
MOV @R0, A //@R0表示的是R0的值指向的地址 即将A的值放入R0指向的地址里去
DEC R0 //R0=R0-1
MOV A, R1 //A=R1
SWAP A //A中的高字节和低字节互换
ANL A, #0FH //逻辑与 A=A&0F
MOV @R0 , A //@R0表示的是R0的值指向的地址 即将A的值放入R0指向的地址里去
DEC R0 //R0=R0-1
RET //返回,意思是子程序执行完啦,现在要回到调用子程序前的那段代码那去

这段代码的大概意思就是将A的高位和地位分别放到两个挨着的地址中去,低位放高地址,高位放低地址,地址由R0指出。
其实我不是很懂汇编,以上均百度出来的,楼主要多使用度娘啊,实在不行上GOOGLE。

你一句句的分析嘛。。。。。ANL A, #0FH 是取A中低4位。。。。DEC R0 是R0的下一个地址 SWAP A A高地位交换。。。。。。。然后再取A的第四位。。在存储 就是把A中的高低位分别存入 地址@R0 和地址@R0-1 中


AT89C51芯片怎么解密?
2、把关键的程序部分安排在程序的前4K中。3、把整个程序写入27C512,再把27C512的前4K填充为0。4、把程序的前4K固化到AT89C51中,用OPT模式做加密。5、把单片机的EA脚接高电平。这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事。AT89...

基于单片机的信号发生器设计的程序在编辑中出错“TARGET OUT OF RAN...
转移的目的地,太远了,相对转移指令,转不过去。在不到目的地的,中间位置,加上一个标号,先转此处后,再用 LJMP 指令,可以转移到任意距离的目的地。

51单片机LED操作汇编语言程序解释
ORG 00H ;程序初始地址 SJMP STAR ;跳转到STAR ORG 1BH ;定时器T1的中断向量地址 SJMP T1S ;跳转到T1S ORG 30H ;程序地址30H,即STAR标号地址 STAR: MOV R2,#99 ;将十进制数99送入R2中 MOV R4,#20 ;将十进制数20送入R4中 MOV IE,#88H ;开启EA和E...

求这段单片机程序理解! 求解答!
看起来是个自定义的键盘按键解码程序,大致解释如下:temp=temp&0xf0; \/\/保留temp的高四位,低四位清零 if(temp!=0xf0) \/\/temp的高四位不全为1,进入(此时有键按下,详细解释需结合电路图){ delayms(10); \/\/延时 temp=P3; \/\/读入P3口状态 temp=temp&0xf0; \/\/保留temp的高四...

单片机高手来帮我解释这个程序
ORG 30H HA1S: MOV A,#00H ;累加器A清0 HA1S1: JB P3.5,HA1S1 ;等待按键 MOV R2,#10H ;R2=10H LCALL DELAY ;延时 JB P3.5,HA1S1 ;按键有效继续,无效转HA1S1 HA1S2: JB P3.5,HA1S2 ;等待按键 MOV R2,#10H ;R2=10H LCALL DELAY ;延时 JNB P3...

刚开始学习单片机,求解释单片机简单计算器的除法程序部分(最好每句都...
else if(fuhao==4) \/\/是否为4,{ write_com(0x80+0x4f); \/\/写入命令。你的函数应该是液晶显示的。write_com(0x04); \/\/一样命令 i=0;c=(long)(((float)a\/b)*1000); \/\/计算c的数据 while(c!=0) \/\/判断C如果不等于0.,其实是直到等于0就退出 { write_date(0x30+c...

帮忙解释一段单片机程序
ACALL DEL MOV P0,#0FFH ;P0.0高电平 ACALL DEL AJMP MAIN === DEL中的R5,R6,R7的值是根据单片机机器周期(单位us)来确定的,周期=12\/晶振频率(us)=== 按你提供的数据,DEL子程序共花了522000个左右的机器周期(没精确计算).如果晶振频率为12MHZ,即延迟时间0.5秒 === ...

单片机-球程序详解-DJNZ方面的
MOV 23H,#0AH 将立即数10存储到内部RAM的23H单元中 CLR A 将寄存器A清零 LOOPX: ADD A,23H 将A中的值和RAM 23H单元的值相加,和存到A中 DJNZ 23H,LOOPX 23H单元的值减一如果不为零则转到LOOPX处运行 SJMP $ 程序转到当前处运行 最终A内的值为1~10的累加和 ...

51单片机流水灯程序解析,求大神指导,本人是初学者。
你认真分析原理图啊,上面明显接成共阳的了。1、51单片机上电时,端口都是高电平的,只有运行程序,电平才可能产生变化。复位时,端口也是高电平。2、你这仿真图中,LED正端都接到电源了,负端接单片机IO,根据二极管正向导通原理,此时负端肯定要为低电平,二极管才导通,才会亮。所以,你要点亮哪个...

基于单片机的信号发生器设计的程序在编辑中出错“TARGET OUT OF RAN...
有些跳转命令只能在2K范围内寻址,比如sjmp,jc,jnc,jb,jnb等等等等,如果你的跳转目的地跟跳转指令不在2K范围内,则会提示目标超出范围。最简单的办法是同一个2K地址内加一条中转绝对跳转指令,通过该指令间接跳转到需要的目的地。。

中市区18762381055: 一个单片机程序怎么解释? -
家背碘克: 这个是个死循环,一般单片机都是死循环,一般如果主循环中不做什么东西的话,这个程序应该是测试中断的,如果有中断了就跳进中断中处理,处理完了就跳回主程序中,也就是这个死循环.这个相当于C中的while(1); 这个可以根据需要在循环中加入代码

中市区18762381055: 单片机程序求解释 -
家背碘克: if(a==1) //对射传感器检测障碍物 {num++; //计转速 while(a); }------------------- a应该表示检测到障碍物的信号,另外应该有一个程序或中断会实时的改变a的状态来表示有没有障碍物.如果a为1检测到,则计数加1,然后等a为0,即等障碍物离开/...

中市区18762381055: 单片机程序说明解释 -
家背碘克: ORG 0 //开始位置地址,0x00 START: MOV R2,#8 //将8写入R2寄存器 MOV A,#0FEH //将0xfe写入A SETB C //进位标志位C(CY)置1 LOOP: MOV P1,A //将A里面的数值送到P1口 LCALL DELAY //长跳转,跳到DELAY RLC A //A数值左移一位,最...

中市区18762381055: 这段单片机程序怎么理解呢?大神知道的指导下.急急急. -
家背碘克: 我看了一下,这是个使用数码管进行温度显示的程序段,其中用P0来传输段码,位码分别用P2.4-P2.7来控制,初步看:开始部分,判断温度是否超上限,如果超了,则蜂鸣,继电器动作;如果超下限,则蜂鸣,继电器动作;否则不蜂鸣,不作动作.后面要根据几个情况来看,h_temp,l_temp和其它,估计是分别显示高温,低温和正常温度 里面看,wdu4(P2.4)控制个位显示,wdu3(P2.7)控制十位显示,wdu2(P2.6)根据情况,显示“H”,“L”,“+”或“-”等前缀,wdu1(P2.5)控制百位.

中市区18762381055: 在单片机C程序中1602有一段程序是这样的,该怎样解释呀? -
家背碘克: A变量吧,这要看dis_LCD的具体写法和参数意义.printf是C语言标准库函数,而且参数是不定参数形式,可以在当前的控制台程序输出字符串.而1602液晶显示器必须指定位置和数据通过串/并形式发送过去才能显示的.

中市区18762381055: 关于单片机的程序,谁能来帮我解释一下啊,急急急 -
家背碘克: ……热锅上的蚂蚁,没有头的苍蝇…… 程序已经写明了这是对AD9850写配置字,难道你就不会去ADI的网站找到AD9850的规格书和应用手册好好看一看?注释里面已经写得很明白了,2的32次方减1等于4294967295,4294967295÷125000000 = 34.35973836.先用浮点算出控制字,有助于提高精度.当然如果你的主控芯片没有浮点运算单元的话,也可以改用整数先Scale up,计算完了再Scale down回来……

中市区18762381055: 单片机应用技术 -
家背碘克: 单片机中的程序是控制单片机各部件工作的.其存储器包括内部程序存储器、数据存储器和外部程序存储器、数据存储器.程序存储器是用来存放以编好的程序和表格常数,片内、片外程序存储器统一编址,单片机执行指令时通过/EA引脚高低电平来决定是从片内还是从片外程序存储器取指令.单片机片内、片外数据存储器单独编址,51系列单片机内部数据存储器共256个字节,00H~7FH为片内RAM,80H~FFH为特殊功能寄存器(SFR)区;52系列单片机00H~FFH为片内RAM,80H~FFH为SFR,后者与前者编址是重叠的,但因为访问的指令不同因而并不会引起混乱.

中市区18762381055: 初学单片机该怎么去理解那些程序?
家背碘克: 先理解各个子程序实验的目的,再慢慢了解每条指令在程序中起到的作用! 如:下面是一个延时子程序, (汇编) DELAY:MOV R0,#20; LOOP: MOV R1,#250; LOOP1:DJNZ R1,LOOP1;DJNZ R0,LOOP;RET先要知道这段程序的作用!延时...

中市区18762381055: 那位大侠帮忙解释单片机中程序的意思: -
家背碘克: 将TMOD低4位置1H 高4位维持原值 就是设置Timer0工作方式 TL存储-992的低8位 TH存储-992的高8位 启动Timer0 设置Timer0允许中断 设置单片机接受中断请求 这段代码是计时器0的初始化代码 发送中断的间隔时间跟TL TH的值以及晶振有关

中市区18762381055: 帮忙解释一段单片机程序 -
家背碘克: 这是一个令单片机P0.0脚输出信号不断翻转(高电平,低电平)的程序.高低电平持续时间由延迟子程序DEL决定,DEL子程序中的R5,R6,R7三个寄存器中的值控制着延迟时间,================================ MAIN: MOV P0,#0FEH ;...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网