能用at89c51实现吗
时间: 2023-07-11 11:18:31 浏览: 51
当然可以使用 AT89C51 单片机实现数码管的显示功能。以下是一个使用 AT89C51 单片机和 8 位共阴数码管实现 "Hello World!" 的代码。
```c
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L // 定义振荡器频率为 11.0592MHz
#define T1MS (65536-FOSC/1000) // 定义计时器 1 溢出时间为 1 毫秒
sbit A = P1^0; // 数码管引脚定义
sbit B = P1^1;
sbit C = P1^2;
sbit D = P1^3;
sbit E = P1^4;
sbit F = P1^5;
sbit G = P1^6;
sbit H = P1^7;
const unsigned char LEDDigit[] = { // 数码管编码表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A
0x7c, // b
0x39, // C
0x5e, // d
0x79, // E
0x71 // F
};
void DelayMs(unsigned int ms) { // 延时函数
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++) {
_nop_();
}
}
}
void DisplayChar(unsigned char ch) { // 数码管显示函数
P1 = ~(LEDDigit[ch - 'A']); // 数码管共阴,取反后点亮
}
int main() {
TMOD |= 0x10; // 设置计时器 1 工作模式为 16 位自动重装载
TH1 = T1MS >> 8; // 初始化计时器 1 高位
TL1 = T1MS & 0xff; // 初始化计时器 1 低位
ET1 = 1; // 开启计时器 1 中断
EA = 1; // 开启总中断
TR1 = 1; // 启动计时器 1
while (1) {
DisplayChar('H'); // 显示 'H'
DelayMs(500); // 延时 500 毫秒
DisplayChar('e'); // 显示 'e'
DelayMs(500); // 延时 500 毫秒
DisplayChar('l'); // 显示 'l'
DelayMs(500); // 延时 500 毫秒
DisplayChar('l'); // 显示 'l'
DelayMs(500); // 延时 500 毫秒
DisplayChar('o'); // 显示 'o'
DelayMs(500); // 延时 500 毫秒
DisplayChar(' '); // 显示空格
DelayMs(500); // 延时 500 毫秒
DisplayChar('W'); // 显示 'W'
DelayMs(500); // 延时 500 毫秒
DisplayChar('o'); // 显示 'o'
DelayMs(500); // 延时 500 毫秒
DisplayChar('r'); // 显示 'r'
DelayMs(500); // 延时 500 毫秒
DisplayChar('l'); // 显示 'l'
DelayMs(500); // 延时 500 毫秒
DisplayChar('d'); // 显示 'd'
DelayMs(500); // 延时 500 毫秒
DisplayChar('!'); // 显示感叹号
DelayMs(500); // 延时 500 毫秒
}
return 0;
}
void Timer1Overflow() interrupt 3 { // 计时器 1 溢出中断处理函数
TH1 = T1MS >> 8; // 重新加载计时器 1 高位
TL1 = T1MS & 0xff; // 重新加载计时器 1 低位
static unsigned int ms = 0;
ms++;
if (ms == 1) {
A = B = C = D = E = F = G = H = 1; // 数码管熄灭
} else if (ms == 2) {
A = 0; // 显示第 1 个字符
DisplayChar('H');
} else if (ms == 3) {
B = 0; // 显示第 2 个字符
DisplayChar('e');
} else if (ms == 4) {
C = 0; // 显示第 3 个字符
DisplayChar('l');
} else if (ms == 5) {
D = 0; // 显示第 4 个字符
DisplayChar('l');
} else if (ms == 6) {
E = 0; // 显示第 5 个字符
DisplayChar('o');
} else if (ms == 7) {
F = 0; // 显示第 6 个字符
DisplayChar(' ');
} else if (ms == 8) {
G = 0; // 显示第 7 个字符
DisplayChar('W');
} else if (ms == 9) {
H = 0; // 显示第 8 个字符
DisplayChar('o');
} else if (ms == 10) {
A = 0; // 显示第 9 个字符
DisplayChar('r');
} else if (ms == 11) {
B = 0; // 显示第 10 个字符
DisplayChar('l');
} else if (ms == 12) {
C = 0; // 显示第 11 个字符
DisplayChar('d');
} else if (ms == 13) {
D = 0; // 显示第 12 个字符
DisplayChar('!');
ms = 0;
}
}
```
代码中,使用 `P1` 控制数码管的每个引脚,通过 `DisplayChar` 函数实现对单个字符的显示。在 `main` 函数中,依次显示 "Hello World!",并通过 `DelayMs` 函数实现了 500 毫秒的延时。使用计时器 1 和中断机制来实现数码管的动态显示,每次计时器 1 溢出时,通过设置 `P1` 的每个引脚来显示对应的字符。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)