51开发板的程序——自用精简版——持续更新

本文通过51单片机展示了多个实例,包括矩阵按键控制数码管显示、74HC595驱动点阵LED循环点亮、动态数码管字符显示、独立按键控制直流电机转动及外部中断和定时器中断控制LED。代码详尽,适合初学者理解和实践。
摘要由CSDN通过智能技术生成

目录

程序11——用矩阵按键控制数码管

程序12——点阵LED循环点亮——74HC595 串口转并口通讯

程序13——用动态数码管显示字符或者图像

程序14——用独立按键控制直流电动机转动

程序15——用外部中断控制LED的亮灭

程序17——用定时器中断控制LED亮灭


文章是用51开发板来实现各种例程,相比于教程本代码有详细注释,而且编程思路容易理解

程序11——用矩阵按键控制数码管

#include "reg52.h"
#include<intrins.h>
#define led P0	   //p2口为led
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit R1=P1^7;
sbit R2=P1^6;
sbit R3=P1^5;
sbit R4=P1^4;
sbit L1=P1^3;
sbit L2=P1^2;
sbit L3=P1^1;
sbit L4=P1^0;

void delay(u16 i) //延迟函数
{
	while(i--);
}

u8 smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u16 word;
void keybord() //确定按的什么键
{
	R1=0;R2=1;R3=1;R4=1;if(L1==0) {word=smgduan[1];} else if(L2==0){word=smgduan[2];}else if(L3==0){word=smgduan[3];}else if(L4==0){word=smgduan[4];}
	R1=1;R2=0;R3=1;R4=1;if(L1==0) {word=smgduan[5];} else if(L2==0){word=smgduan[6];}else if(L3==0){word=smgduan[7];}else if(L4==0){word=smgduan[8];}
	R1=1;R2=1;R3=0;R4=1;if(L1==0) {word=smgduan[9];} else if(L2==0){word=smgduan[10];}else if(L3==0){word=smgduan[11];}else if(L4==0){word=smgduan[12];}
	R1=1;R2=1;R3=1;R4=0;if(L1==0) {word=smgduan[13];} else if(L2==0){word=smgduan[14];}else if(L3==0){word=smgduan[15];}else if(L4==0){word=smgduan[16];}

}
void main()		//主函数
{

	while(1)
	{
	LSA=1;LSB=0;LSC=1;//点亮led6数码管	 
	keybord();	 //选字
	//while(word!=0);		  //防抖
	led=word;
	delay(10);

	}

}

程序12——点阵LED循环点亮——74HC595 串口转并口通讯

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num;

void delay(u16 i) //延迟函数
{
	while(i--);
}

void ctob(u8 dat)
{
	for(a=0;a<8;a++) //进入并行数据
	{
		SER=dat>>7;	//SER只能接收串行数据(单个数)
		dat<<=1;	   //次高位补上
		SRCLK=0;   //上升沿进入位移储存器
		SRCLK=1;
	}
	dCLK=0;	 //上升沿储存器输入——显示
	dCLK=1;
}


void main()		//主函数
{	
	num=0x01;
	led1=0;	
	while(1)
	{
		ctob(num);
		num=_crol_(num,1);		//复位后右移动
		delay(50000);	
	}
}

点亮第一行第一个灯

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num1;
u8 num2;

void delay(u16 i) //延迟函数
{
	while(i--);
}

void ctob(u8 dat1,u8 dat2)
{
	for(a=0;a<8;a++) //进入并行数据
	{
		SER=dat1<<7;	//SER只能接收串行数据(单个数)
		dat1>>=1;	   //次高位补上
		SRCLK=0;   //上升沿进入位移储存器  先进入DPh
		SRCLK=1;
	}
	dCLK=0;	 //上升沿储存器输入——显示
	dCLK=1;

	delay(500000);

	for(a=0;a<8;a++) //进入并行数据
	{
		SER=dat2>>7;	//右移7位;SER只能接收串行数据(单个数)
		dat2<<=1;	   //次高位补上
		SRCLK=0;   //上升沿进入位移储存器
		SRCLK=1;
	}
	dCLK=0;	 //上升沿储存器输入——显示
	dCLK=1;

}


