×

单片机程序解析

单片机程序解析(单片机程序解释)

admin admin 发表于2024-07-19 15:14:52 浏览7 评论0

抢沙发发表评论

大家好,单片机程序解析相信很多的网友都不是很明白,包括单片机程序解释也是一样,不过没有关系,接下来就来为大家分享关于单片机程序解析和单片机程序解释的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

单片机程序解释

CNTA EQU 30H ;定义CNTA为寄存器30HCOUNT EQU 31H ;定义COUNT为寄存器31HORG 00H ;程序开始LJMP START ;开始程序入口ORG 0BH ;定时器T0中断程序入口地址,不过最好用ORG 000BHLJMP T0X ;T0中断程序入口ORG 0030H ;主程序开始地址,初始化开始START: MOV CNTA,#00H ;MOV COUNT,#00H MOV TMOD,#01H ;定时器T0工作方式1MOV 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加1MOV A,COUNT ;判断COUNT的数值CJNE A,#03H,NEXT ;如果COUNT不等于3,转到 NEXT执行MOV COUNT,#00H ;如果是3,清COUNT为0NEXT: 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 ;把表的基址赋予DPTRMOV A,CNTA ;把变址给AMOVC A,@A+DPTR ;查表MOV P3,A ;把查出的表值给P3口MOV DPTR,#GRAPH ;把GRAPH赋予DPTRMOV A,COUNT ;把COUNT值给AMOV 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

单片机程序解释说明

ORG OOH //程序开始START:JB P3.0,LIG //如果P3.0等于0,跳转到LIGCLR P1.0 //赋值,P1.0=0SJMP START //跳转到STARTLIG: SETB P1.0 //置一,P1.0=1SJMP START //跳转到STARTEND //结束整个程序的作用就是:判断P3.0的状态。如果P3.0=1,则P1.0=1;如果P3.0=0,则P1=0。

单片机程序 解析一下 谢谢 急

ISP_ERASE(0x2c00); //执行 ISP_ERASE(int16 data)函数,0x2c00是形参。ISP_PROGRAM(0x2c00, SET_H/256); ISP_PROGRAM(0x2c01, SET_H);ISP_PROGRAM(0x2c02, SET_L/256);ISP_PROGRAM(0x2c03, SET_L);这几个都是一样的。SET_H、SET_L。这2个是参数。 看意思是 取高位。

求单片机程序分析,先谢谢高手们了!! (最好请详细说明一下执行每一条指令的意思)

34.设片内RAM中(7CH)=50H,执行下列程序后填人执行结果。MOV A, 7CH;把7C单元中的数送到A,也就是把50H这个数送到AMOV RO, A;A中的数再送R0MOV A, #0;A清0MOV @RO, A;A中的0送到R0所指的单元,也就是50H单元INC RO;R0加1,变成51HMOV A, #25H;A=25HMOV @R0, A;A中的数(25H)送到R0指的单元中,就是51H单元中RL A;A中的数循环左移,现在A=4AHMOV 53H, #94H:94H这个数送到53H单元INC RO;R0加1,变为52HMOV @RO, A;A中的数送到52H单元A=____4AH________ ,R0=___52H_______ ,(50H)=____00H_____________(51H)=______25H_________,(52H)=_____4AH___________,(53H)=____94H________。

求单片机相关程序解析(1/3)

