心型LED显示项目:C51单片机控制与Proteus仿真实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:C51单片机是8051系列微控制器的编程工具,本项目围绕C51单片机控制心型LED显示的实现,介绍了如何使用C51语言编写GPIO控制程序来动态显示心型图案,并利用Proteus软件进行电路仿真。项目内容涵盖了从编程到仿真测试的整个流程,提供了一个实践平台以帮助学习者掌握单片机编程和电路设计。 基于C51单片机设计的心型LED仿真proteus仿真图+源码.rar

1. 单片机在电子工程的应用

单片机作为电子工程中的核心组件,它的应用覆盖了从简单的家用电器到复杂的工业控制系统。本章旨在为读者提供单片机应用的基础概念和实际案例。

1.1 单片机的基本概念

单片机,全称微控制器(Microcontroller Unit, MCU),是一种集成在单一芯片上的计算机系统。它通常包括处理器核心、内存、输入/输出端口以及其它可选的外设功能。由于其小巧、低功耗和低成本的特点,单片机被广泛应用于自动化控制、数据采集、信息处理等领域。

1.2 单片机在电子工程中的作用

在电子工程中,单片机作为控制核心,对系统中的各类传感器输入信号进行处理,根据预定的程序逻辑来控制执行机构。例如,家用的洗衣机和空调等都是由单片机控制其运行状态。通过编程,单片机可以实现复杂的控制算法,适应各种不同的应用需求。

1.3 单片机的技术发展趋势

随着集成技术的进步,现代单片机的处理能力不断增强,拥有更多的内存和外设接口。同时,低功耗设计和无线通讯功能的集成,为物联网(IoT)等新兴技术提供了硬件支持。未来,单片机的发展趋势将更加注重智能性和互联性,支持更复杂的算法和网络协议。

通过本章的内容,读者将对单片机的应用有初步的了解,并对未来技术的发展有基础的认识。在后续章节中,我们将深入探讨特定系列的单片机,如C51单片机,并且介绍如何使用Proteus软件进行电路仿真设计。

2. C51单片机与8051系列

2.1 C51单片机概述

2.1.1 C51单片机的架构和特点

C51单片机,也常被称为8051单片机,是Intel公司在1980年推出的8位微控制器。它的架构和特点奠定了现代微控制器的基础,被广泛应用于各种电子控制系统和嵌入式系统中。C51单片机采用经典的哈佛架构,具有独立的程序存储器和数据存储器空间,这一设计极大地提升了数据处理的效率。

核心特点包括: - 一个集成了8位处理器的微控制器。 - 可编程的程序存储器和数据存储器。 - 多种I/O端口,用于各种外围设备的接口。 - 定时器/计数器和串行通信接口,适用于各种实时和远距离通信需求。 - 中断系统,支持多级优先级。

2.1.2 8051系列单片机的发展与影响

自80年代诞生以来,8051系列单片机经历了数次技术革新和性能提升。尽管现代微控制器技术已经发展到32位甚至64位,8051系列仍然因其稳定性和简单易用性,在教学、工业控制、医疗设备等领域占据着重要地位。此外,8051系列的架构和指令集成为了许多其他微控制器设计的蓝本。

2.2 C51单片机的内部结构

2.2.1 CPU和存储器结构

C51单片机的CPU是其核心处理单元,具备处理8位数据的能力。其内部结构包括算术逻辑单元(ALU)、寄存器组、程序计数器(PC)和累加器等重要组成部分。这些组成部分协同工作,保证了数据处理和程序执行的高效性。

存储器结构方面,C51单片机支持片上RAM和ROM。程序存储器可以是内部的ROM或者外部的ROM,数据存储器则全部为内部的RAM。这种设计允许系统在运行时读取和修改存储在RAM中的数据,同时使用ROM来固化程序代码。

2.2.2 定时器/计数器和串行通信接口

C51单片机的定时器/计数器用于产生准确的时间延迟或对事件进行计数。每个定时器都可以通过编程设置成定时器模式或者计数器模式。串行通信接口则支持全双工的异步通信,允许单片机与外部设备进行数据交换。

. . . 定时器/计数器的实现

#include <reg51.h> // 包含8051寄存器定义的头文件

void Timer0_Init() {
    TMOD &= 0xF0; // 清除定时器0模式位
    TMOD |= 0x01; // 设置定时器0为模式1(16位定时器模式)
    TH0 = 0xFC;   // 装载定时器高位初值
    TL0 = 0x18;   // 装载定时器低位初值
    TR0 = 1;      // 启动定时器0
}

