51单片机学习1


硬件:(BST-M51)

51最小系统

cQwm6A.png

流水灯

cQwM0P.png

CH340烧录模块

cQw1k8.png

USB供电

cQwYlj.png

数码管、WIFI、红外发送模块

cQwHcd.md.png

红外接收、蜂鸣器、4位按键

cQwz4S.png

温度传感器

cQ0kBq.png

复位电路

cQ0nCF.png

供电

cQ01D1.png

软件(不是完整的,只是关键代码)

/***************************
	1、51单片机点灯(IO口控制)
****************************/
#include "reg52.h"		//<reg52.h>在当前工程文件夹下搜索;“reg52.h"先在当前工程文件夹下搜索,没有则到软件安装目录找
sbit led1 = P1^0;		//P1口最低位;sfr P0 = 0X80;(寄存器重命名);sbit CY = PSW^7 (PSW最高位重命名)			   
void main()
{
	led1 = 0;			//3~20mA
}
/***************************
	2、51单片机点灯(总线操作法)
****************************/
#include "reg52.h"
void main()
{
	P1 = 0;			//0xaa = 10101010 = 170
}
/***************************
	3、延时语句精确计算
****************************/
#include "reg52.h"
#define uint unsigned int	//#define 宏定义(#define 新名称 原内容)只能定义一次
sbit led1 = P1^0;
uint i,j;
void main()
{
	while(1)
	{
		led1 = 0;
		for(i=1000;i>0;i--)
			for(j=110;j>0;j--);
		led1 = 1;
		for(i=1000;i>0;i--)
			for(j=110;j>0;j--);
	}
}
/****************************
	4、带参数函数写法及调用
*****************************/
void delayms(unsigned int xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);		//i=xms即延时xms毫秒
}
/*****************************
	5、利用C51库函数实现流水灯(leil\C51\HIP\C51Lib)
*******************************/
	#include<intrins.h>
	_cro_(aa,1);		//将aa循环左移1位 
/*******************************
	6、数码管静态显示,BST51第一个数码管显示字符“b”(共阴数码管)
********************************/
#include "reg52.h"
#define duan P0
sbit wei1 = P2^4;		//定义第一位数码管
sbit wei2 = P2^5;		//定义第二位数码管
sbit wei3 = P2^6;		//定义第三位数码管
sbit wei4 = P2^7;		//定义第四位数码管

void main()
{
	wei1 = 1;
	wei2 = 0;
	wei3 = 0;
	wei4 = 0;
	duan = 0x7c;	
    //0111 1100 "b"	0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
	//0x39 , 0x5e , 0x79 , 0x71 , 0x00(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,不显示)

	while(1);
}
/***********补充************************
	unsigned char code table[]={
		0x3f , 0x06 , 0x5b , 0x4f ,
		0x66 , 0x6d ,0x7d , 0x07 , 
		0x7f , 0x6f , 0x77 , 0x7c ,
		0x39 , 0x5e , 0x79 , 0x71 , 0x00}
		*/
