Ⅰ 单片机中的程序 每句翻译对应的意思 我是菜鸟 高手帮忙翻译下 万分感谢!!!
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
希望这有用
Ⅱ 帮翻译单片机C语言程序
#include<reg51.h>//51单片机头文件
#include<stdio.h>//标准输入输出头文件
unsignedcharspeed=5;//定义一个字符变量,并赋值为5
//(想知道5代表什么可以查ASCII码,也可以当数字用)
unsignedcharrec_buf[5];//定义一个可以存5个字符的数组
unsignedcharrec_idx=0;//定义一个字符变量,并赋值为0;
charputchar(charc)//实现一个名为putchar的方法,传入一个字符,返回一个字符
{//{}括起来的是方法体,代表这里面的内容属于这个方法的
ES=0;//ES应该是一个寄存器吧,这里是把里面清0,单片机我懂不多
SBUF=c;//把传入的字符写到SBUF寄存器,
while(TI==0);//当TI寄存器里值非0时继续,这里是一个条件等待
TI=0;//把TI寄存器清0重置
ES=1;//向ES寄存器写入1
return0;//返回0,结束本方法
}
voiddelay100ms(unsignedcharn)//定义一个无返回值的方法,并需要传入一个字符
{//char字符型是可以当成数字来用的
unsignedchari,j;//定义两个字符变量
TMOD=0x20;//把寄存器置为00100000状态
for(j=0;j<n;++j)//作n(n是方法传入的字符)次循环
{//{}里面的东内容都进行n次循环
for(i=0;i<20;i++)//作20次循环,因为他在n次循环内,实际上是n乘以20次
{//外层进行1次,这里就这进行20次
THO=0x63;//把TH0寄存器置为01100011状态
TL0=0x18;//把TLO寄存器置为00010100状态
TRO=1;//把TRO寄存器置为00000001状态
while(!TF0);//当TFO寄存器不为0时继续
TF0=0;//把TFO重置为0
}
}
}
voidinit_com()//一个无返回值,也不需要传入值的方法
{
TMOD=0x20;//TMOD寄存器设为00100000状态
TH1=0xfd;//TH1寄存器设为11111101状态
TL1=0xfd;//TL1寄存器设为11111101状态
SM0=0;//SM0寄存器设为00000000状态
SM1=1;//SM1寄存器设为00000001状态
REN=1;//REN寄存器设为00000001状态
EA=1;//EA寄存器设为00000001状态
TR1=1;//TR1寄存器设为00000001状态
ES=1;//ES寄存器设为00000001状态
}
voidmain()
{
unsignedcharlsd_dat,i,j;//定义四个字符变量
charbuf[15];//定义一个可以存放15个字符的字符数组
i=0;//给变量i赋值为数字0
init_com();//执行上面定义过的init_com()方法;
while(1)//一个死循环,不断的执行后面{}里的代码
{
delay100ms(speed);//执行前面定义过的voiddelay100ms(unsignedcharn)方法
//首次执行时,speed是开始时定义的5
lsd_dat=0x01<<i;//变量lsd_dat赋值为1,也就是二进制的00000001
P1=lsd_dat;//把P1寄存器置为lsd_dat的值的二进制状态
buf[0]='D';//把buf字符数组的首个值赋值为字符D,ascii码为68
//等同于十进制数字68,二进制01001000
for(j=0;j<8;++j)//进行8次循环,每次循环j的值加1
buf[j+1]='0'+((lsd_dat&(0x01<<j))?1:0);//这段有点麻烦
//给buf数组的第j+1个存储单元赋值,这个值是不确定的
//如果(lsd_dat&(0x01<<j))的运算结果不是0
//那么他就等于‘O'+1,否则就等于‘0’+0;
//这里,我不知道‘0’是字母o的大写,还是数字0,应该是数字0
//下面说(lsd_dat&(0x01<<j))的运算
//lsd_dat就是上面定义的变量,他第一次执行时的值是00000001
//他会不会变取决与以后的代码有没有改变他
//(0x01<<j)这个作用是,把00000001向左移动j个位,右边补0
//比如说j的值是2,就是左移两位,那么(0x01<<j)的值就是00000100
//j是每次循环都在变,所以这个值也在变
//现在我们就当j的值运行到等于2的时候来看(lsd_dat&(0x01<<j))
//可以看成(0x01&0x04)这是一个与运算,结果看下面
//0x0100000001
//0x0400000100
//&00000000结果就是0
//j=2的话,((lsd_dat&(0x01<<j))?1:0)=0;
//'0'是数字的话,值是十进制48,
//'0'+((lsd_dat&(0x01<<j))?1:0)=48,还是字符‘0’
//也就是说((lsd_dat&(0x01<<j))?1:0)的值,不是0,就是1
//那么,'0'+((lsd_dat&(0x01<<j))?1:0)他的值
//不是48,就是49,也就是字符面的'0'或者‘1’,
buf[9]=' ';//buf字符数组的第10个存储空间赋值为换行符‘ ’
buf[10]=' ';//buf字符数组的第11个存储空间赋值为换行符‘ ’
buf[11]=0;//buf字符数组的第10个存储空间赋值为0
printf(buf);//输出字符数组
++i;//i的值自增1
if(i>=8)//如果i大于或者等于8
i=0;//把i重置为0
}
}
voides()interrupt4//定义一个给51单片机发送数据的方法
{
unsignedchardat;//定义一个字符变量
if(RI)//如果RI寄存器非空,执行后面{}里面的内容
{
RI=0;//把RI寄存器清空
dat=SBUF;//把SBUF寄存器的值赋给dat变量
SBUF=dat;//再把SBUF寄存器设置成dat变量表示的内容
while(TI==0);//等待到TI寄存器非空的时候继续下面的代码
TI=0;//把TI寄存器重置清空(时间有限,简单说了)
if(dat=='L'//如果dat变量的值等与字符‘L’,执行后面{}内的代码
{
rec_idx=0;//把rec_idx变量赋值为0(此处不是字符‘0’,而是内码);
rec_buf[rec_idx++]=dat;//给数组rec_buf[0]赋值为dat变量的值,
//并且rec_idx的值自增1
}
elseif(rec_idx>0)//如果上面那个条件不成立,并且rec_idx大于0,
//则执行后面{}里的内容
{
rec_buf[rec_idx++]=dat;//给数组rec_buf的第rec_idx个赋值为dat变量的值,
//并且rec_idx的值自增1
if(dat>'0'&&dat<='9')//如果dat大于‘0’(48)并且小于等于‘9’(57)
//则执行下条代码,否则跳过下行代码
speed=10-(dat-'0');//给变量speed赋值为10-(dat-48)
rec_idx=0;//给变量rec_idx赋值为0
}
}
}
看在这么精细,字又多的份上,分给我吧,虽然,我也是半瓶水,应该这些是没错的。现在时间都0:58了
Ⅲ 请教单片机代码,
#include
#define uchar unsigned char
uchar dis,led,cnt=0,run=0;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt>=10)
{
cnt=0;
P0=_crol_(P0,1);
run++;
run%=8;
if(run==0 && dis>0)dis--;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
P0=table[dis];
if(key==0)
{
while(key==0);
dis++;
}
}
}