void main() {
    Timer0_Init(); // 初始化定时器
    while (1) {
        // 主循环
    }
}

在上述代码中,我们首先包含了8051寄存器定义的头文件 reg51.h ,然后编写了 Timer0_Init 函数对定时器0进行初始化。设置模式后,装载了预设的初值,并启动了定时器。

. . . 串行通信接口的应用

void Serial_Init() {
    SCON = 0x50;  // 设置串行通信控制寄存器
    TMOD |= 0x20; // 设置定时器1为8位自动重装载模式
    TH1 = 0xFD;   // 设置波特率9600
    TR1 = 1;      // 启动定时器1
}

void Serial_SendChar(char ch) {
    SBUF = ch;    // 将字符写入串行缓冲寄存器
    while (!TI);  // 等待发送完成
    TI = 0;       // 清除发送完成标志
}

void main() {
    Serial_Init(); // 初始化串行通信
    while (1) {
        Serial_SendChar('H'); // 发送字符'H'
    }
}

在上述代码中,我们定义了串行初始化函数 Serial_Init 和发送字符函数 Serial_SendChar 。通过设置控制寄存器和定时器,来配置串行通信的波特率,并在主循环中发送字符'H'。

通过这些例子,我们可以看到,C51单片机的CPU和存储器结构、定时器/计数器以及串行通信接口的设计允许开发者实现各种复杂的功能和应用。接下来,我们将详细探讨C51单片机编程基础和GPIO应用。

3. 心型LED显示基本原理

3.1 LED显示技术概述

3.1.1 LED的工作原理与特性

LED(Light Emitting Diode,发光二极管)是一种半导体电子器件,它能够将电能转换成光能。与传统的白炽灯泡或荧光灯相比,LED具有更高的能效、更长的寿命以及更快的响应速度。

工作原理上,LED的发光基于半导体材料的电子-空穴对复合原理。当电流通过PN结时,电子从N型区域穿过结点移动到P型区域,并与空穴结合,结合时释放的能量以光子的形式发射出来,产生了我们所见的光。不同的半导体材料会产生不同波长的光,从而实现不同的颜色。

特性方面,LED具有以下几点:

  • 能效高:LED消耗的电能主要转换为光能,与传统光源相比,其电能转换率要高得多。
  • 寿命长:由于LED的结构和工作机制,它能持续工作数十万小时而不需要更换。
  • 响应速度快:LED的响应时间非常短,可以达到纳秒级别。
  • 小巧灵活:LED尺寸小,可以制成多种形状,为设计师提供了更多的创意空间。

3.1.2 LED显示的基本技术指标

LED显示作为一种应用广泛的技术,其质量评估主要涉及以下几个技术指标:

  • 亮度:指LED发出光线的强度,通常以坎德拉(cd)为单位。
  • 对比度:是衡量LED显示内容清晰度的重要参数,对比度越高,显示内容越清晰。
  • 均匀性:指LED显示屏中每个像素发光的均匀程度。
  • 色彩还原性:表示LED显示颜色的逼真程度,色彩还原性好的显示技术可以让图像和视频的颜色更自然、逼真。
  • 视角:指LED显示屏在不同观看角度下的可视性能,视角越大,观看的灵活性越高。
  • 防护等级:包括防尘、防水等特性,影响到LED显示设备的使用环境范围。

3.2 心型LED显示的电路设计

3.2.1 心型LED电路的组成和工作原理

心型LED显示的电路设计,通常是由一系列LED组成特定的心形图案,通过控制每个LED的亮灭来形成各种动态显示效果。电路主要由LED灯珠、驱动芯片、控制电路(如微控制器)以及供电系统等部分组成。

  • LED灯珠:作为显示的基本单元,按照预定的图案排列,形成心形的图案。
  • 驱动芯片:由于单片机的输出电流较小,直接驱动众多的LED灯珠是不现实的,因此需要使用驱动芯片来放大电流,并提供相应的电压。
  • 控制电路:核心控制单元,一般使用单片机(如C51系列)来实现对LED灯珠的控制,包括编写控制程序来实现不同的显示效果。
  • 供电系统:为电路提供稳定的直流电源。

工作原理是,微控制器通过编程来控制驱动芯片,进而控制LED灯珠的亮灭。通过快速切换各个LED的状态,就可以实现动态效果,如闪烁、滚动文字等。

