文章目录
- 1.测试代码视频
- 2.流水灯视频
- 3.独立按键视频(点亮四个灯)
- 4.独立按键视频(思考题点亮8个灯)
- 5.数码管显示“111111”
- 6.数码管显示“123456”
- 7.数码管显示“11.12.13”
- 8.数码管显示“HH8800.”
1.测试代码视频
测试
2.流水灯视频
流水灯
#include <reg51.h> // 包含51单片机的特殊功能寄存器定义 #define uchar unsigned char // 定义 uchar 为 unsigned char 类型,方便使用 uchar a; // 定义全局变量 a,用来保存当前灯的状态 // ------------------------------ // 函数:delay() // 作用:实现简单的延时 // ------------------------------ void delay(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) { for (j = 0; j < 120; j++); } } // ------------------------------ // 主函数:main() // 作用:以移位方式控制 P0 口实现流水灯 // ------------------------------ void main() { P1 = 0xfe; // 初始化:P0 = 1111 1110(二进制),点亮第一个灯(假设低电平点亮) while (1) { a = P1; // 读取当前P0口的灯状态,1111 1110保存到变量a中 a = a << 1; // 左移一位,灯光往左移。例如:(1111 1110 << 1) = 1111 1100 a = a | 0x01; // 将最低位强制置为1,防止全0。例如:1111 1100 | 0000 0001 = 1111 1101 delay(300); // 延时一段时间,实现灯的停留视觉效果 if (a == 0xff) // 如果所有灯都亮了(1111 1111),表示移到了尽头 { a = 0xfe; // 重置为初始值:1111 1110(只点亮第一个灯) } P1 = a; // 输出新的灯状态到P0口 } }3.独立按键视频(点亮四个灯)
4个灯
#include <REGX51.H> sbit KEY1 = P3^4; // 按键连接 sbit KEY2 = P3^5; sbit KEY3 = P3^6; sbit KEY4 = P3^7; sbit LED1 = P1^0; // LED连接 sbit LED2 = P1^1; sbit LED3 = P1^2; sbit LED4 = P1^3; sbit LED5 = P1^4; sbit LED6 = P1^5; sbit LED7 = P1^6; sbit LED8 = P1^7; // 延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 123; j++); } void main() { P0 = 0xFF; // 初始所有LED熄灭(因低电平点亮) while(1) { if(KEY1 == 0){ delay_ms(10); if(KEY1 == 0) { while(!KEY1); LED1=~LED1; } } if(KEY2 == 0){ delay_ms(10); if(KEY2 == 0) { while(!KEY2); LED3=~LED3; } } if(KEY3 == 0){ delay_ms(10); if(KEY3 == 0) { while(!KEY3); LED5=~LED5; } } if(KEY4 == 0){ delay_ms(10); if(KEY4 == 0) { while(!KEY4); LED7=~LED7; } } } }4.独立按键视频(思考题点亮8个灯)
8个灯
5.数码管显示“111111”
111111
6.数码管显示“123456”
123456
7.数码管显示“11.12.13”
11.12.13
8.数码管显示“HH8800.”
IMG_3607
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula = P2^6; // 段选锁存器 sbit wela = P2^7; // 位选锁存器 // 数码管的段码表(0~9) uchar code TableDula[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x76 }; // 数码管段码表(0~9,带小数点) uchar code TableDulaPoint[] = { 0xbf, // 0. => 10111111 // 补充代码 0x86,// 1. => 10000110 0xdb,// 2. => 11011011 0xcf,// 3. => 11001111 0xe6,// 4. => 11100110 0xed,// 5. => 11101101 0xfd,// 6. => 11111101 0x87,// 7. => 10000111 0xff,// 8. => 11111111 0xef,// 9. => 11101111 0xf6 }; // 数码管显示位码,对应第1到第6个数码管 uchar code TableWela[] = { 0xfe, // 1111 1110 -> 第1位(P0.0 置低,其它为高)=> 选中第1位数码管 0xfd, // 1111 1101 -> 第2位(P0.1 置低)=> 选中第2位数码管 0xfb, // 1111 1011 -> 第3位(P0.2 置低)=> 选中第3位数码管 0xf7, // 1111 0111 -> 第4位(P0.3 置低)=> 选中第4位数码管 0xef, // 1110 1111 -> 第5位(P0.4 置低)=> 选中第5位数码管 0xdf // 1101 1111 -> 第6位(P0.5 置低)=> 选中第6位数码管 }; // 延时函数 void delay(uchar x) { uchar j; while(x--) { for(j = 0; j < 125; j++); } } void main() { uchar i; // 显示数据:对应的数字内容 uchar displayData[6] = {10, 10, 8, 8, 0, 0}; // 小数点标志位:1表示该位需要小数点 uchar pointFlag[6] = {0, 0, 0, 0, 0, 1}; // 第2位和第4位显示带小数点 while(1) { for(i = 0; i < 6; i++) { P0 = 0x00; // 清除显示 dula = 0; wela = 0; // 位选 P0 = TableWela[i]; wela = 1; wela = 0; // 段码:判断是否需要小数点 if(pointFlag[i] == 1) { P0 = TableDulaPoint[displayData[i]]; } else { P0 = TableDula[displayData[i]]; } dula = 1; dula = 0; delay(2); // 稍作延时 } } }