采用51单片机,用stc-isp编译器编译帮我用uvision程序写一个温度报警器,具体内容为数码管实时显示温度,当温度高于30度或者低于15度时报警,蜂鸣器发出滴滴的报警声,同时点阵led一个图形闪烁
时间: 2024-03-15 14:45:29 浏览: 150
基于51单片机的温度报警
5星 · 资源好评率100%
好的,这是一个基于STC89C52单片机的温度报警器的示例代码,使用Keil uVision编写。
我们使用DS18B20数字温度传感器来读取温度值,使用7段数码管和MAX7219芯片来实时显示温度值,使用蜂鸣器和LED点阵来进行报警。
以下是示例代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DSPORT P3_7 // DS18B20总线
#define DQ P3_6 // DS18B20数据线
#define MAX7219_DIN P1_5 // MAX7219数据输入
#define MAX7219_CS P1_4 // MAX7219片选信号
#define MAX7219_CLK P1_3 // MAX7219时钟信号
#define BEEP P2_3 // 蜂鸣器
#define LED P0 // LED点阵
sbit LED1 = LED^0; // LED点阵第1行
sbit LED2 = LED^1; // LED点阵第2行
sbit LED3 = LED^2; // LED点阵第3行
sbit LED4 = LED^3; // LED点阵第4行
sbit LED5 = LED^4; // LED点阵第5行
sbit LED6 = LED^5; // LED点阵第6行
sbit LED7 = LED^6; // LED点阵第7行
sbit LED8 = LED^7; // LED点阵第8行
uchar code led[8] = { // LED点阵图形,可以自行修改
0x00, 0x7e, 0x3c, 0x18, 0x18, 0x3c, 0x7e, 0x00
};
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0~7
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, // 8~F
0x00, // 空白
0x40 // 小数点
};
uchar temp; // 温度值
bit flag; // 报警标志
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void ds18b20Init() // 初始化DS18B20温度传感器
{
DSPORT = 0; // 拉低总线
_nop_();
_nop_();
DSPORT = 1; // 释放总线
_nop_();
_nop_();
}
void ds18b20WriteByte(uchar dat) // 向DS18B20写入一个字节的数据
{
uchar i;
for (i = 0; i < 8; i++) {
DQ = 0; // 拉低数据线
_nop_();
_nop_();
DQ = dat & 0x01; // 写入数据
dat >>= 1; // 移位
_nop_();
_nop_();
DQ = 1; // 释放数据线
}
_nop_();
_nop_();
}
uchar ds18b20ReadByte() // 从DS18B20读取一个字节的数据
{
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
DQ = 0; // 拉低数据线
_nop_();
_nop_();
dat |= DQ << i; // 读取数据
_nop_();
_nop_();
DQ = 1; // 释放数据线
}
return dat;
}
void ds18b20ReadTemp() // 读取DS18B20的温度值
{
uchar TL, TH;
ds18b20Init(); // 初始化
ds18b20WriteByte(0xcc); // 跳过ROM操作
ds18b20WriteByte(0x44); // 启动温度转换
while (!ds18b20ReadByte()); // 等待转换完成
ds18b20Init(); // 初始化
ds18b20WriteByte(0xcc); // 跳过ROM操作
ds18b20WriteByte(0xbe); // 读取温度寄存器
TL = ds18b20ReadByte(); // 读取温度低位
TH = ds18b20ReadByte(); // 读取温度高位
temp = (TH << 4) | (TL >> 4); // 计算温度值
}
void max7219WriteByte(uchar addr, uchar dat) // 向MAX7219写入一个字节的数据
{
uchar i;
MAX7219_CS = 0; // 选中MAX7219
for (i = 0; i < 8; i++) {
MAX7219_CLK = 0; // 拉低时钟信号
MAX7219_DIN = addr; // 写入地址
dat & 0x80 ? (MAX7219_DIN = 1) : (MAX7219_DIN = 0); // 写入数据
dat <<= 1; // 移位
MAX7219_CLK = 1; // 释放时钟信号
}
MAX7219_CS = 1; // 取消选中MAX7219
}
void max7219Init() // 初始化MAX7219
{
max7219WriteByte(0x09, 0x00); // 译码方式:BCD码
max7219WriteByte(0x0a, 0x03); // 亮度
max7219WriteByte(0x0b, 0x07); // 扫描界限:8个数码管
max7219WriteByte(0x0c, 0x01); // 关闭显示测试
max7219WriteByte(0x0f, 0x00); // 进入正常工作模式
}
void display(uchar dat) // 在数码管上显示一个数字
{
uchar i;
for (i = 1; i <= 8; i++) {
max7219WriteByte(i, table[dat % 10]); // 显示个位数
dat /= 10;
if (dat == 0) break;
}
}
void main()
{
max7219Init(); // 初始化MAX7219
while (1) {
ds18b20ReadTemp(); // 读取温度值
display(temp); // 显示温度值
if (temp > 30 || temp < 15) { // 如果温度高于30度或低于15度
flag = ~flag; // 切换报警状态
BEEP = 0; // 发出警报声
delay(1000);
BEEP = 1;
delay(1000);
}
if (flag) { // 如果处于报警状态
uchar i;
for (i = 0; i < 8; i++) { // LED点阵图形闪烁
LED = ~led[i];
delay(100);
}
}
}
}
```
以上代码仅供参考,具体实现方式可能会因为硬件环境和需求的不同而有所变化。希望能对您有所帮助!
阅读全文