3.2.2 心型LED显示的控制技术

为了实现心型LED显示的控制,需要使用到微控制器,如C51单片机,来进行编程控制。基本控制技术包括:

  • PWM控制:通过脉冲宽度调制(PWM)技术来调节LED的亮度。通过改变PWM信号的占空比,可以控制LED的亮度,实现渐变等效果。
  • I2C通信:若使用如I2C总线的驱动芯片,微控制器通过I2C协议与驱动芯片通信,发送控制指令,以减少IO口的数量,并提高控制效率。
  • 定时器中断:使用定时器中断来控制时间相关的显示效果,如定时改变LED显示模式,实现定时切换等功能。

开发过程大致可以分为以下几个步骤:

  1. 设计LED排列布局,绘制出心型图案,确定每个LED的位置。
  2. 根据LED的电气特性,设计电路并选择合适的驱动芯片。
  3. 编写微控制器的控制程序,通过编写代码来实现设计的心型显示效果。
  4. 进行电路板设计和PCB布局,并进行焊接、组装。
  5. 进行程序烧录和电路调试,测试显示效果是否达到预期。

接下来,我们将深入探讨心型LED显示的控制技术细节,并提供具体的操作步骤和代码示例。

4. C51编程基础与GPIO控制

4.1 C51单片机的编程基础

4.1.1 C语言与C51单片机的结合

在嵌入式系统领域,C语言由于其高效的运行速度和较强的硬件操作能力,成为了与单片机结合最紧密的编程语言之一。特别是针对8051系列的C51单片机,C语言提供了更为强大的库函数支持和更加灵活的系统资源管理。这种组合方式,不仅能够将C语言的高级特性带到嵌入式开发中,还能够保持接近汇编语言的硬件操作性能。

要实现C语言与C51单片机的良好结合,首先需要理解C51编译器对标准C语言的扩展以及对8051硬件资源的抽象。C51编译器提供了直接控制硬件寄存器的能力,允许程序员通过特定的寄存器名称直接操作硬件。此外,C51编译器还提供了一系列内置函数,用于访问8051的特殊功能寄存器(SFR),使得硬件操作变得非常直观和简便。

4.1.2 C51指令系统和编程规范

C51指令系统是专门为8051系列单片机设计的一套C语言指令集。为了充分利用8051的硬件特性,C51指令系统包括了多种控制指令,如位操作、位寻址和间接寻址等,这些都是为了适应8051架构而特别设计的。熟练掌握这些指令,对于编写高效率的C51程序至关重要。

编程规范方面,开发者应当遵守一定的代码组织和编写习惯,如合理使用函数划分功能模块、避免使用全局变量、合理利用宏定义和条件编译等。C51编程中,建议遵循一定的命名规则,例如使用全大写字母来表示宏定义的常量,这样可以提高代码的可读性和可维护性。同时,好的注释习惯也不容忽视,它可以帮助程序员在阅读代码时快速理解程序的逻辑和功能模块。

4.2 GPIO在C51单片机中的应用

4.2.1 GPIO的基本概念和工作模式

通用输入输出端口(GPIO)是大多数微控制器中都具备的一种简单但功能强大的接口,允许单片机通过这些端口与外部电路进行交互。在C51单片机中,每个I/O引脚都可以被设置为输入或输出模式,以适应不同的应用场景。通常情况下,输入模式用于读取外部设备的状态,而输出模式用于控制外部设备。

每个GPIO端口的功能和性能直接影响着单片机与外部世界的连接能力。因此,对于开发者而言,深入理解GPIO的工作模式至关重要。通常,GPIO可以配置为推挽模式(Push-Pull)或开漏模式(Open-Drain)。推挽模式下,输出端口可以提供较强的驱动电流,而开漏模式则允许外部电路通过一个上拉电阻来控制电平,更适合实现总线的“线与”功能。

4.2.2 GPIO的编程实践和案例分析

编程实践中,对GPIO的控制需要借助8051系列单片机提供的特定SFR来实现。下面是一个简单的例子,展示如何在C51环境中使用GPIO来控制LED的亮灭。

#include <reg51.h> // 引入8051系列单片机寄存器定义头文件

#define LED_PIN P1 // 将P1端口定义为LED控制端口

void delay(unsigned int ms) {
    // 简单延时函数
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 120; j++);
}

