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蜂鸣器实验
- 开发板使用的是无源蜂鸣器,需要提供一定频率的脉冲信号才能发声;
- 对于这种蜂鸣器,如果要改变输出电平的高低电平占空比,就可以改变蜂鸣器的声音大小;
- 所以我们需要不断地改变输出的高低电平来作为信号脉冲;
#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);
}
}
}