单片机-C51学习日志2022/2.21

1.C语言中的基本数据类型

2.C51的数据类型扩充定义

sbit——特殊功能位声明

3.LED模块

3.1点亮LED

LED模块采用共阳接法

只需要让P2口变为低电平,就可以实现导通

#include "reg52.h"

//引脚重定义
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;



void main()
{
	led1 = 0;
	led2 = 0;
	led3 = 0;
	led4 = 0;
	led5 = 0;
	led6 = 0;
	led7 = 0;
	led8 = 0;	
}

 3.2LED灯闪烁

可以通过设置延时来实现led灯闪烁

但是这种方式时间不精确

//LED闪烁
#include "reg52.h"
//引脚重定义
sbit led1 = P2^0;

void delay(unsigned int tem)
{
	while(tem--);
}

void main()
{
	while(1)
	{
		led1 = 0;	   //点亮
		delay(50000);  //延时
	 	led1 = 1;	   //熄灭
		delay(50000);  //延时
	}
}

3.3LED流水灯

3.3.1使用0x00定义IO口的电平

使用0x00定义IO口的电平

0x01                      ~(0x01)

0000 0001             1111 1110

通过非逻辑实现逐个灯点亮

//流水灯
//方案一
//使用移位和循环实现

//使用宏定义将P2端口进行定义,提高代码的可复制性
#define LED_PORT P2

//设置延时函数
void delay(unsigned int tem)
{
	while(tem--);
}

void main()
{
	unsigned char i = 0;//定义最小位数的元素,来存放变量
	while(1)
	{
		for(i=0;i<8;i++)
		{
			LED_PORT = ~(0x01<<i);
			delay(50000);
		}
	}
}

3.3.2使用函数左移_crol_、_cror_

这是软件内置的移位库函数

使用这个函数必须在程序中包含intrins.h头文件

该移位函数实现的移位功能就相当于一个队列内循环移动。

如果左移,那么最高位就被移到最低位,次高位变成最高位。

与上面方法的移位原理不同

//方案二
//使用左移_crol_、_cror_函数

//需要包含的头文件
#include "intrins.h"

//使用宏定义定义P2端口
#define LED_PORT P2

//延时函数
void delay(unsigned int tem)
{
	while(tem--);
}

void main()
{
	//定义变量
	unsigned char i = 0;
	//对P2端口进行初始赋值
	//~0x01即D1亮,其他灭
	LED_PORT = ~0x01;

	//让D1亮
	delay(50000);

	while(1)
	{
		for(i=0;i<7;i++)//注意这里循环七次就行,D1已经点亮,只需往后循环七个
		{
			LED_PORT = _crol_(LED_PORT,1);
			delay(50000);
		}
		for(i=0;i<7;i++)
		{
			LED_PORT = _cror_(LED_PORT,1);
			delay(50000);
		}
	}
}

3.3蜂鸣器实验

  1. 开发板使用的是无源蜂鸣器,需要提供一定频率的脉冲信号才能发声;
  2. 对于这种蜂鸣器,如果要改变输出电平的高低电平占空比,就可以改变蜂鸣器的声音大小;
  3. 所以我们需要不断地改变输出的高低电平来作为信号脉冲;
#include "reg52.h"

//定义P2^5管脚
//这里P2^5管脚置零也会让D6灯亮,之后的程序虽然有置1,但是时间太短,肉眼不可见,所以可以发现开发板的LED灯也在亮
sbit beep = P2^5;

//设置延时函数
void delay(unsigned int tem)
{
	while(tem--);
}

//主函数
void main()
{
	unsigned int i = 200;
	while(1)
	{
		while(i--)		 //循环200次
		{
			beep = !beep;	   //通过逻辑非+延时实现输出高低电平
			delay(100);
		}
		i = 0;		//这里需要设置i=0,就可以使得不再进入循环中
	}
}

3.4数码管实验

共阴数码管码表

0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,

   0      1        2        3       4        5

0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,

   6      7        8        9       A        B

0x39, 0x5e, 0x79, 0x71, 0x00,

   C       D        E       F    无显示

共阳数码管码表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,

   0        1        2         3        4       5

0x82, 0xF8, 0x80, 0x90, 0x88, 0x83,

   6        7        8         9        A       B

0xC6, 0xA1,0x86, 0x8E, 0xFF,

   C       D       E        F    无显示

3.4.1静态数码管实验

#include "reg52.h"

//使用宏定义对P0口进行定义
#define port P0

//对共阴数码管0~F显示进行定义
unsigned char pool[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

//设置延时函数
void delay(unsigned int tem)
{
	while(tem--);
}

void main()
{	
	unsigned char i = 0;
	while(1)
	{
		for(i=0;i<16;i++)//这里0~15就是16个变量
		{
			port = pool[i];//LED8上依次显示0~F
			delay(60000);	
		}
			
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值