void main() {
    LED_PIN = 0xFF; // 初始状态为LED熄灭(假设高电平熄灭)
    while (1) {
        LED_PIN = 0x00; // 点亮LED
        delay(1000);    // 延时1秒
        LED_PIN = 0xFF; // 熄灭LED
        delay(1000);    // 延时1秒
    }
}

在这个例子中,我们首先定义了LED控制端口为P1,然后编写了一个简单的延时函数,之后在主函数中通过设置P1端口的电平来控制LED的亮灭。通过这个简单的编程实践,开发者可以感受到GPIO对单片机系统的重要性,它为硬件控制提供了最直接的手段。

此外,这个案例还演示了如何结合使用I/O端口和延时函数来创建简单的控制逻辑。通过这样的实践,开发者可以开始构建更加复杂的控制程序,并对单片机与外部设备间的交互有一个直观的认识。当然,在不同的硬件设计中,这种控制逻辑可能需要根据实际的硬件连接方式进行调整。

在实践中,我们还可能遇到需要同时控制多个GPIO端口的情况,这就需要合理地分配和使用I/O资源,并且可能需要编写更复杂的程序来管理这些资源。通过这样的案例分析,我们可以加深对GPIO应用的理解,并在实际开发中灵活运用。

5. Proteus软件仿真介绍及实际应用

Proteus仿真软件是电子工程领域中的一款重要工具,它不仅能够模拟电子电路的行为,还能帮助工程师在将电路实际搭建之前进行测试和调试。本章节将详细介绍Proteus软件的基本功能和在电子设计中的应用范围,并通过实践案例来展示如何利用Proteus进行电路仿真设计、心型LED仿真效果的实现与分析,以及将C51源代码与Proteus仿真整合的完整流程。

5.1 Proteus仿真软件概述

5.1.1 Proteus软件的功能和特点

Proteus软件是由Labcenter Electronics公司开发的一款混合模式电路仿真软件,其功能丰富,特点鲜明:

  • 支持电路图绘制 :提供了图形化界面,用户可以拖放元器件来设计电路图。
  • 电路仿真 :能够模拟电路在不同条件下(如电压、电流、频率变化等)的行为。
  • 元件库丰富 :内置庞大的元件库,覆盖了大部分常用电子元件,还可以创建自定义元件。
  • 微控制器仿真 :支持多种微控制器模型,可以进行微控制器的程序调试和验证。
  • 多语言支持 :支持多语言界面,方便不同国家的工程师使用。

5.1.2 Proteus在电子设计中的应用范围

在电子工程设计中,Proteus软件的应用范围极为广泛:

  • 原理图设计 :用于电路的原理图设计和验证。
  • PCB设计 :可以进行印刷电路板(PCB)布局和布线设计。
  • 系统级仿真 :可以模拟整个嵌入式系统的行为,包括硬件和软件。
  • 教育和学习 :非常适合用于教学,帮助学生理解电路设计和编程。
  • 产品开发 :在产品开发前期进行快速的原型测试和验证。

5.2 利用Proteus进行电路仿真设计

5.2.1 Proteus的电路设计流程

设计电路的流程在Proteus中可以分为以下几个步骤:

  1. 规划电路图 :明确电路的功能和需要实现的目标。
  2. 绘制原理图 :在Proteus中使用元件库中的元器件绘制原理图。
  3. 添加微控制器模型 :根据需要选择合适的微控制器模型,并将其放置到原理图中。
  4. 进行仿真设置 :配置仿真环境,如设置电源、信号源、时钟等。
  5. 运行仿真 :检查电路图是否有错误,然后运行仿真并观察结果。

5.2.2 电路仿真的调试与优化技巧

在仿真过程中,可能会遇到与预期不符的行为,以下是一些调试和优化的技巧:

  • 逐级测试 :先从简单的电路开始测试,逐步增加复杂性。
  • 使用虚拟仪器 :Proteus提供了示波器、逻辑分析仪等虚拟仪器来监测电路信号。
  • 微控制器代码测试 :在实际硬件之前,先将微控制器的代码在Proteus中进行测试。
  • 参数优化 :根据仿真的结果调整电路参数,以达到最佳性能。

5.3 心型LED仿真效果实现与分析

5.3.1 心型LED电路的Proteus建模

