案例一:数码管时钟显示
代码:
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar code table[] = { // 数码管0~9编码表
0x3F, // '0'
0x06, // '1'
0x5B, // '2'
0x4F, // '3'
0x66, // '4'
0x6D, // '5'
0x7D, // '6'
0x07, // '7'
0x7F, // '8'
0x6F // '9'
};
void delay(uint z) {
uint x, y;
for (x = z; x > 0; x--) {
for (y = 110; y > 0; y--);
}
}
void display(uchar *disBuffer) {
uchar i;
for (i = 0; i < 8; i++) {
switch (i) {
case 0: LSA = 0; LSB = 0; LSC = 0; break;
case 1: LSA = 1; LSB = 0; LSC = 0; break;
case 2: LSA = 0; LSB = 1; LSC = 0; break;
case 3: LSA = 1; LSB = 1; LSC = 0; break;
case 4: LSA = 0; LSB = 0; LSC = 1; break;
case 5: LSA = 1; LSB = 0; LSC = 1; break;
case 6: LSA = 0; LSB = 1; LSC = 1; break;
case 7: LSA = 1; LSB = 1; LSC = 1; break;
default: break;
}
P0 = disBuffer[i];
delay(1);
P0 = 0x00;
}
}
void main() {
uchar i;
uchar disBuffer[8] = {0}; // 显示缓冲区,存放要显示的数字
while (1) {
for (i = 0; i < 8; i++) {
disBuffer[i] = table[i]; // 将0~7依次显示0~7
display(disBuffer);
}
}
}
这段代码实现了使用单片机控制数码管显示时钟。其中通过循环遍历一个用来存放要显示数字编码的数组table[],然后通过display()函数显示到数码管上。在main()函数中会不断循环显示0~7数字,实现时钟效果。这段代码需要硬件支持,如连接正确的引脚、接入晶振等。
案例二:LED闪烁控制
代码:
#include <reg52.h>
sbit LED = P1^0;
void delay(uint z) {
uint x, y;
for (x = z; x > 0; x--) {
for (y = 110; y > 0; y--);
}
}
void main() {
while (1) {
LED = 0; // LED亮
delay(500); // 延时500ms
LED = 1; // LED灭
delay(500); // 延时500ms
}
}
这段代码实现了单片机控制LED灯的闪烁效果。通过不断地在 while 循环中使LED(连接在P1.0引脚)的电平切换来实现。
运行程序后,循环中的两个操作会一直重复:首先将LED引脚置低电平(即LED点亮),然后使用 delay() 函数延时500毫秒,接着将LED引脚置高电平(即LED灭),再次使用 delay() 函数延时500毫秒。这样反复执行,就可以实现LED的闪烁效果。
请确保硬件连接正确,并根据需要调整延时时间以达到期望的闪烁频率。
案例三:DS18B20温度测量
代码:
#include <reg52.h>
sbit DQ = P1^0;
unsigned char temp; // 存放温度值
// 延时函数
void delay(unsigned int t) {
while (t--);
}
// DS18B20初始化函数