//table[0] = 0x3f		
/**************************************
	7、74HC573锁存器 段选、位选(数码管静态显示)(共阴数码管)第一个数码管显示字符“8”
		74H573锁存器:20引脚,-OE脚:三态允许控制端(低电平有效)(即输出使能端)
  INPUTS   OUTPUT	 1D~8D:数据输入端;1Q~8Q;数据输出端
-OE	LE	D	 Q	     LE:锁存允许端(锁存控制端)
 L	 H	H	 H
 L	 H	L	 L
 L	 L  X    Q0(上一次的数据状态)
 H   X  X    Z(高阻态)
 (真值表)
***************************************/
#include "reg52.h"
sbit duan = P2^6;		//申明U1锁存器的锁存端
sbit wela = P2^7;		//申明U2锁存器的锁存端
void main()
{
	wela = 1;		//打开U2锁存器
	P0 = 0xFE;		//送入位选信号11111110
	wela = 0;		//关闭U2锁存端(Q0)
	
	duan = 1;		//打开U1锁存器
	P0 = 0x7F;		//送入段选信号01111111
	duan = 0;		//关闭U1锁存器(Q0)
	while(1);		//程序停在这里
}
/*************补充***************************
	6个数码管同时点亮,依次显示0~F,时间间隔为0.5s,循环下去
void main()
{
	wela = 1;		//打开U2锁存器
	P0 = 0xc0;		//送入位选信号11000000
	wela = 0;		//关闭U2锁存端(Q0)
	while(1)
	{
		for(num=0;num<16;num++)
		{
			duan = 1;		//打开U1锁存器
			P0 = table[num];	//送入段选信号
			duan = 0;		//关闭U1锁存端
			delayms(500);	//延时0.5秒
		}
	}
}*/
/********************************************
	8、数码管动态显示(逐渐缩短延时时长,则同时显示)(实际上是轮流显示的)
*********************************************/
void main()
{
	while(1)
	{
		duan = 1;
		P0 = table[1];	//送段选信号
		duan = 0;
		
		P0 = 0xff;		//11111111送位选数据前关闭所有显示,防止打开位选锁存时(消影)
					//原来段选数据通过位选锁存器造成混乱
		wela = 1;		//11111110送位选数据
		P0 = 0xfe;		
		wela = 0;
		delayms(500);
		
		duan = 1;
		P0 = table[2];	
		duan = 0;
		P0 = 0xff;		
		wela = 1;		
		P0 = 0xfd;		//11111101送位选数据
		wela = 0;
		delayms(500);
		
		duan = 1;
		P0 = table[3];	
		duan = 0;
		P0 = 0xff;		
		wela = 1;		
		P0 = 0xfb;		//11111011送位选数据
		wela = 0;
		delayms(500);
		
		duan = 1;
		P0 = table[4];	
		duan = 0;
		P0 = 0xff;		
		wela = 1;		
		P0 = 0xff;		//11110111送位选数据
		wela = 0;
		delayms(500);
		
		duan = 1;
		P0 = table[5];	
		duan = 0;
		P0 = 0xff;		
		wela = 1;		
		P0 = 0xef;		//11101111送位选数据
		wela = 0;
		delayms(500);
		
		duan = 1;
		P0 = table[6];	
		duan = 0;
		P0 = 0xff;		
		wela = 1;		
		P0 = 0xdf;		//11011111送位选数据
		wela = 0;
		delayms(500);
	}
}
/**************************************************
*实验名:数码管动态显示(逐渐缩短延时时长,则同时显示)(实际上是轮流显示的)
***************************************************/

#include<reg52.h>
#define duan P0
#define uchar unsigned char 
sbit wei1 = P2^4;	//定义第一位数码管
sbit wei2 = P2^5;	//定义第二位数码管
sbit wei3 = P2^6;	//定义第三位数码管
sbit wei4 = P2^7;	//定义第四位数码管

uchar code sz[]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00};				

void delay(unsigned int xms)				
{
	unsigned int i,j;
	for(i=xms;i>0;i--)		      //i=xms即延时约xms毫秒
		for(j=112;j>0;j--);
}

void main()
{
	   while(1)
	   {
	   		duan = sz[4];
			wei1 = 0;
			wei2 = 0;
			wei3 = 0;
			wei4 = 1;
			delay(1000);
			duan = sz[3];
			wei1 = 0;
			wei2 = 0;
			wei3 = 1;
			wei4 = 0;
			delay(1000);
			duan = sz[2];
			wei1 = 0;
			wei2 = 1;
			wei3 = 0;
			wei4 = 0;
			delay(1000);
			duan = sz[1];
			wei1 = 1;
			wei2 = 0;
			wei3 = 0;
			wei4 = 0;
			delay(1000);
	   }
}

文章作者: 旧时南风
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 旧时南风 !
评论
  目录