请用普中51-实验板制作一份简易作业,要求用到LED灯,矩阵键盘,数码管,显示屏,点阵屏,蜂鸣器,温度传感器

时间: 2024-05-06 08:15:27 浏览: 19
以下是普中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毫秒闪烁一次显示屏的显示代码,同时蜂鸣器发出滴声。

相关推荐

最新推荐

recommend-type

PLC实现LED数码管动态扫描数据显示

设计主要是将一个两位数分成两组数据分别在十位和个位数码管上显示,程序采用循环控制方式,则一个扫描周期显示一组数据,即两组数据循环显示。
recommend-type

51单片机DIY制作实例:旋转LED数字显示电子钟(含C语言源程序)

该文是一篇基于51单片机的DIY制作详述,作者此时是51单片机初学者,这个制作也可以作为不少单片机学习者的练手实验,如进行多样衍生会得到不错的设计。
recommend-type

单片机控制74HC595动态扫描数码管显示

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个...
recommend-type

基于PWM调光的多功能LED台灯设计

本文设计了一种以AT89S51 单片机为核心的家用多功能白光LED 台灯系统,采用PT4115 大功率LED 恒流驱动方案,可实现对LED 台灯的PWM 多级调光控制;同时,系统兼有时间日历、温度检测、液晶显示、声光闹钟等多项功能...
recommend-type

一款LED流水灯的原理电路图

本文将介绍的LED流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。