testb=dat&0x01; 这个是什么意思? dat 和0X01进行与运算,也就是清掉DAT上的高七位,保留最后一位。
dat=dat>>1; 这个是什么意思? DAT右移一位
if(testb) //写1这个是什么意思? 如果TESTB为非0,执行IF语句;
ds=1;i++;i++;这个是什么意思?为什么有两个i++ i++是I=I+1,两个相当于i=i+2;
dat=(j<<7)|(dat>>1);这个是什么意思?j左移7位, dat右移一位,然后相与,你的程序好长,而且不完整,没细看J DAT是什么数据,还不知道为何要移位相与,估计这程序的结果是大于8位的。
a=tempread();
b=tempread();
temp=b;
temp<<=8;这个是什么意思?
temp=temp|a;这个是什么意思?
a为读取的低8位
b为高8位
后面两名是把高低8位拼成一个16位数
好长的程序,好长的注释,终于注完了
POP DPH ;从堆栈中d出一个8位二进制数到DPH中,
POP DPL ;从堆栈中d出一个8位二进制数到DPL中
MOV DPTR,#4000H ;给DPTR赋值#4000h
RL A ; 累加器A的内容左移一位
MOV B,A ; 把累加器 A的内容送到寄存器B中
MOVC A,@A+DPTR ;把DPTR的内容加A的内容作为地址,兼址寻址该地址中的内容送A
带进位位
PUSH Acc ;压堆栈,把A的内容推入堆栈
MOV A,B 把B的内容送到A中
INC A ;A的内容累加1
MOVC A,@A+DPTR ;把DPTR的内容加A的内容作为地址,兼址寻址该地址中的内容送A
带进位位
PUSH Acc ;压堆栈,把A的内容推入堆栈
RET ;中断子程序结束
ORG 4000H ; 伪指令 段地址开始位置为:4000H
DB 10H,80H,30H,50H,30H,50H ;数据段 连续存6个16进制数。
--------------
大致就是这样,你再查查指令系统的具体含义,可以更准确地解释其含义,我已经有10年没编写这些程序代码了,所以有可能记忆不是太准确。
#include"reg51h"
#define uint unsigned int
#define uchar unsigned char
uchar PWM=0x7f;//设置初始脉宽调制值为128
sbit ENA=P3^4;//电机启动控制位
void INTT0()interrupt 0//外部中断0中断处理函数,低电平触发,实现对脉宽PWM的增加
{
if(PWM<=255)
{
PWM++;
}
else
PWM=0xff;
}
void INTT1()interrupt 2//外部中断0中断处理函数,低电平触发,实现对脉宽PWM的减少
{
if(PWM>0)
{
PWM--;
}
else
PWM=0x00;
}
void timer0()interrupt 1//定时器0中断处理函数
{
TR1=0;
TH0=0xfe;//重装定时器0初值
TL0=0x66;
TH1=PWM;//重装定时器1初值
TR1=1;//启动定时器1
ENA=0;//启动电机
}
void timer1()interrupt 3//定时器1中断处理函数
{
TR1=0;
ENA=1;
}
void INT_init(void)
{
TMOD=0x21;//定时器1工作于模式2(自动重装方式),定时器0工作于模式1(16位定时)
TH0=0xfc;//设置定时器0,定时初值,12MHz约定时900多us
TL0=0x66;
TH1=PWM;//设置定时器1,定时初值,12MHz约定时128us
TL1=0;
EA=1;//总中断允许
EX0=1;//允许外部中断0
EX1=1;//允许外部中断1
ET0=1;//允许定时器0中断
ET1=1;//允许定时器1中断
TR0=1;//启动定时器0
}
void main(void)
{
INT_init();
while(1);
}
#include <reg52h> //包含51单片机头文件
//共阳极数码管0-9数组编码
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管位选数组编码,这里有8位数码管(既8个数码管)
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//下面是变量申明
unsigned char mode=0;
unsigned int temp;
float dianya;
unsigned int dianya1;
//下面是51单片机端口位申明
sbit START=P1^5;
sbit EOC=P1^6;
sbit OE=P1^7;
sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;
sbit key=P1^3;
//一个延时函数
void delay(unsigned int z)
{
while(z--);
}
//按键扫描函数
void key_scan()
{
if(key==0) //当key按下时,key既端口P1^3
{
delay(10); //延时
if(key==0) //在检测端口P1^3是否为低
{
/
到这里你发现你程序有问题
/
}
}
switch (mode) //这里也有问题,如果mode只为0,变量a b c清0,可以用if语句
{
case 0 : a=0;b=0;c=0;break;
}
}
void main() //主函数
{
unsigned char aa[4],i;
while(1)
{
key_scan();
P2=wei[0]; // 选中第一个数码管
P0=seg[mode]; //第一个数码管显示存在变量mode里的数
/
下面部分应该为从AD检测一个电压
/
START=1; //P1^5 置1
delay(10); //延时
START=0; //P1^5 置0
while(EOC==0); //如果P1^6为0,一直循环等待
OE=1; //P1^7置1
temp=P3; //把P3端口上8位数赋值给变量temp
dianya=(50/255)temp; //8位AD值转换成电压显示值
dianya1=dianya10;
aa[2]=dianya1/10; //把转换后的值除10
aa[3]=dianya1%10; //把转换后的值求模
for(i=2;i<4;i++)
{
P2=wei[i]; //数码管2,3分别位选
if(i==2)
P0=seg[aa[i]]&0x7f; //显示转换后的电压值aa[2]并加上点 (除10的值)
else P0=seg[aa[i]]; //显标转换后的电压值aa[3](求模值)
delay(1);
}
}
}
以上就是关于单片机程序问题解读!全部的内容,包括:单片机程序问题解读!、请帮解释一下单片机程序各步骤、求单片机高手给我详细解释这个程序 越详细越好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)