欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
一個簡單的單片機溫度報警系統程序
[打印本頁]
作者:
keidsasdfqw
時間:
2021-12-21 20:59
標題:
一個簡單的單片機溫度報警系統程序
工程截圖.jpg
(332.75 KB, 下載次數: 69)
下載附件
2021-12-21 20:55 上傳
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
typedef unsigned int uint;
typedef unsigned char uchar;
/********************引腳定義********************/
#define LCD_DATA P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit KEY_1 = P1^7; //功能鍵
sbit KEY_2 = P1^4; //減少鍵
sbit KEY_3 = P1^2; //增加按鍵
sbit DS18B20 = P2^6;
/************************************************/
/********************全局變量********************/
#define KeyTime 200 //200 * 1ms = 200ms
#define DispTime 100 //100 * 1ms = 100ms
#define UartTime 150 //150 * 1ms = 150ms
volatile uchar KEY_1ms = 0;
volatile uchar Disp_1ms = 0;
volatile uchar Uart_1ms = 0;
volatile uchar Menu = 0; //0(顯示當前溫度), 1(設置最低溫度), 2(設置最低溫度)
volatile int MaxTemp = 40;
volatile int MinTemp = -10;
volatile float Temperature = 0;
/************************************************/
/********************函數聲明********************/
void Delay_us(uchar x);
void Delay_ms(uchar x);
void Timer0Init(void);
void KEY_Proc(void);
void DispTemp(void);
void LCD_WriteCommand(uchar com);
void LCD_WriteData(uchar dat);
void LCD_Init(void);
void LCD_Show_Home(void);
void LCD_Show_Setting(void);
void DS18B20_Init(void);
uchar DS18B20_ReadByte(void);
void DS18B20_WriteByte(uchar dat);
float DS18B20_ReadTmp(void);
void UartInit(void);
void Uart_Proc(void);
/************************************************/
/*********************主函數*********************/
int main(void)
{
LCD_Init();
Temperature = DS18B20_ReadTmp();
Delay_ms(200);
Delay_ms(200);
UartInit();
Timer0Init();
LCD_Show_Home();
while(1)
{
DispTemp();
KEY_Proc();
Uart_Proc();
}
}
/************************************************/
/*****************延時函數******************/
void Delay_us(uchar x) //@12.000MHz
{
while(x--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void Delay_ms(uchar x) //@12.000MHz
{
uchar i, j;
while(x--)
{
_nop_();
_nop_();
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
/************************************************/
/*******************計數器0模塊*******************/
void Timer0Init(void)
{
TMOD |= 0x01; //選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0 = 0xFC; //給定時器賦初值,定時1ms
TL0 = 0x18;
ET0 = 1; //打開定時器0中斷允許
EA = 1; //打開總中斷
TR0 = 1; //打開定時器
}
void Timer0(void) interrupt 1
{
TH0 = 0xFC; //給定時器賦初值,定時1ms
TL0 = 0x18;
KEY_1ms ++;
Disp_1ms ++;
Uart_1ms ++;
}
/************************************************/
/*****************按鍵模塊******************/
void KEY_Proc(void)
{
if (KEY_1ms >= KeyTime)
{
KEY_1ms = 0;
if (KEY_1 == 0)
{
Menu ++;
LCD_Show_Setting();
if (Menu == 3)
{
Menu = 0;
LCD_Show_Home();
}
}
else if (KEY_2 == 0)
{
if (Menu == 1)
{
MinTemp --;
}
else if (Menu == 2)
{
MaxTemp --;
if ((MaxTemp - 1) == MinTemp)
{
MaxTemp ++;
}
}
}
else if (KEY_3 == 0)
{
if (Menu == 1)
{
MinTemp ++;
if ((MaxTemp - 1) == MinTemp)
{
MinTemp --;
}
}
else if (Menu == 2)
{
MaxTemp ++;
}
}
}
}
/************************************************/
/*****************溫度顯示函數******************/
void DispTemp(void)
{
if (Disp_1ms >= DispTime)
{
uchar i;
uchar Disp[6] = " ";
uchar Disp1[4] = " ";
Disp_1ms = 0;
if (Menu == 0)
{
LCD_WriteCommand(0xC7);
Temperature = DS18B20_ReadTmp();
sprintf(Disp, "%.1f", Temperature);
for(i=0; i<6; i++)
{
LCD_WriteData(Disp[i]);
}
}
else if (Menu == 1)
{
LCD_WriteCommand(0x80);
LCD_WriteData('>');
LCD_WriteCommand(0xC0);
LCD_WriteData(' ');
LCD_WriteCommand(0x8B);
sprintf(Disp, "%d", MinTemp);
for(i=0; i<4; i++)
{
LCD_WriteData(Disp[i]);
}
}
else if (Menu == 2)
{
LCD_WriteCommand(0x80);
LCD_WriteData(' ');
LCD_WriteCommand(0xC0);
LCD_WriteData('>');
LCD_WriteCommand(0xCB);
sprintf(Disp, "%d", MaxTemp);
for(i=0; i<4; i++)
{
LCD_WriteData(Disp[i]);
}
}
}
}
/************************************************/
/*******************LCD模塊*******************/
void LCD_WriteCommand(uchar com)
{
LCD_EN = 0; //使能
LCD_RS = 0; //選擇發送命令
LCD_RW = 0; //選擇寫入
LCD_DATA = com; //放入命令
Delay_us(1); //等待數據穩定
LCD_EN = 1; //寫入時序
Delay_us(5); //保持時間
LCD_EN = 0;
}
void LCD_WriteData(uchar dat)
{
LCD_EN = 0; //使能清零
LCD_RS = 1; //選擇輸入數據
LCD_RW = 0; //選擇寫入
LCD_DATA = dat; //寫入數據
Delay_us(1);
LCD_EN = 1; //寫入時序
Delay_us(5); //保持時間
LCD_EN = 0;
}
void LCD_Init(void)
{
LCD_WriteCommand(0x38); //開顯示
LCD_WriteCommand(0x0C); //開顯示不顯示光標
LCD_WriteCommand(0x06); //寫一個指針加1
LCD_WriteCommand(0x01); //清屏
LCD_WriteCommand(0x80); //設置數據指針起點
}
void LCD_Show_Home(void)
{
uchar i;
uchar Disp[16];
LCD_WriteCommand(0x80);
sprintf(Disp, " Current Temp: ");
for(i=0; i<16; i++)
{
LCD_WriteData(Disp[i]);
}
LCD_WriteCommand(0xC0);
sprintf(Disp, " Temp: C ");
for(i=0; i<16; i++)
{
LCD_WriteData(Disp[i]);
}
LCD_WriteCommand(0xCD);
LCD_WriteData(0xDF);
}
void LCD_Show_Setting(void)
{
uchar i;
uchar Disp[16];
LCD_WriteCommand(0x80);
sprintf(Disp, " Min Temp: %d ", MinTemp);
for(i=0; i<16; i++)
{
LCD_WriteData(Disp[i]);
}
LCD_WriteCommand(0xC0);
sprintf(Disp, " Max Temp: %d ", MaxTemp);
for(i=0; i<16; i++)
{
LCD_WriteData(Disp[i]);
}
}
/************************************************/
/*******************DS18B20模塊*******************/
void DS18B20_Init(void)
{
DS18B20 = 1;
Delay_us(1);
DS18B20 = 0;
Delay_us(40);
DS18B20 = 1;
Delay_us(11);
}
uchar DS18B20_ReadByte(void)
{
uchar i,dat=0;
DS18B20 = 1;
for(i=0;i<8;i++)
{
DS18B20 = 1;
Delay_us(1);
DS18B20 = 0;
dat >>= 1;
DS18B20 = 1;
if(DS18B20)
dat |= 0X80;
Delay_us(2);
}
return dat;
}
void DS18B20_WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS18B20 = 0;
DS18B20 = dat& 0x01;
Delay_us(2);
DS18B20 = 1;
dat >>= 1;
}
Delay_us(2);
}
float DS18B20_ReadTmp(void)
{
float Temp;
uint Temp_Value[]={0, 0};
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
Delay_us(20);
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
Temp_Value[0] = DS18B20_ReadByte();
Temp_Value[1] = DS18B20_ReadByte();
if((Temp_Value[1]&0xF8)==0xF8)
{
Temp = -1 * (128 - 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8)));
}
else
{
Temp = 0.0625 * (Temp_Value[0] | ((Temp_Value[1]&0x07)<<8));
}
return Temp;
}
/************************************************/
/*******************串口通信模塊*******************/
void UartInit(void)
{
SCON = 0x50; //設置為工作方式1
TMOD |= 0x20; //設置計數器工作方式2
PCON = 0x80; //波特率加倍
TH1=0xF3; //計數器初始值設置,注意波特率是4800的
TL1=0xF3;
// ES=1; //打開接收中斷
// EA=1; //打開總中斷
TR1=1; //打開計數器
}
void Uart_Proc(void)
{
// if (Uart_1ms >= UartTime)
// {
// Uart_1ms = 0;
if (Temperature < MinTemp)
{
SBUF = 'A';
while(!TI);
TI = 0;
}
else if (Temperature > MaxTemp)
{
SBUF = 'B';
while(!TI);
TI = 0;
}
else
{
SBUF = 'O';
while(!TI);
TI = 0;
}
// }
}
復制代碼
Proteus仿真工程下載:
TemperatureMonitor-master.rar
(223.29 KB, 下載次數: 31)
2021-12-21 20:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1