单片机程序解释

单片机程序解释,第1张

CNTA EQU 30H 8x8 LED阵列行选通顺序计数器,有效值范围0~7

COUNT EQU 31H 8x8 LED阵列顺序显示计数器,有效值范围0~2

ORG 00H

LJMP START 跳转到30H开始的主程序主体,避开中断入口地址

ORG 0BH

LJMP T0X 跳转到定时中断0中断服务程序

ORG 30H

START: MOV CNTA,#00H 主程序开始

MOV COUNT,#00H 3个8X8 LED点阵送显示计数

MOV TMOD,#01H 定时器0设定为定时方式,方式1,16位模式

MOV TH0,#(65536-1000) / 256 1ms定时中断预装值高8位

MOV TL0,#(65536-1000) MOD 256 1ms定时中断预装值高8位

SETB TR0 启动定时器0

SETB ET0 允许定时器0中断

SETB EA 开启总中断允许

WT: JB P2.0,WT 读P2.0端口状态,高电平则原地循环等待其变为低电平

MOV R6,#5P2.0为低电平,则开始延时滤波循环

MOV R7,#248

D1: DJNZ R7,$

DJNZ R6,D1

JB P2.0,WT 再次确认P2.0是否低电平,不是则认为端口干扰,回到WT继续等待

INC COUNT LED阵列计数+1,显示下一个LED阵列

MOV A,COUNT

CJNE A,#03H,NEXT LED阵列计数未到3,跳转到NEXT

MOV COUNT,#00H LED阵列计数则清零,跳回WT从第一个开始扫描

NEXT: JNB P2.0,$ 原地循环,等待P2.0恢复高电平

SJMP WT P2.0恢复高电平,返回WT,等待下一次动作

T0X: NOP

MOV TH0,#(65536-1000) / 256 重装定时计数寄存器

MOV TL0,#(65536-1000) MOD 256

MOV DPTR,#TAB 设定选通端口查表起始地址

MOV A,CNTA得到LED显示行计数值,该计数为1-8,到8时清零重新开始

MOVC A,@A+DPTR 查表得到行选通端口状态字符

MOV P3,A将选通信号送到P3口,低电平的端口指向的LED阵列被选通

MOV DPTR,#GRAPH 设定显示信息查表起始地址

MOV A,COUNT 根据计数器,确定当前显示的是1、2、3中的哪个阵列

MOV B,#8

MUL AB 8X8阵列,所以一个阵列显示信息需要8个字节,

ADD A,CNTA 指向待显示行的点阵信息

MOVC A,@A+DPTR 读取

MOV P1,A 该行8列的显示信息送P1口

INC CNTA 计数器+1指向下一行

MOV A,CNTA

CJNE A,#8,NEX 判断是否已到第8行,未到则直接退出中断

MOV CNTA,#00H 已到,计数清零,下次从第一行开始扫描

NEX: RETI

TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH LED阵列行选通端口控制状态值

GRAPH: DB 12H,14H,3CH,48H,3CH,14H,12H,00H 第1个LED阵列的点阵信息

DB 00H,00H,38H,44H,44H,44H,38H,00H 第2个LED阵列的点阵信息

DB 30H,48H,44H,22H,44H,48H,30H,00H 第3个LED阵列的点阵信息

END

要将PLC代码解析到单片机中,需要经过以下几个步骤:

了解PLC的编程语言:PLC的编程语言通常有Ladder Diagram(梯形图)、Function Block Diagram(功能块图)、Structured Text(结构化文本)等。需要了解PLC编程语言的语法和功能,以便进行代码解析。

了解单片机的编程语言:单片机通常使用C、C++、Assembly等编程语言。需要了解单片机编程语言的语法和功能,以便将PLC代码转化为单片机代码。

逐行解析PLC代码:将PLC代码逐行解析,分析其功能和逻辑,并将其转化为单片机代码。需要注意的是,PLC和单片机的硬件和软件环境不同,需要根据实际情况进行适当的转化和调整。

编写单片机程序:根据解析出的PLC代码,编写单片机程序,并进行调试和优化。需要注意的是,单片机的处理能力和存储容量有限,需要对程序进行精简和优化,以保证程序的稳定性和可靠性。

总之,将PLC代码解析到单片机中需要经过一定的技术和经验积累,需要了解PLC编程语言和单片机编程语言的语法和功能,并进行逐行解析和转化。

uint8_t *ptr uint8_t len 这是传入参数。 len可能是长度,ptr可能指向的是一个数组

^= 按位异或后赋值。

crc ^= *ptr++//首先将数组第一位异或后复制给Crc。之后ptr再向前一步,简单理解就是指向数组的下一位。

for(i = 0i <8i++){if(crc &0x01)crc = (crc >>1) ^ 0x8C elsecrc >>= 1 }

//将取到数组第一位值,与0x01上。如果非零,crc就需要右移一位,再与0x8C异或。否则右移1位。每位数组值要做8次。

while(len--) //表示要判断数组内len个值。或则说是取得数组内len长度的元素个数。

return crc//len个数组值都作完以后,将Crc返回。

我想你需要了解一下 0x01的意义,0x8C的意义。

0x01 = 0000 0001

0x8c = 1000 1100

没看到啊,已经有人答完了。哎,早知道就不写这么多字了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7782543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存