#include "reg52.h"//声明调用了reg52.h单片机特征库#include"18b20.h"//声明调用了18b20.h自定义头文件#include "intrins.h" //声明调用了intrins.h函数库sbit io_LCD12864_RS = P1^5 ;//将单片机的P1.5口用io_LCD12864_RS来关联,以后对io_LCD12864_RS的操作就是对p1.5口的操作sbit io_LCD12864_RW = P1^4 ;//原理同上sbit io_LCD12864_EN = P1^3 ;//原理同上#define io_LCD12864_DATAPORT P0 //将单片机的P0口用io_LCD12864来关联,以后对io_LCD12864的操作就是对整个P0口的操作(8bit)#define SET_DATA io_LCD12864_RS = 1 ;//这是#define带赋值的用法,用SET_DATA来代表对io_LCD12864_RS赋1的操作,以后程序中一出现SET_DATA,则io_LCD12864_RS对应的P1.5口就被写1#define SET_INC io_LCD12864_RS = 0 ;//原理同上#define SET_READ io_LCD12864_RW = 1 ;//原理同上#define SET_WRITE io_LCD12864_RW = 0 ;//原理同上#define SET_EN io_LCD12864_EN = 1 ;//原理同上#define CLR_EN io_LCD12864_EN = 0 ;//原理同上unsigned char code table={"0123456789"};//在程序代码区定义了一个数组table内容是一个字符串0123456789/******************************* 忙检测函数检查12864是否将之前对其写入的指令处理完毕*********************************/void v_Lcd12864CheckBusy_f( void ) //{ unsigned int nTimeOut = 0 ;//定义一个整形的循环次数累加变量 SET_INC //io_LCD12864_RS = 0 指向指令寄存器 SET_READ //io_LCD12864_RW = 1 当前操作变为读操作 CLR_EN //io_LCD12864_EN = 0 EN先变低电平 SET_EN //io_LCD12864_EN = 1 上升沿跳变,指令寄存器的数据被读到12864的端口上 while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ; //查看此时数据端口的最高位(忙标志位)是不是为1,若为1说明12864还忙着,则等待nTimeOut加到0时退出循环 //nTimeOut要在这个while里面循环65535次才退出循环,原因是需要累加到溢出其值才会变成0,这样起到延时的作用; //也就是查询忙标志位,如果不忙了就立即退出循环,执行下面的指令,忙的话我给你延时一段时间,你肯定也忙完了,我也退出循环. CLR_EN //EN回到0电平(对液晶不操作的时候EN都应该回到低电平,防止错误数据的出入,加强抗干扰) SET_INC //冗余操作,上面已经执行了SET_INC SET_READ //冗余操作,上面已经执行了SET_READ}/************************************** 发送命令输入变量:byCmd-发给12864的指令代码***************************************/void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令{ v_Lcd12864CheckBusy_f() ;//确认液晶不在忙状态 SET_INC //io_LCD12864_RS = 0 指向指令寄存器 SET_WRITE //io_LCD12864_RW = 0 当前操作变成写操作 CLR_EN //io_LCD12864_EN = 0 EN先变低电平 io_LCD12864_DATAPORT = byCmd ;//将指令代码放到液晶端口上 _nop_();//延时等待端口数据稳定 _nop_();//延时等待端口数据稳定 SET_EN //io_LCD12864_EN = 1 上升沿跳变,端口的数据(指令代码)被12864读入到数据寄存器 _nop_();//延时等待12864读完 _nop_();//延时等待12864读完 CLR_EN//EN回到0电平 SET_READ//回到读状态(平时都应该在读状态,防止误写) SET_INC//冗余操作}/************************************** 发送数据输入变量:byData-发给12864的数据代码***************************************/void v_Lcd12864SendData_f( unsigned char byData ) //发送数据{ v_Lcd12864CheckBusy_f() ;//确认液晶不在忙状态 SET_DATA //io_LCD12864_RS = 1 指向液晶的数据寄存器 SET_WRITE //io_LCD12864_RW = 0 当前操作变成写操作 CLR_EN //io_LCD12864_EN = 0 EN先变低电平 io_LCD12864_DATAPORT = byData ;//将数据代码放到液晶端口上 _nop_();//延时等待端口数据稳定 _nop_();//同上 SET_EN//io_LCD12864_EN = 1 上升沿跳变,端口的数据(数据代码)被12864读入到数据寄存器 _nop_();//延时等待12864读完 _nop_();//同上 CLR_EN//EN回到0电平 SET_READ//回到读状态 SET_INC//冗余操作}

单片机程序分析

该程序使用的是串口的工作方式0,在该方式下,串行口本身相当于“并入串出”或“串入并出”的移位寄存器串行移位脉冲从TXD引脚发出,频率是系统时钟的频率的12分频,而八位串行数据b0-b7依次从RXD引脚输出或输入。 该程序就是利用该功能发送八个数。 mov a,#00h mov scon,a-------串口的工作模式设置在0模式 mov ro,#30h-------八个数存放在内部RAM中,从30h开始放 mov r7,#8-------八个数一共发送八次 start:mov a,@r0 mov sbuf,a-------把要发送的数放入SBUF寄存器wait1: jbc ti,loop1 sjmp wait1-------等一个字节数发送完成,通过TI的值,如果为1则发送完成。如果不为1,则一直等待 loop1:inc r0 djnz r7,start ret-------RAM地址加1,发送第二个数,同时次数加1,一直到八个数发送完成 -------另外该程序好像忘了在每次发送完成后把发送完成标志TI清零 -------另外通过该方式串口发送一个二进制的数的间隔频率是系统频率的1/12(对于兼容51系列的)

关于单片机程序解析和单片机程序解释的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。