要在Proteus中实现心型LED电路的建模,需要按照以下步骤进行:

  1. 设计心型LED的原理图 :根据心型LED的电路原理,绘制其原理图。
  2. 放置和连接LED元件 :在Proteus中找到相应的LED元件,并放置到原理图中相应位置。
  3. 设计控制器逻辑 :决定如何控制LED点亮的顺序,以形成心型图案。
  4. 完成电路连线 :确保所有的电路连接都是正确的,没有遗漏或错误的连线。

5.3.2 LED动态显示效果的仿真实现

仿真实现动态显示效果时,需注意以下几点:

  • 编写控制代码 :使用C51编写控制LED闪烁和显示模式的代码。
  • 编译生成HEX文件 :将编写的C51代码编译为HEX文件,以便在Proteus中加载。
  • 动态显示逻辑 :在微控制器程序中设计动态显示的逻辑,比如让心型LED逐点亮灭。

5.4 C51源代码与Proteus仿真整合

5.4.1 C51源代码文件的编写和编译

首先,使用文本编辑器或集成开发环境(IDE)编写C51源代码。例如,编写一个简单的程序来控制LED的开关:

#include <reg51.h>

#define LED_PORT P2 // 假设LED连接在P2端口

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 120; j > 0; j--);
}

void main() {
    while(1) {
        LED_PORT = 0xFF; // 点亮所有LED
        delay(500); // 延时500ms
        LED_PORT = 0x00; // 熄灭所有LED
        delay(500); // 延时500ms
    }
}

随后,使用Keil uVision等IDE编译这段代码,生成HEX文件。

5.4.2 HEX文件的生成与在Proteus中的加载

在Keil uVision中编译源代码后,生成相应的HEX文件。接下来,在Proteus仿真软件中执行以下操作:

  1. 打开Proteus软件,载入心型LED电路原理图。
  2. 双击微控制器模型,选择“Program File”选项,加载编译好的HEX文件。
  3. 关闭属性窗口,点击“运行仿真”。

5.4.3 源代码与仿真图的联合调试过程

在Proteus中加载了HEX文件之后,就可以进行联合调试:

  • 观察仿真效果 :运行仿真并观察心型LED的实际显示效果是否与预期一致。
  • 修改代码 :如果显示效果有偏差,修改源代码后重复编译、加载和仿真过程。
  • 分析调试 :使用虚拟仪器观察电路信号和微控制器的工作状态,分析可能出现的问题并进行调整。

通过以上步骤,我们可以将C51源代码与Proteus仿真环境结合,实现对心型LED电路的设计、仿真与分析,为实际的硬件制作提供参考和依据。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:C51单片机是8051系列微控制器的编程工具,本项目围绕C51单片机控制心型LED显示的实现,介绍了如何使用C51语言编写GPIO控制程序来动态显示心型图案,并利用Proteus软件进行电路仿真。项目内容涵盖了从编程到仿真测试的整个流程,提供了一个实践平台以帮助学习者掌握单片机编程和电路设计。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

