⑴ 单片机中的程序 每句翻译对应的意思 我是菜鸟 高手帮忙翻译下 万分感谢!!!
LINE EQU 30H //相当于宏定义 LINE=30H
ROW EQU 31H //ROW=31H
VAL EQU 32H //VAL=32H
ORG 00H //程序入口地址
SJMP START //跳到START处
ORG 0BH //定义定时器0的中断地址入口
LJMP INT_T0 //跳到定时器0的服务程序入口INT_T0处
START: MOV P0,#00H //START标号程序的入口处,P0=0;
MOV TMOD,#01H //TMOD=01H,定义定时器0的工作方式为1
LSCAN: MOV P3,#0F0H //LSCAN标号程序的入口处,P0=0F0H
L1: JNB P3.0,L2 //L1标号程序的入口处,如果P3=0,则跳到L2标号处
LCALL DELAY //调用DELAY函数
JNB P3.0,L2 //如果P3=0,则跳到L2标号处
MOV LINE,#00H //将LINE指向的地址清零,在这里即将地址30H处的内存清零
LJMP RSCAN //长无条件跳转到RSCAN
L2: JNB P3.1,L3 //L2标号程序的入口处, 如果P3.1=0,则跳到L3标号处
LCALL DELAY //长调用函数DELAY
JNB P3.1,L3 //如果P3.1=0,则跳到L3标号处
MOV LINE,#01H //将LINE指向的地址的内存赋值为1,在这里即将地址30H处的内存赋值为1
LJMP RSCAN //长无条件跳转到RSCAN
L3: JNB P3.2,L4 //L3程序标号入口处,如果P3.2=0,则跳到标号L4处
LCALL DELAY //长调用函数DELAY
JNB P3.2,L4 //如果P3.2=0,则跳到标号L4处
MOV LINE,#02H //将LINE指向的地址的内存赋值为2,在这里即将地址30H处的内存赋值为2
LJMP RSCAN //长无条件跳转到RSCAN标号处
L4: JNB P3.3,L1 //L4标号程序入口处,如果P3.3=0,则跳到L1标号处
LCALL DELAY //长高用函数DELAY
JNB P3.3,L1 //如果P3.3=0,则跳到L1标号处
MOV LINE,#03H //将LINE指向的地址的内存赋值为3,在这里即将地址30H处的内存赋值为3
RSCAN: MOV P3,#0FH //RSCAN程序标号入口处,P3=0FH
C1: JNB P3.4,C2 //C1程序标号入口处,如果P3.4=0,则跳到C2标号处
MOV ROW,#00H //将ROW指向的地址的内存赋值为0,在这里即将地址31处的内存赋值为0
LJMP CALCU //长无条件跳到CALCU标号处
C2: JNB P3.5,C3 //C2程序标号入口处,如果P3.5=0,则跳到C3标号处
MOV ROW,#01H //将ROW指向的地址的内存赋值为1,在这里即将地址31处的内存赋值为1
LJMP CALCU //长无条件跳到CALCU处
C3: JNB P3.6,C4 //C3程序标号入口处,如果P3.6=0,则跳到C4标号处
MOV ROW,#02H //将ROW指向的地址的内存赋值为2,在这里即将地址31处的内存赋值为2
LJMP CALCU //长无条件跳到CALCU处
C4: JNB P3.7,C1//C4程序标号入口处,如果P3.7=0,则跳到C1标号处
MOV ROW,#03H //将ROW指向的地址的内存赋值为3,在这里即将地址31处的内存赋值为3
CALCU: MOV A,LINE//CALCU程序标号入口处,A=LINE,在此,即A=30H,A指向地址30H处
MOV B,#04H //B=04H
MUL AB //A中的内容与B中的内容相乘
ADD A,ROW //A=A的内容+ROW中的内容
MOV VAL,A //并A中的内容放到VAL所指向的地址内存处,在此VAL为32H
MOV DPTR,#TABLE2 //将TABLE2的地址存到DPTR里
MOV B,#2 //B=2
MUL AB //A中的内容与B中的内容相乘
MOV R1,A //将A中的内容存到R1里
MOVC A,@A+DPTR //将A+DPTR的内容存到A中,在此表示取表值
MOV TH0,A //将A中的内容给定时器0的高位赋初值
INC R1 //R1自身加1
MOV A,R1 //将R1 的值赋给A
MOVC A,@A+DPTR //将A+DPTR的内容存到A中,在此表示取表值
MOV TL0,A //将A中的内容给定时器0的低位赋初值
MOV IE,#82H //设置中断允许寄存器,在此,表示开总中断EA,开定时器允许中断ET0
SETB TR0 //将T0置1,在此表示启动定时器T0
MOV A,VAL //将VAL的地址赋值给A
MOV DPTR,#TABLE1 //将TABLE1的地址存到DPTR里
MOVC A,@A+DPTR//将A+DPTR的内容存到A中,在此表示取表值
MOV P0,A //P0=A
W0: MOV A,P3 //W0程序标号入口处,将P3赋值给A
CJNE A,#0FH,W1//如果A不等于0FH,则跳到W1标号处
MOV P0,#00H //将P0赋值为0
CLR TR0 //将TR0清零,在此表示关闭定时器T0
LJMP LSCAN //长无条件跳到LSCAN标号处
W1: MOV A,P3 //W1程序标号入口处,将P3赋值给A
CJNE A,#0F0H,W2//如果A不等于0FH,则跳到W2标号处
MOV P0,#00H //将P0赋值为0
CLR TR0 //将TR0清零,在此表示关闭定时器T0
W2: SJMP W0 //W2程序标号入口处,短无条件跳到W0标号处
INT_T0: MOV DPTR,#TABLE2 //定时器0中断的服务程序入口处,将TABLE2的地址存到DPTR里
MOV A,VAL //将VAL存到A中,在此VAL =32H
MOV B,#2 //将B赋值为2
MUL AB //A中的内容与B中的内容相乘
MOV R1,A //将A中的内容存放到R1中
MOVC A,@A+DPTR //将A+DPTR的内容存到A中,在此表示取表值
MOV TH0,A //将A中的内容存到TH0中,作为定时器T0的高位初值
INC R1 //R1自身加1
MOV A,R1 //将R1中的内容存放到A中
MOVC A,@A+DPTR //将A+DPTR的内容存到A中,在此表示取表值
MOV TL0,A//将A中的内容存到TH0中,作为定时器T0的低位初值
CPL P1.0 //将P1.0取反
RETI //中断子函数返回标号
DELAY: MOV R6,#10 //DELAY函数入口处,R6=10
D1: MOV R7,#250 //D1程序标号入口处,R7=250
DJNZ R7,$ //R7自减1,一直在此循环到为0
DJNZ R6,D1 //R6自减1,如果不为0,则跳到D1标号处
RET 子函数返回标号
TABLE1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H //TABLE1地址处往下的地址中所放的数据
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE2: DW 64021,64103,64260,64400 //TABLE2地址处往下的地址中所放的数据
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
希望这有用
⑵ 请问单片机程序中的这些符号是什么意思
你说的是AVR单片机。
PORTA = 0x00;---定义PA口为0x00,及PA口上的所有管脚输出为低电平,同样道理,如果些微PORTA=0xFF,则都输入高电平,0xFF及二进制的11111111,如果想让某一位输出高,其他为低,如00000001,则是PA0输出为高电平,PA1——PA7输出为低电平。(说明:每个口线与单片机实际引脚的对应关系请参看技术手册。)
DDRA = 0xFF;----定义引脚的输出输入模式,1为输出,0为输入。当使用输出模式及设置为1时,PORTA的值将影响内部上拉电阻的使用,如果PORTA对应管脚的值为1,则使用内部上拉电阻,否则不采用。 除了这里说的“=”之外,管脚的控制还有其他算符,|= ,&=! ,^=,==。
以下B,C,D端口同理。
⑶ freescale单片机中有个AD转换序列长度的设置,请问一下这是指什么啊
如果你是单通道转换的话,队列长度就是转换多少次产生一次中断。如果是多通道,则是转换的通道数。
关于AD,一直有人问一些东西,应该是属于AD比较深的东西,答应总结一个贴子.
大部分来自中电网陈刚版主的精典问答,如果要用加速度传感器,请看完下面的,如果想用好多路AD转换请看完下面的.
一般小车可能不需要,因为一般用的是单次转换单通道无FIFO模式.
1为什么要多次转换?
ATD模块有8个结果寄存器,所以它的AD转换有这样的功能,就是对一个或多个通道连续进行转换,将结果顺序放入这8个结果寄存器中。这样用户如果要取一个通道的平均值,或取多个通道的值,都很方便了,就不用软件一次一次地去转换了
2 ATDCTL3 那个S8C、S4C、S2C、S1C决定的转换序列长度是什么意思?
ATDCTL3中的S8C~S1C决定了一个转换序列的长度,即一个转换序列共转换多少次。你可以选择做一次AD转换的过程,是对一个通道连续转换多次,还是对多个通道连续进行转换,这由ATDCLT5的MULT位决定。
3 如果选择了多通道,MULT=1,那么CC、CB、CA、只是控制第一个转换的通道那么我就没有找到该如何制定具体由哪几个通道转换的控制字。。。比如光要0、1、3三个通道转换。。。难道本身转换就是8个通道全部转一遍的?
S8C~S1C就控制每轮进行多少次转换,最多为8。比如可以选择为6,那么每6次转换称为一个序列。如果选择了多通道转换,那么CC、CB和CA选择首个转换的通道,后面的通道按通道号排列。比如S8C~S1C选择转换数为6,MULT设为1,而CC、CB和CA选择通道4,那么转换开始后,AD模块将按通道4、通道5、通道6、通道7、通道0、通道1的顺序依次进行转换,并将转换结果依次放入6个结果寄存器中。要注意并不能间隔选择通道。
4 在HC12系列单片机中,当控制寄存器5中设置转换序列长度为4,MULT=0(即单通道转换)时,是在一个转换序列中对一个通道连续转换四次;而在S12系列中,当转换序列长度设置为1,MULT=0时,每进行一个序列的转换是对该通道转换一次,还是转换四次?
在S12系列中,当转换序列长度设置为1(S8C:S1C=0001),MULT=0时,只对一个通道进行一次转换。
5 关于控制寄存器ATD0CTL3中FIFO的使用
假定要转换的序列为3,即通道3、4、5,转换模式为连续转换(SCAN=1)
(1)当FIFO=0时,转换结果是存储在ATD0DR0-ATD0DR2中,还是存储在ATD0DR3-ATD0DR5中?
当一个序列转换结束后,下一个转换序列的结果还是存储在这几个对应寄存器中,对吗?
(2)当FIFO=1时,转换结果是存储在ATD0DR0-ATD0DR2中,还是存储在ATD0DR3-ATD0DR5中?
当一个序列转换结束后,下一个转换序列的结果是存储在紧接其后的几个对应寄存器中,循环存储(即存储到ATD0DR7后,返回ATD0DR0,在从ATD0DR0-ATD0DR7存储),对吗?
假定要转换的序列为3,即通道3、4、5,转换模式为连续转换(SCAN=1)
(1)当FIFO=0时,转换结果是存储在ATD0DR0-ATD0DR2中;当一个序列转换结束后,下一个转换序列的结果还是存储在这几个对应寄存器中。
(2)当FIFO=1时,第一次转换结果存储在ATD0DR0-ATD0DR2中;当一个序列转换结束后,下一个转换序列的结果是存储在紧接其后的几个对应寄存器中,循环存储(即存储到ATD0DR7后,返回ATD0DR0,再从ATD0DR0-ATD0DR7存储)。总之:FIFO=1时,第一个转换的结果保存在结果寄存器0中,而第一个转换的通道由CC CB CA决定,之后就按结果寄存器顺序递增存放,一直存放到结果寄存器7,然后再从0开始。而当前是哪个通道完成了转换,可由CCFx标志来查询;结果存入哪个寄存器,可由CC2 CC1 CC0来查询。
6 通道转换是不是通过设置这二个寄存器,ATDCTRL3中转换序列的长度来采集设置需要的通道数.还有ATDCTRL5中的MULT来设置启动多通道转换?
是的,ATDCTRL5设置成多通道转换后,ATDCTRL3设置采集的通道数,此外ATDCTRL5中还需要设置多通道采集的起始通道。比如采集7个通道,起始通道是1,那么就采集从1-7通道,如果起始通道是2,就采集2-7,还有0通道。
7 多通道转换应该是同时进行的吧?各个通道的转换结果分别放在哪个数据寄存器(这一点我非常困惑)?
多通道转换也不是同时的,可以看AD的系统框图,只有一个采样保持电路,前面通过8通道选择器来选择通道,所以不能同时,只是多通道一次采集过程可以连续连续采集多个通道。每个通道的结果都保存在各自的结果寄存器reslut registers中
8 MC9SDg128上面有16个AD通道,而寄存器上好像只能启动8个通道吧?另外8个通道该如何使用?
DG128是两个8通道的AD,看dg128的数据手册总的memory map,AD0的寄存器在基址的$0080-$009F 32个字节的地方, AD1的寄存器在基址的$0120-$013F 32个字节的地方。