希望有哪位单片机高手帮帮忙,详细讲解一下下面对程序
发布网友
发布时间:2022-04-22 05:56
我来回答
共4个回答
热心网友
时间:2023-10-05 13:08
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.5,HA1S2 ;按键有效转HA1S2,否则继续
INC A ;A加1
PUSH ACC ;A压栈
CPL A ;A取反
MOV P1,A ;A送P1
CLR P2.5 ;P2.5置低
SETB P2.5 ;P2.5置高
POP ACC ;A出栈
AJMP HA1S1 ;转HA1S1
DELAY:PUSH 02H ;R2压栈
DELAY1:PUSH 02H ;R2压栈
DELAY2:PUSH 02H ;R2压栈
DELAY3:DJNZ R2,DELAY3 ;R2减1直到0为止
POP 02H ;R2出栈
DJNZ R2,DELAY2 ;R2减1直到0为止
POP 02H ;R2出栈
DJNZ R2,DELAY1 ;R2减1直到0为止
POP 02H ;R2出栈
DJNZ R2,DELAY ;R2减1直到0为止
RET
END追问压栈是什么
追答压栈就是将一个寄存器的值压入堆栈
热心网友
时间:2023-10-05 13:08
ORG 30H //首地址
HA1S: MOV A,#00H //寄存器A清零,程序开头,主循环入口
HA1S1: JB P3.5,HA1S1 //循环等待P3.5为0
MOV R2,#10H //设置延时时间
LCALL DELAY //调用延时子程序
JB P3.5,HA1S1 //如果P3.5是1,回到HA1S1,重复前面的过程
HA1S2: JB P3.5,HA1S2 //循环等待P3.5为0
MOV R2,#10H //设置延时时间
LCALL DELAY //调用延时子程序
JNB P3.5,HA1S2 //如果P3.5是0,回到HA1S2,重复前面的过程
INC A //A增1 PUSH ACC //ACC进栈
CPL A //A补码(取反)
MOV P1,A //A输出P1
CLR P2.5 //清P2.5
SETB P2.5 //设置P2.5
POP ACC //ACC出栈
AJMP HA1S1 //跳转到HA1S1,循环
DELAY:PUSH 02H //延时子程序入口 ,循环入口
DELAY1:PUSH 02H //延时循环1入口
DELAY2:PUSH 02H //延时循环2入口
DELAY3:DJNZ R2,DELAY3 //延时循环3
POP 02H //出栈
DJNZ R2,DELAY2 //延时循环2结尾
POP 02H //出栈
DJNZ R2,DELAY1 //延时循环1结尾
POP 02H //出栈
DJNZ R2,DELAY //延时最外循环结尾
RET //延时子程序结束返回
END
热心网友
时间:2023-10-05 13:09
ORG 30H;定义代码段存放首地址
HA1S: MOV A,#00H; A=0;
HA1S1: JB P3.5,HA1S1;判断P3.5这个IO口是不是为0(估计接的是按键吧,就是看它有没有按下)
MOV R2,#10H;R2=10;延时附初值
LCALL DELAY;调用延时函数
JB P3.5,HA1S1;再判断一次按键状态(消抖作用)
HA1S2: JB P3.5,HA1S2;还是判断按键状态
MOV R2,#10H;同上
LCALL DELAY;同上
JNB P3.5,HA1S2;判断按键是否放开
INC A;A++; 现在因该是1了
PUSH ACC;A 入栈(想知道为什么一会ACC,一会A.自己去看他们的差别吧)
CPL A;A 按位取反 (这么做的原因,估计是你LED灯是拉低点亮的)
MOV P1,A;把A 给P1口
CLR P2.5;拉低 P2.5这个IO口 (如果灯是拉低点亮的 ,那就是点亮LED灯)
SETB P2.5;拉高 P2.5 (没延时,估计你看不出这个效果,基本就是一直灭)
POP ACC;刚才压入的是 1 现在重新取出 A 变回1
AJMP HA1S1;跳回去 完成一个循环
DELAY:PUSH 02H;这里开始都是延时函数
DELAY1:PUSH 02H
DELAY2:PUSH 02H
DELAY3:DJNZ R2,DELAY3
POP 02H
DJNZ R2,DELAY2
POP 02H
DJNZ R2,DELAY1
POP 02H
DJNZ R2,DELAY
RET
END
热心网友
时间:2023-10-05 13:09
P3.5是个开关,P1是8个LED,P2.5应该是个蜂鸣器。
该程序是:按一下开关,8个LED的数值就递增1,同时蜂鸣器响一下。
各位单片机高手,哪位帮我分析一下下面这个程序,问题出...
回答:首先给你解释一下“<<”位移符的作用: 因为你的P1=0xfe,二进制数据就是11111110,左移一位之后为11111100,0往左移了一位,但是最低位系统自动以0补齐,而0x7f的二进制数据位01111111,所以if语句是永远进入不了的。 当然,针对此问题,C51给出了一个解决方案: 使用_crol_()函数可解决此问题...
求单片机高手帮我逐句解释一下这个程序 谢谢了
define uchar unsigned char//方便定义函数无符号型应该用UCHAR表示为方便直接用CHAR表示了。define uint unsigned int//整形同上解释 sbit clock=P1^0; //定义CLOCK接到单片机P0_1口,请注意这里用P0^1,就是因为包含了REG51.H。如果不包含就不能这么使用。sbit d_in=P1^1;sbit d_out=P1^2;sb...
请单片机高手分析下面程序~~出现*** WARNING L16: UNCALLED SEGMENT...
中断程序里的void debouncer() ;把void去掉就可以了这样改改试试,/*外部中断INT0的实验*/ include<reg52.h> define uint unsigned int define LED P1 sbit KEY = P3^2;void Delay(uint del) //延时时间为 10ms * del { uint i,j;for(i=0; i<del; i++)for(j=0; j<1827; j...
求单片机高手帮忙详细解释下程序 特别是中断那
这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次...
请各位高手回答一下下面的单片机程序问题!谢谢!
执行 DJNZ Rn, rel 指令耗用2个机器周期,即2μs 该段程序执行该类指令总次数=250x200x10=500000 耗用时间 = 500000x2μs = 10^6μs =1s 若改为延时0.1 第三行指令改为 LOOP1: MOV R1, #01 若改为延时0.5s, 第三行指令改为 LOOP1: MOV R3, #05 若改为延时2s, 第三行...
单片机入门,急求高手大虾指教!!!
您的水平不高我完全心中有底,其实我只要求这些学生能够掌握单片机应用开发的基本技能,用汇编和C51 写过一些基本的程序,真正动手做过一些简单的项目,然后将自己做过的项目写成比较规范的文档。我想,这种形式的“自我介绍”肯定要比让别人看您那写的千遍一律的“八股文”简历不知要强多少倍,古人言:“一叶知秋”其实...
请单片机高手帮写一个简单的中断程序
include <reg52.h> sbit LED=P0^0;void exint1Init(void){ EX1=1;IT1=1;EA=1;} void exint1_ISR(void) interrupt 2 { LED=~LED;} void main(void){ exint1Init();while(1);}
求一单片机高手帮我解读一下我的错误
这是一个对线路的模拟仿真的错误提示。U1(器件编号)的P3.2脚,也就是INT0(外部中断0)连接到U4器件的一个输出端口,提醒你注意。LCD1的V0、V1脚,即电源脚没有正确连接到电源。虚拟终端输入失败!
请单片机高手看一下程序哪里出错
if(shuaxin) //是否需要刷新LCD标志位. { Clr_Scr(); shuaxin=0; } led_menu_show(); }//附录四 按键程序 #define nullkey 0 //定义//uchar get_key() //读键//{ uchar pass,kcodebuf; static uchar lastkcode,keytime=0; //定义为静态变量,外部不可见,但需要常驻内存. static uchar have...
单片机高手给帮忙写个程序吧(急急)
现在急需一个单片机的程序;题目是基于spce061a的温度检测显示储存系统的程序,温度传感器使用的是DS18B20液晶显示是使用得1602,外扩了一个存储器1024,具体要求是:每1.采集温度,精... 现在急需一个单片机的程序;题目是基于spce061a的温度检测显示储存系统的程序,温度传感器使用的是DS18B20 液晶显示是使用得1602 ,外扩了一...