
C语言实现LED灯闪烁控制配套51单片机开发板。
#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void) //两个void意思分别为无需返回值,没有参数传递。
{
unsigned int i //定义无符号整数,最大取值范围65535。
for(i=0i<20000i++) //做20000次空循环。
//什么也不做,等待一拿乱个机器周期。
}
/*******************************************************
函数功能:主函数 (C语言规定必须有也只能有1个主函数)。
********************************************************/
void main(void)
{
while(1) //无限循环。
{
P0=0xfe //P1=1111 1110B, P0.0输出低电平。
delay() //延时一段时间。
P0=0xff //P1=1111 1111B, P0.0输出高电平。
delay() //延时一段时间。
}
}
单片机驱动LED灯的源程序:
#include<reg52.h>//头文件。
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^7//位定义。
void delay_ms(uint)//mS级带参数延时函数。
void main()
{
while(1)
{
LED1=0
delay_ms(1000)
LED1=1
delay_ms(1000)
}
}
void delay_ms(uint z) //延时子程序
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
扩展资料:
单片机应用分类:
通用型:
这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
总线型:
这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接。
另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装亮敏扒成本和芯片体积,这类单片机称为非总线型单片机。
控制型:
这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型。
通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
参考资料来源敬昌:百度百科-单片机
ORG 0
CALL PRG1 亮且发音
CALL PRG2 灭且静音
SJMP 0
-----------------
PRG1:
MOV P0, #0 8个led灯亮
MOV R2, #200
LP1:
CPL P1.0 蜂鸣器响
DJNZ R6, $
DJNZ R7, $ - 2
DJNZ R2, LP1
MOV P0, #255 8个led灯灭
RET
-----------------
PRG2:
MOV P0, #255 8个led灯不亮
MOV R2, #200
LP2:
SETB P1.0 蜂鸣器不响
DJNZ R6, $
DJNZ R7, $ - 2
DJNZ R2, LP2
MOV P0, #255 8个led灯灭
RET
---------数饥手塌--薯薯返------
END
开关控制指示灯显示MY8255_AEQU 0A860H;8255A口地址
MY8255_BEQU 0A861H;8255B口地址
MY8255_CEQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。
A1:MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK;调用子程序BREAK
JMP A1;跳转到A1
BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS 皮氏渗
END START
流水灯显示
MY8255_AEQU 0b860H;8255A口地址
MY8255_BEQU 0b861H;8255B口地址
MY8255_CEQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址
DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元燃脊
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1:MOV AL,LA
ROR AL,1;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,核如其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1
DALLY: MOV CX,3FFH ;延时子程序
D1:MOV AX,0FFFFH
D2:DEC AX
JNZ D2
LOOP D1
RET
BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS
END START
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)