请用普中51-实验板制作一份简易作业,要求用到LED灯,矩阵键盘,数码管,显示屏,点阵屏,蜂鸣器,温度传感器
时间: 2024-05-06 17:15:27 浏览: 136
以下是普中51-实验板制作的简易作业代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P1^5; // 蜂鸣器
sbit DIO = P2^0; // 点阵屏数据线
sbit CLK = P2^1; // 点阵屏时钟线
sbit SDA = P2^2; // 温度传感器数据线
sbit SCL = P2^3; // 温度传感器时钟线
sbit LATCH = P2^4; // 74HC595锁存器控制线
uchar code DIG_CODE[] = { // 共阴数码管显示代码表
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
uchar code LED_CODE[] = { // LED灯显示代码表
0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
};
uchar code KEY_CODE[] = { // 矩阵键盘按键代码表
0xEE, 0xDE, 0xBE, 0x7E
};
uchar code DIS_CODE[] = { // 显示屏显示代码表
0x38, 0x0C, 0x01, 0x06, 0x1F
};
uchar code TEXT[] = "Hello, World!"; // 显示屏显示文本
void delay(uint t) // 延时函数
{
while (t--);
}
void writeByte(uchar dat) // 点阵屏写入一个字节
{
uchar i;
for (i = 0; i < 8; i++) {
DIO = dat & 0x80;
dat <<= 1;
CLK = 0;
_nop_();
CLK = 1;
}
}
void writeCmd(uchar cmd) // 点阵屏写入命令
{
LATCH = 0;
writeByte(0xC0);
writeByte(cmd);
LATCH = 1;
}
void writeData(uchar dat) // 点阵屏写入数据
{
LATCH = 0;
writeByte(0xC1);
writeByte(dat);
LATCH = 1;
}
void initDS18B20() // 初始化温度传感器
{
SDA = 1;
SCL = 1;
delay(2);
SDA = 0;
delay(80);
SDA = 1;
delay(2);
}
void writeDS18B20(uchar dat) // 写入温度传感器一个字节
{
uchar i;
for (i = 0; i < 8; i++) {
SDA = dat & 0x01;
dat >>= 1;
SCL = 0;
delay(2);
SCL = 1;
delay(2);
}
}
uchar readDS18B20() // 读取温度传感器一个字节
{
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
SCL = 0;
delay(2);
SCL = 1;
delay(2);
dat >>= 1;
if (SDA) dat |= 0x80;
}
return dat;
}
void displayDS18B20() // 显示温度传感器温度
{
uchar temp[2];
float t;
initDS18B20();
writeDS18B20(0xCC);
writeDS18B20(0x44);
delay(1000);
initDS18B20();
writeDS18B20(0xCC);
writeDS18B20(0xBE);
temp[0] = readDS18B20();
temp[1] = readDS18B20();
t = (temp[1] << 8) | temp[0];
t /= 16;
writeCmd(0x80);
writeData(DIG_CODE[(int)(t / 10)]);
writeData(DIG_CODE[(int)(t % 10)] | 0x80);
writeData(0x39);
writeData(DIG_CODE[(int)((t - (int)t) * 10)]);
}
void main()
{
uchar i, j, k, key, led, dis;
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器0计数初值
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 开始计数
while (1) {
key = 0;
P2 = 0xFE;
if (P0 != 0xFF) {
for (i = 0; i < 4; i++) {
P2 = 0xFE >> i;
if (P0 != 0xFF) {
for (j = 0; j < 4; j++) {
if (P0 == KEY_CODE[j]) {
key = i * 4 + j + 1;
break;
}
}
break;
}
}
}
if (key > 0) {
led = LED_CODE[key - 1];
dis = DIS_CODE[key - 1];
} else {
led = 0xFF;
dis = 0xFF;
}
P1 = led;
writeCmd(0x40);
for (k = 0; k < 8; k++) {
writeData(TEXT[k]);
}
displayDS18B20();
delay(1000);
writeCmd(0x80);
writeData(dis);
delay(500);
beep = 1;
delay(50);
beep = 0;
delay(450);
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC;
TL0 = 0x66;
P0 = DIG_CODE[k];
if (++k >= 8) k = 0;
}
```
其中,点阵屏使用74HC595移位寄存器控制,共阴数码管、LED灯、矩阵键盘、显示屏、蜂鸣器都是直接接口控制,温度传感器使用DS18B20芯片,通过单总线协议控制读取温度数据。代码实现了按键控制LED灯、显示屏显示文本和数码管显示温度,每隔1秒钟更新一次温度数据,并且每隔500毫秒闪烁一次显示屏的显示代码,同时蜂鸣器发出滴声。
阅读全文