|
單片機(jī)源程序如下:
- #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(顯示當(dāng)前溫度), 1(設(shè)置最低溫度), 2(設(shè)置最低溫度)
- volatile int MaxTemp = 40;
- volatile int MinTemp = -10;
- volatile float Temperature = 0;
- /************************************************/
- /********************函數(shù)聲明********************/
- 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);
- /************************************************/
- /*********************主函數(shù)*********************/
- 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();
- }
- }
- /************************************************/
- /*****************延時(shí)函數(shù)******************/
- 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);
- }
- }
- /************************************************/
- /*******************計(jì)數(shù)器0模塊*******************/
- void Timer0Init(void)
- {
- TMOD |= 0x01; //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
- TH0 = 0xFC; //給定時(shí)器賦初值,定時(shí)1ms
- TL0 = 0x18;
- ET0 = 1; //打開(kāi)定時(shí)器0中斷允許
- EA = 1; //打開(kāi)總中斷
- TR0 = 1; //打開(kāi)定時(shí)器
- }
- void Timer0(void) interrupt 1
- {
- TH0 = 0xFC; //給定時(shí)器賦初值,定時(shí)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 ++;
- }
- }
- }
- }
- /************************************************/
- /*****************溫度顯示函數(shù)******************/
- 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; //選擇發(fā)送命令
- LCD_RW = 0; //選擇寫入
-
- LCD_DATA = com; //放入命令
- Delay_us(1); //等待數(shù)據(jù)穩(wěn)定
- LCD_EN = 1; //寫入時(shí)序
- Delay_us(5); //保持時(shí)間
- LCD_EN = 0;
- }
-
-
- void LCD_WriteData(uchar dat)
- {
- LCD_EN = 0; //使能清零
- LCD_RS = 1; //選擇輸入數(shù)據(jù)
- LCD_RW = 0; //選擇寫入
- LCD_DATA = dat; //寫入數(shù)據(jù)
- Delay_us(1);
- LCD_EN = 1; //寫入時(shí)序
- Delay_us(5); //保持時(shí)間
- LCD_EN = 0;
- }
- void LCD_Init(void)
- {
- LCD_WriteCommand(0x38); //開(kāi)顯示
- LCD_WriteCommand(0x0C); //開(kāi)顯示不顯示光標(biāo)
- LCD_WriteCommand(0x06); //寫一個(gè)指針加1
- LCD_WriteCommand(0x01); //清屏
- LCD_WriteCommand(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
- 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; //設(shè)置為工作方式1
- TMOD |= 0x20; //設(shè)置計(jì)數(shù)器工作方式2
- PCON = 0x80; //波特率加倍
- TH1=0xF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
- TL1=0xF3;
- // ES=1; //打開(kāi)接收中斷
- // EA=1; //打開(kāi)總中斷
- TR1=1; //打開(kāi)計(jì)數(shù)器
- }
- 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;
- }
- // }
- }
復(fù)制代碼 Proteus仿真工程下載:
TemperatureMonitor-master.rar
(223.29 KB, 下載次數(shù): 31)
2021-12-21 20:54 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|