单片机程序问题解读!

单片机程序问题解读!,第1张

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);

}

}

}

以上就是关于单片机程序问题解读!全部的内容,包括:单片机程序问题解读!、请帮解释一下单片机程序各步骤、求单片机高手给我详细解释这个程序 越详细越好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9266780.html

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

发表评论

登录后才能评论

评论列表(0条)

保存