| 还差几个头文件呢 |
| 代码很好,内容十分详细 |
| 感谢楼主分享 |
|
???? 不全? |
curiousRay 发表于 2017-11-15 20:54 有.h文件吗 |
| 感谢分享啊 |
|
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #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频率有关 12M晶振 10000周期为 10ms 频率100Hz sbit PWMOUT=P3^6; int PWM_Z;//PWM脉冲占空比 long PWM_D;//定时器赋值相关 int count=0;//进入定时中断计数 int TH=30; //温度上限 int TL=10; //温度下限 unsigned char KeyValue; //返回按键值 int temp,temp1; float temperature; char displaytemp[16];//定义显示区域临时存储数组 /*------------------------------------------------ 判忙函数 ------------------------------------------------*/ 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; } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ 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; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ 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; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ 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 ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ 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); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); //LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ DelayMs(5); LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ DelayMs(5); } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*------------------------------------------------ 主函数 ------------------------------------------------*/ 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; //计算占空比 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; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } 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); } } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 using 1 { if(PWMOUT==0) //如果正输出低电平 设置高电平延时时间 { PWM_D=TIME/100*PWM_Z; TH0=(65536-PWM_D)/256; // TL0=(65536-PWM_D)%256; PWMOUT=1; } else //如果正输出高电平 设置低电平延时时间 { 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; } } |