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,新手,求讲解一个简单的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)