熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
還差幾個(gè)頭文件呢 |
代碼很好,內(nèi)容十分詳細(xì) |
感謝樓主分享 |
???? 不全? |
curiousRay 發(fā)表于 2017-11-15 20:54 有.h文件嗎 |
感謝分享啊 |
#include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義 #include<intrins.h> #include<stdio.h> #include "18b20.h" #include "delay.h" #include "key.h" sbit RS = P2^5; //定義LCD1602端口 sbit RW = P2^6; sbit EN = P2^7; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 #define TIME 10000 //與PWM頻率有關(guān) 12M晶振 10000周期為 10ms 頻率100Hz sbit PWMOUT=P3^6; int PWM_Z;//PWM脈沖占空比 long PWM_D;//定時(shí)器賦值相關(guān) int count=0;//進(jìn)入定時(shí)中斷計(jì)數(shù) int TH=30; //溫度上限 int TL=10; //溫度下限 unsigned char KeyValue; //返回按鍵值 int temp,temp1; float temperature; char displaytemp[16];//定義顯示區(qū)域臨時(shí)存儲(chǔ)數(shù)組 /*------------------------------------------------ 判忙函數(shù) ------------------------------------------------*/ bit LCD_Check_Busy(void) { unsigned char LCD_Status; RS = 0; RW = 1; EN = 1; DelayMs(1); LCD_Status = P0; EN = 0; return LCD_Status; } /*------------------------------------------------ 寫(xiě)入命令函數(shù) ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while((LCD_Check_Busy()&0x80)==0x80); RS = 0; RW = 0; EN = 0; P0 = com; EN = 1; DelayMs(1); EN = 0; } /*------------------------------------------------ 寫(xiě)入數(shù)據(jù)函數(shù) ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while((LCD_Check_Busy()&0x80)==0x80); RS = 1; RW = 0; EN = 0; P0 = Data; EN = 1; DelayMs(1); EN = 0; } /*------------------------------------------------ 清屏函數(shù) ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 寫(xiě)入字符串函數(shù) ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 寫(xiě)入字符函數(shù) ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函數(shù) ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*顯示模式設(shè)置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); //LCD_Write_Com(0x08); /*顯示關(guān)閉*/ LCD_Write_Com(0x01); /*顯示清屏*/ DelayMs(5); LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/ DelayMs(5); LCD_Write_Com(0x0C); /*顯示開(kāi)及光標(biāo)設(shè)置*/ DelayMs(5); } /*------------------------------------------------ 定時(shí)器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響 TH0=(65536-2000)/256; //重新賦值 2ms TL0=(65536-2000)%256; EA=1; //總中斷打開(kāi) ET0=1; //定時(shí)器中斷打開(kāi) TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi) } /*------------------------------------------------ 主函數(shù) ------------------------------------------------*/ void main(void) { LCD_Init(); Init_Timer0(); PWMOUT=0; while (1) { KeyValue=KeyScan(); if(KeyValue!=0)//如果有鍵按下 { Keyprocessing(KeyValue); //鍵值處理 } temp1=ReadTemperature(); //讀取溫度值 if(temp1>0) { if(temp1<2000)temp=temp1;} temperature=(float)temp*0.0625; sprintf(displaytemp,"Temp=%3.1f",temperature);// LCD_Write_String(0,1,displaytemp);// 顯示溫度值 PWM_Z=(temperature-TL)/(TH-TL)*100; //計(jì)算占空比 if(PWM_Z>100)PWM_Z=100; if(PWM_Z<0)PWM_Z=0; if(PWM_Z==100) { TR0=0; ET0=0; EA=0; // PWMOUT=1; } if(PWM_Z==0) { TR0=0; ET0=0; EA=0; // PWMOUT=0; } if((PWM_Z>0)&&(PWM_Z<100)) { EA=1; //總中斷打開(kāi) ET0=1; //定時(shí)器中斷打開(kāi) TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi) } sprintf(displaytemp,"P=%3d",PWM_Z);// LCD_Write_String(10,1,displaytemp);// 顯示占空比 sprintf(displaytemp,"TH=%2d",TH);// LCD_Write_String(0,0,displaytemp);// 顯示溫度上限 sprintf(displaytemp,"TL=%2d",TL);// LCD_Write_String(10,0,displaytemp);// 顯示溫度下限 DelayMs(300); } } /*------------------------------------------------ 定時(shí)器中斷子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 using 1 { if(PWMOUT==0) //如果正輸出低電平 設(shè)置高電平延時(shí)時(shí)間 { PWM_D=TIME/100*PWM_Z; TH0=(65536-PWM_D)/256; // TL0=(65536-PWM_D)%256; PWMOUT=1; } else //如果正輸出高電平 設(shè)置低電平延時(shí)時(shí)間 { PWM_D=TIME/100*PWM_Z; //PWM_D=20000-PWM_D; TH0=(65536-(TIME-PWM_D))/256; // TL0=(65536-(TIME-PWM_D))%256; PWMOUT=0; } } |
Powered by 單片機(jī)教程網(wǎng)