void main()		//主函数
{	
	num1=0x01;
	num2=0x00;
	led1=0;	
	while(1)
	{
		ctob(num1,num2);
		delay(5000);	
	}
}

程序13——用动态数码管显示字符或者图像

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit dCLK=P3^5;
sbit SRCLK=P3^6;
sbit led1=P0^7;
u8 a;
u8 num1;
u8 num2;

void delay(u16 i) //延迟函数
{
	while(i--);
}

LED_hang[]={0x10,0x50,0x3E,0x16,0x52,0x7E,0x10,0x10}; //点亮的数字图案
LED_lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};


void ctob(u8 dat1,u8 dat2)
{
	for(a=0;a<8;a++) //进入并行数据
	{
		SER=dat1<<7;	//SER只能接收串行数据(单个数)
		dat1>>=1;	   //次高位补上
		SRCLK=0;   //上升沿进入位移储存器  先进入DPh
		SRCLK=1;
	}
	dCLK=0;	 //上升沿储存器输入——显示
	dCLK=1;
	delay(5);
	for(a=0;a<8;a++) //进入并行数据
	{
		SER=dat2>>7;	//右移7位;SER只能接收串行数据(单个数)
		dat2<<=1;	   //次高位补上
		SRCLK=0;   //上升沿进入位移储存器
		SRCLK=1;
	}
	dCLK=0;	 //上升沿储存器输入——显示
	dCLK=1;

}
void main()		//主函数
{	
	u8 j;
	num2=0x00;
	while(1)
	{
		for(j=0;j<8;j++)
		{
			P0=LED_lie[j];	 //依次点亮1-8列
			ctob(LED_hang[j],num2);		//对1-8列的各行点亮
			delay(10);	 
		}
		delay(50000);	
	}
}

程序14——用独立按键控制直流电动机转动

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit speed=P1^0;
sbit keybord=P3^1;

void delay(u16 i) //延迟函数
{
	while(i--);
}


void main()		//主函数
{	
	while(1)
	{
		if(keybord==0)
		{	
			delay(500);
			if(keybord==0)
			{
				speed=~speed;
			}
			while(!keybord);	
		}
	}
}

程序15——用外部中断控制LED的亮灭

为什么用外部中断不用if条件判断(因为:if必须放在程序中的前面或者后面,中断只要打开,就是先执行,比如扫地机器人判断是否需要去充电了,不能总是来判断,用中断可以大大简化我们的程序。)

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
sbit keybord=P3^2;


void delay(u16 i) //延迟函数
{
	while(i--);
}

void int0int()
{
	EA=1;	 //总中断打开
	EX0=1;	  //外部中断1允许位打开
	EX1=0;	  //外部中断2允许位关闭
	IT0=1;	  //下降沿有效
}

void int0() interrupt 0
{
	delay(500);
	if(keybord==0)
	{
		led=~led;	   //灯的亮灭控制
	}

}

void main()		//主函数
{	
	int0int(); //先打开终端
	while(1);	//保持主函数有执行的程序
}

程序17——用定时器中断控制LED亮灭

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
u16 a; 

void delay(u16 i) //延迟函数
{
	while(i--);
}

void Timer0int()	 //打开定时器中断
{
	TMOD|=0X01;//1对定时器T0配置	定时模式 01工作方式16位定时器
	TH0=0XFC; TL0=0X18;  //2所需定时时间
	EA=1;	 //3总中断打开  开放定时器中断
	ET0=1; //定e时器T0中断允许位
	TCON=0X10;  //4对TCON配置 使T0计时器打开
}

void Timer0() interrupt 1	  //中断内的函数
{
//每过1ms  TF0变一次
	TH0=0XFC; TL0=0X18;//必要 对计时重置
	a=a+1;
	if(a==1000)
	{
		a=0;
		led=~led;
	}			
}

void main()		//主函数
{	
	Timer0int();
	while(1);	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值