基于51单片机的温度报警系统(程序分装)

文章目录

 


前言

接上篇《基于51单片机的温度报警系统》,详细解释程序分装中遇到的问题。


一、程序结构

1.1.1 全局变量

定义在函数外面的变量是全局变量;

全局变量具有全局的生存期和作用域;

它们与任何函数都无关;

在任何函数内部都可以使用它们;

没有做初始化的全局变量会得到O值;

指针会得到NULL值;

只能用编译时刻已知的值来初始化全局变量;

它们的初始化发生在main函数之前。

(PS:如果函数内部存在与全局变量同名的变量,全局变量将会被隐藏。)

1.1.2 静态本地变量

在本地变量定义时加上static修饰符就成为静态本地变量;

当函数离开的时候,静态本地变量会继续存在并保持其值;

静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值。

静态本地变量实际上是特殊的全局变量;

它们位于相同的内存区域;

静态本地变量具有全局的生存期,函数内的局部作用域;

static在这里的意思是局部作用域(本地可访问)。

1.2 预处理命令

预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序

中用预处理命令来调用这些功能。

#开头的是编译预处理的指令,他们不是C语言的成分,但是C语言程序离不开他们。

指令 解释
# 空指令
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 判断条件为真,则编译下面{}内的代码
#ifdef 如果宏已经定义,则编译下面{}内的代码
#ifndef 如果宏没有被定义,则编译下面{}内的代码
#elif 判断前面的#if的条件不为真,即#elif条件为真时,则编译下面{}内的代码
#endif 结束#if······#elif······程序块

(PS:只是简单解释了,具体的自己去看一下)

1.3.1 函数原型

如果不给出函数原型,编译器会猜测你所调用的函数的所有参数都是int,返回类型也是int。编译器

在编译的时候只看当前的一个编译单元,它不会去看同一个项目中的其他编译单元以找出那个函数

的原型。如果你的函数并非如此,程序链接的时候不会出错。但是执行的时候就不对了。所以需要

在调用函数的地方给出函数的原型,以告诉编译器那个函数究竟长什么样。

  • 36
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 50
    评论
好的,我可以为您提供一些基本的程序框架,但需要注意的是,由于涉及到安全性问题,建议您寻求专业人士的指导和支持,以确保您的报警器的功能和可靠性。 以下是一个简单的基于51单片机温度烟雾报警程序设计的框架: 1. 设置温度和烟雾传感器引脚。 2. 初始化串口通信。 3. 设置定时器并开启定时器中断。 4. 在主循环中读取温度和烟雾传感器的数据,并将数据存储在相应的变量中。 5. 在定时器中断服务程序中,检查温度和烟雾传感器的数据是否超过设定的阈值。 6. 如果温度或烟雾传感器数据超过阈值,则触发警报。 7. 警报可以通过启动蜂鸣器、闪烁 LED 灯等方式实现。 以下是一个简单的程序示例,供您参考: ```c #include <reg52.h> // 温度传感器引脚 sbit tempPin = P1^0; // 烟雾传感器引脚 sbit smokePin = P1^1; // 蜂鸣器引脚 sbit buzzerPin = P2^0; // LED灯引脚 sbit ledPin = P2^1; // 温度阈值 #define TEMP_THRESHOLD 50 // 烟雾阈值 #define SMOKE_THRESHOLD 500 // 定时器计数器 unsigned int timerCount = 0; // 温度值 unsigned int tempValue = 0; // 烟雾值 unsigned int smokeValue = 0; // 串口初始化 void InitUART(void) { TMOD = 0x20; SCON = 0x50; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; } // 定时器初始化 void InitTimer(void) { TMOD = 0x01; TH0 = 0xFC; TL0 = 0x66; ET0 = 1; EA = 1; TR0 = 1; } // 定时器中断服务程序 void Timer0_ISR(void) interrupt 1 { timerCount++; } // 延时函数 void Delay(unsigned int count) { unsigned int i, j; for (i = 0; i < count; i++) { for (j = 0; j < 125; j++); } } // 读取温度值 unsigned int ReadTempValue(void) { unsigned int temp; tempPin = 1; Delay(10); temp = tempPin; Delay(10); temp |= tempPin << 1; Delay(10); temp |= tempPin << 2; Delay(10); temp |= tempPin << 3; Delay(10); temp |= tempPin << 4; Delay(10); temp |= tempPin << 5; Delay(10); temp |= tempPin << 6; Delay(10); temp |= tempPin << 7; return temp; } // 读取烟雾值 unsigned int ReadSmokeValue(void) { unsigned int smoke; smokePin = 1; Delay(10); smoke = smokePin; Delay(10); smoke |= smokePin << 1; Delay(10); smoke |= smokePin << 2; Delay(10); smoke |= smokePin << 3; Delay(10); smoke |= smokePin << 4; Delay(10); smoke |= smokePin << 5; Delay(10); smoke |= smokePin << 6; Delay(10); smoke |= smokePin << 7; return smoke; } // 警报处理函数 void Alert(void) { buzzerPin = 1; ledPin = 1; } // 主函数 void main(void) { InitUART(); InitTimer(); while (1) { // 读取温度和烟雾值 tempValue = ReadTempValue(); smokeValue = ReadSmokeValue(); // 如果温度或烟雾传感器的数据超过阈值,则触发警报 if (tempValue > TEMP_THRESHOLD || smokeValue > SMOKE_THRESHOLD) { Alert(); } } } ``` 以上仅为一个简单的示例程序,您需要根据具体的需求和硬件环境进行相应的修改和调试。同时,确保您的程序设计符合相关的安全标准和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值