proteus软件仿真 部分文件原创~~ 资料很全~~学习中各个过程的难题都有例子 文件头—————————————————————————————————————————必要 #include #define uint unsigned int #define uchar unsigned char 移位函数——————————————————————————————————————————走马灯 #include temp=_cror_(temp,1); 数码管数字代码———————————————————————————————————————从0到15 正 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 反 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90}; 延时函数——————————————————————————————————————————z毫秒 #define uint unsigned int #define uchar unsigned char void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 定时器0使用——————————————————————————————————————工作方式1 TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; } 定时器1使用———————————————————————————————————————工作方式1 TMOD=0x11; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1; void time1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; } 外部中断0使用————————————————————————————————————————检测下降沿 EA=1; EX0=1; IT0=1; TCON=0x01; 数码管显示数字函数——————————————————————————————————————只显示百十个,可以扩展 void display(uchar bai,uchar shi,uchar ge) { P0=0xff; wela=1; P0=0xfe; wela=0; dula=1; P0=table[bai]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=table[shi]; dula=0; delay(1); P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=table[ge]; dula=0; delay(1); } 控制液晶—————————————————————————————————限16*2小液晶 sbit rs=P3^5; sbit e= P3^4 ; sbit wela=P2^7; sbit dula=P2^6; uchar love1[]={"i say love."}; uchar love2[]={"i love you."}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } int write_com(uchar com) { P0=com; rs=0; e=1; delay(5); e=0; } int write_date(uchar date) { P0=date; rs=1; e=1; delay(5); e=0; } init() { wela=0; dula=0; e=0; write_com(0x38); write_com(0x0e); write_com(0x06); write_com(0x01); write_com(0x80); } 串口通信——————————————————————————————————————————波特率 9600 TMOD=0x20; TH1=0xfd; //9600 TL1=0xfd; PCON=0x00; SCON=0x50;//方式1 EA=1; ES=1; TR1=1; ES=0; SBUF=**; while(!TI); TI=0; ES=1; void ser() interrupt 4 { **=SBUF; RI=0; } IIC总线的应用————————————————————————————————————————————————EEPROM上测试 sbit sck=P2^1; sbit sda=P2^0; sbit ACC7=ACC^7; sbit ACC0=ACC^0; void delay(int z) { uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void deluy() {;;} void start() { sda=1; deluy(); sck=1; deluy(); sda=0; deluy(); } void stop() { sda=0; deluy(); sck=1; deluy(); sda=1; deluy(); } respond() { uchar i; sck=1; while(sda!=0&&i<250)i++; sck=0; deluy(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; sck=0; deluy(); sda=CY; deluy(); sck=1; deluy(); } sck=0; deluy(); sda=1; deluy(); } uchar read_byte() { uchar i; sck=0; deluy(); sda=1; deluy(); for(i=0;i<8;i++) { ACC<<=1; sck=1; deluy(); ACC0=sda; sck=0; } return ACC; } write_date(uchar add,uchar date) { start(); write_byte(0xa0); respond(); write_byte(add); respond(); write_byte(date); respond(); stop(); } read_date(uchar add) { uchar k; start(); write_byte(0xa0); respond(); write_byte(add); respond(); start(); write_byte(0xa1); respond(); k=read_byte(); stop(); return k; } DS18b28的应用—————————————————————————————————————————————一些寄存器可以按需修改 bit DS18B20_init() { bit flag; DQ=1; for(time=0;time<2;time++); DQ=0; for(time=0;time<200;time++); DQ=1; for(time=0;time<10;time++); flag=DQ; for(time=0;time<200;time++); return (flag); } void writecom(uchar com) { uchar i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; DQ=com&0x01; for(time=0;time<10;time++); DQ=1; for(time=0;time>=1; } for(time=0;time<4;time++); } uchar readdat() { uchar i,dat; dat=0; for(i=0;i>=1; _nop_(); DQ=1; for(time=0;time<2;time++); if(DQ==1) dat|=0x80; else dat|=0x00; for(time=0;time<8;time++); } return(dat); } void get_temp() { DS18B20_init(); writecom(0xCC); writecom(0x44); for(time=0;time<100;time++); DS18B20_init(); writecom(0xCC); writecom(0xBE); } void main() { uchar i,tl,th; uchar zhen,xiao; while(1) { get_temp(); tl=readdat(); th=readdat(); zhen=(th*256+tl)/16; xiao=(tl%16)*10/16; } } AD转换——————————————————————————————————————————————ADC0804,其他不适用,temp 0~255之间 关键是接口 sbit wr=P3^6; sbit rd=P3^7; sbit cs=P3^2; void init() { cs=0; } void start() { wr=1; wr=0; wr=1; } void huoqu () { uchar temp; temp=0; start(); rd=0; temp=P1; rd=1; retrn temp; } DA转换—————————————————————————————————————————————关键是接口 sbit wr=P3^6; sbit da=P3^2; init() { da=0; } start() { wr=1; wr=0; wr=1; } 键盘的使用—————————————————————————————————————————4X4 含消抖效果 uchar key; void scan(void) { uchar scode,rcode; P3=0xf0; if((P3&0xf0)!=0xf0) { delay(5); if((P3&0xf0)!=0xf0) { scode=0xfe; while((scode&0x10)!=0) { P3=scode; if((P3&0xf0)!=0xf0) { rcode=(P3&0xf0)|0x0f; key=(~scode)+(~rcode); switch(key) { case 0x11:key=0;break; case 0x21:key=1;break; case 0x41:key=2;break; case 0x81:key=3;break; case 0x12:key=4;break; case 0x22:key=5;break; case 0x42:key=6;break; case 0x82:key=7;break; case 0x14:key=8;break; case 0x24:key=9;break; case 0x44:key=10;break; case 0x84:key=11;break; case 0x18:key=12;break; case 0x28:key=13;break; case 0x48:key=14;break; case 0x88:key=15;break; default : key=16;break; } } else scode=(scode<<1)|0x01; } } } else key=16; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值