一个简单的单片机程序,帮忙注释几行。我是初学者,谢谢!

一个简单的单片机程序,帮忙注释几行。我是初学者,谢谢!,第1张

sbit beep=P2^3; //由单片机的 P23 脚输出 beep 信号,应该是驱动蜂鸣器吧。

for(num=0;num<8;num++)

{

P1=temp;

beep=0; //这个 beep=0 和下面 beep=1 形成了一个以 2delay(100) 为周期的脉冲信号。

//又由于 sbit beep=P2^3 所以,由单片机的 P23 脚输出这个脉冲信号。

delay(100);

temp=_crol_(temp,1); // temp Bit 左移一位,看看上面 P1=temp,

//当这个循环下一次进入时,P1 的值就左移一位,

//如果 P1 接了 LED,就会有流水灯效果。

P1=0xff;

beep=1;

delay(100);

}

#include

//调出头文件,必须写

unsigned

cont=0;

//初始化程序void

main(void)

//主程序{

WDTCTL

=

WDT_ADLY_250;

//基本时钟驱动看门狗定时器(WDT)250ms中断

IE1

|=

WDTIE;

//使能

WDT

中断

FLL_CTL0

|=

XCAP14PF;

//

设置时钟电容

P1DIR

|=

0xe0;

//

设置P15,

P16,P17为输出端口

_EINT();

//

使能单片机中断,初始化结束

for

(;;)

//主循环程序

{

_BIS_SR(LPM3_bits);

//

进入低功耗模式3(LPM3)

_NOP();

//

空 *** 作,为开发软件设断点用

}}

interrupt[WDT_VECTOR]

void

watchdog_timer(void)

//WDT中断入口{cont=cont+1;

if(cont==20)

{P1DIR=0x80;}

if(cont==40)

{P1DIR=0x40;}

if(cont==60)

{P1DIR=0x20;}

if(cont==61)

{cont=1;}

_NOP();

//

空 *** 作,为开发软件设断点用}

;可以修改为以下状态

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV P2,#0

LOOP:

MOV R2,#6

MOV A,#01H

LOOP1:

MOV P2,A

LCALL DELAY

DJNZ R2,LOOP1

SJMP LOOP

DELAY:

MOV R7,#0

DLY:

MOV R6,#0

DJNZ R6,$

DJNZ R7,DLY

RET

END(1)修改的程序就只用了P2口,其余未处理,原程序用其余口,应该有其他条件

(2)一次置0就可以了,从程序看是高有效。

(3)main中的lcall delay只是延时约130毫秒左右

(4)如果要控制灯亮的间隔,一是改变lcall delay指令的数目 二是改变delay 中的r7或R6的值

(5)改变间隔时间最好的方法是加传递参数,延时程序稍加修改就可以。

(6)tt这只是一个标号,含与延时函数中

(7)delay延迟的时间的计算按指令执行周期和循环次数就可以计算了

(8)p2口有8个引脚,而实验单片机电路板只有6个灯,所以上面程序稍稍做了修改。

汇编代码:

org 00h

mov (20h),#5

loop1:mov (21h),#0ffh

loop: mov (22h),#0ffh

djnz (22h),$

djnz (21h),loop

djnz (20h),loop1

c代码:

#include "reg51h"

main()

{int i=0;

for(i=0;i<1000;i++);

}

精确延时,建议用汇编,要求不是很高就用c,方便嘛!由于不知道你的振荡频率是多少,没法达到要求,可以自己稍加改动(改改数字就行)。

先来个汇编的程序,P1接一个共阳极数码管,P0低4位接4个抢答按键,主持人复位采用单片机复位按钮实现。

ORG 0000H

START: MOV A,P0

ORL A,#0F0H

CJNE A,#0FFH,PL0

SJMP START

PL0: LCALL DELAY

MOV A,P0

ORL A,#0F0H

CJNE A,#0FFH,PL1

SJMP START

PL1: JNB ACC0,K1

JNB ACC1,K2

JNB ACC2,K3

JNB ACC3,K4

LJMP START

K1: MOV P1,#0F9H

SJMP $

K2: MOV P1,#0A4H

SJMP $

K3: MOV P1,#0B0H

SJMP $

K4: MOV P1,#99H

SJMP $

DELAY: MOV R6,#15

DEL2: MOV R7,#200

DJNZ R7,$

DJNZ R6,DEL2

RET

END

确实是初学呀,P0,P1,P2都有8个IO口,所以暂且给你都安排在第一个口吧。

#include<reg51h>

#define uchar unsigned char

sbit key=P0^0;

sbit pluse1=P1^0;

sbit pluse2=P2^0;

void delay(int ms)

{

uchar i ;

while(ms--)for(i=0;i<120;i++);

}

main()

{

uchar num;

while(1)

{

if(key==0)

{

delay(10);

if(key==0)

{

while(key==0);

num++;

num%=2;

if(num==1)

{

pluse1=0;

delay(500);

pluse1=1;

}

else

{

pluse2=0;

delay(500);

pluse2=1;

}

}

}

}

}

让我想想

我修改了一下,把R2的赋值循环一次变小1(变少多少按你需要自己定咯,想变化快点就对这部分修改,当然,不可以用djnz咯),标星号部分是我改的 ,不懂可以HI我

ZWMADDR EQU 8002H

ZXMADDR EQU 8004H

ORG 0000H

ST: LJMP total;

ORG 0100H

total:;

MOV R2,#25H ;

MAIN: MOV R3,#01H

MOV R4,#00H

LOOP: MOV DPTR,#CHAR

MOV A,R4

MOVC A,@A+DPTR

MOV DPTR,#ZXMADDR

MOVX @DPTR,A

MOV A,R3

MOV DPTR,#ZWMADDR

MOVX @DPTR,A

djnz r2,exit;

LCALL DELAY

MOV A,R3

RL A

MOV R3,A

CJNE R3,#40H,NEXT

MOV R3,#01H

NEXT: INC R4

CJNE R4,#10H,LOOP

SJMP MAIN

exit:;

sjmp $ ;

DELAY: PUSH 02H

LP1: PUSH 02H

LP2: PUSH 02H

LP3: DJNZ R2,LP3

POP 02H

DJNZ R2,LP2

POP 02H

DJNZ R2,LP1

POP 02H

DJNZ R2,DELAY

RET

CHAR: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H

DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

END

比如单片机控制物体X从A运动到B,碰到行程开关,之后返回A,碰到A的行程开关,再次从A到B如此反复。

#include<reg51h>

sbit start=P1^0;

sbit stop=P1^1;

sbit limita=P1^4;

sbit limitb=P1^5;

sbit run_z=P1^7;

sbit run_f=P1^6;

main()

{

whilt(1)

{

while(start==1); //等待按启动键

run_z=0;

while(stop==0){ //如果停止键没有按下就一直循环

while(limitb==1); //一直等到运动到B

run_z=1;

run_f=0;

while(limita==1); //一直等到运动到A

run_f=1;

run_z=0;

}

}

以上就是关于一个简单的单片机程序,帮忙注释几行。我是初学者,谢谢!全部的内容,包括:一个简单的单片机程序,帮忙注释几行。我是初学者,谢谢!、单片机的程序怎么编写、单片机80c51,新手,求讲解一个简单的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存