前言:
如今我们对“单片机温控器c程序”可能比较着重,姐妹们都需要剖析一些“单片机温控器c程序”的相关知识。那么小编在网摘上汇集了一些对于“单片机温控器c程序””的相关内容,希望看官们能喜欢,大家快快来了解一下吧!液晶显示电冰箱温控器源程序
#include <AT89X51.H> //器件配置文件#include <intrins.h>sbit LCM_RS=P3^3; //引脚定义sbit LCM_RW=P3^4; //引脚定义sbit LCM_EN=P3^5; //引脚定义sbit OUT=P3^6; //控制继电器sbit TSOR=P3^7; //温度测试端#define Busy 0x80 //常量定义#define uchar unsigned char#define uint unsigned int#define DATAPORT P1 #define reset() {WDT=0x1e;WDT=0xe1;}//看门狗启动/复位宏定义sfr WDT=0xa6;//看门狗寄存器定义bit ON_OFF;bit outflag;//==============================================uchar temp1,temp2;uchar cnt;uchar deda,sec; //时间变量char min,hour;char set,T;uchar data buff[10];uchar ReadStatusLCM(void);//读数据到MCU子函数声明uchar code str0[]={"--- : : --- "};//待显字符串uchar code str1[]={"SET: C SA: . C"};uchar code str2[]={" "};//待显空字符串//====================函数声明=======================void fun0(void);void fun1(void);void fun2(void);void fun3(void);void set_adj(void);void inc_key(void);void dec_key(void);void key(void);void gettempTS(void);void initTS(void);uchar readBTS(void);void writeBTS(uchar byte);void resetTS(void);bit readTS(void);void write1TS(void);void write0TS(void);void delay15us(void);void delay60us(void); //********延时K*1mS,12.000MHz*********void delay(uint k)//函数名为delay的延时子函数。定义k为无符号整型变量{ //delay函数开始uint i,j; //定义i、j为无符号整型变量for(i=0;i<k;i++){ //for循环语句开始for(j=0;j<60;j++) // for循环语句开始{;}reset()} //两个for循环体} //delay函数结束/*-----------------------------写指令到LCM子函数-------------------------------*/void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函数名为WriteCommandLCM 的写指令到LCM子函数。定义WCLCM、BusyC 为无符号字符型变量*/{ //WriteCommandLCM函数开始if(BusyC)ReadStatusLCM(); /*若BusyC为"1",则调用ReadStatusLCM子函数进行忙检测*/DATAPORT=WCLCM; //将变量WCLCM中的指令传送至P1口LCM_RS=0; //选中指令寄存器LCM_RW=0; //写模式LCM_EN=0; //置LCM_EN端为低电平LCM_EN=0; //置LCM_EN端为低电平,延时一会儿LCM_EN=1; //置LCM_EN端为高电平,写入使能} // WriteCommandLCM函数结束/*----------------------------写数据到LCM子函数-------------------------------*/void WriteDataLCM(uchar WDLCM) /*函数名为WriteDataLCM 的写数据到LCM子函数。定义WDLCM 为无符号字符型变量*/{ // WriteDataLCM函数开始ReadStatusLCM(); //调用ReadStatusLCM子函数检测忙信号DATAPORT=WDLCM; //将变量WDLCM中数据传送至P1口LCM_RS=1; //选中数据寄存器LCM_RW=0; //写模式LCM_EN=0; //置LCM_EN端为低电平LCM_EN=0; //置LCM_EN端为低电平,延时一会儿LCM_EN=1; //置LCM_EN端为高电平,写入使能} // WriteDataLCM函数结束/*--------------------------------读数据到MCU子函数---------------------------*//*uchar ReadDataLCM(void) //函数名为ReadDataLCM的读数据到MCU子函数{ // ReadDataLCM函数开始LCM_RS=1; //选中数据寄存器LCM_RW=1; //读模式LCM_EN=0; //置LCM_EN端为低电平LCM_EN=0; //置LCM_EN端为低电平,延时一会儿LCM_EN=1; //置LCM_EN端为高电平,读使能return(DATAPORT); //返回P1口的内容}*/ // ReadDataLCM函数结束 /*--------------------------------读状态到MCU子函数-----------------------------*/uchar ReadStatusLCM(void) //函数名为ReadStatusLCM的读状态到MCU子函数{ //ReadStatusLCM函数开始DATAPORT=0xFF; //置P1口为全1LCM_RS=0; //选中指令寄存器LCM_RW=1; //读模式LCM_EN=0; //置LCM_EN端为低电平LCM_EN=0; //置LCM_EN端为低电平,延时一会儿LCM_EN=1; //置LCM_EN端为高电平,读使能while(P1&Busy); /*检测忙信号。当P1口内容与Busy(80H)相与后不为零时,程序原地踏步*/return(DATAPORT); //返回P1口的内容} // ReadStatusLCM函数结束 /*--------------------------LCM初始化子函数----------------------------*/void InitLcd() //函数名为InitLcd 的LCM初始化子函数{ // InitLcd函数开始WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号WriteCommandLCM(0x08,1);//关闭显示,检测忙信号WriteCommandLCM(0x01,1);//清屏,检测忙信号WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号} // InitLcd函数结束/*-------------------显示指定座标的一个字符子函数---------------------------*//*显示指定座标的一个字符(X=0~15,Y=0~1)子函数,函数名为DisplayOneChar,定义X、Y、DData为无符号字符型变量*/void DisplayOneChar(uchar X,uchar Y,uchar DData){ // DisplayOneChar 函数开始Y&=1; //Y的变化范围0~1X&=15; // X的变化范围0~15if(Y)X|=0x40; //若Y为1(显示第二行),地址码+0x40X|=0x80; //指令码为地址码+0x80WriteCommandLCM(X,0); //将指令X写入LCM,忽略忙信号检测WriteDataLCM(DData); //再将数据Ddata写入LCM} // DisplayOneChar 函数结束/*--------------------显示指定座标的一串字符子函数----------------------*//*显示指定座标的一串字符(X=0~15,Y=0~1)子函数,函数名为DisplayListChar ,定义X、Y为无符号字符型变量,DData 为指向code区的无符号字符型指针变量*/void DisplayListChar(uchar X,uchar Y,uchar code *DData){ // DisplayListChar 函数开始uchar ListLength=0; //定义ListLength 为无符号字符型变量,并赋初值为0Y&=0x1; // Y的变化范围0~1X&=0xF; // X的变化范围0~15while(X<=15) //X<=15时进入while语句循环{ //while语句开始DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符ListLength++; //数组指针递增X++; //X轴座标递增} //while语句结束} //DisplayListChar 函数结束//=================================================void init_timer0(void) //定时器T0初始化{TMOD=0x01;TH0=-(50235/256);TL0=-(50235%256);TR0=1;ET0=1;EA=1;}//==================================================void time_zd0(void) interrupt 1 using 1 //定时器T0中断子函数{TH0=-(50235/256);TL0=-(50235%256);deda++;cnt++;if(deda>=20){sec++;deda=0;}if(sec>=60){min++;sec=0;}if(min>=60){hour++;min=0;}if(hour>=24){hour=0;}if(cnt>=6)cnt=0;key(); //扫描键盘} //==================================void fun0(void) //液晶显示子函数0{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);//===============================DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);//=========================DisplayOneChar(6,0,min/10+0x30);DisplayOneChar(7,0,min%10+0x30);//==============================DisplayOneChar(9,0,sec/10+0x30);DisplayOneChar(10,0,sec%10+0x30);//=================================DisplayOneChar(4,1,T/10+0x30);DisplayOneChar(5,1,T%10+0x30);//=================================DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2+0x30);//================================ if(ON_OFF==0) { DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x46); } else { DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x4e); if(outflag==1)DisplayOneChar(0,0,0x7c); else DisplayOneChar(0,0,0xef); } //============================ }/*******************************************/void fun1(void) //液晶显示子函数1{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);//=========================DisplayOneChar(6,0,min/10+0x30);DisplayOneChar(7,0,min%10+0x30);//==============================DisplayOneChar(9,0,sec/10+0x30);DisplayOneChar(10,0,sec%10+0x30);//=================================DisplayOneChar(4,1,T/10+0x30);DisplayOneChar(5,1,T%10+0x30);//=================================DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2+0x30);//=================================WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);}/********************************************/void fun2(void) //液晶显示子函数2{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);//=========================DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);//=================================DisplayOneChar(9,0,sec/10+0x30);DisplayOneChar(10,0,sec%10+0x30);//=================================DisplayOneChar(4,1,T/10+0x30);DisplayOneChar(5,1,T%10+0x30);//=================================DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2+0x30);//===================================WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号DisplayOneChar(6,0,min/10+0x30);DisplayOneChar(7,0,min%10+0x30);}/***************************************/void fun3(void) //液晶显示子函数3{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);//=========================DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);//===============================DisplayOneChar(6,0,min/10+0x30);DisplayOneChar(7,0,min%10+0x30);//=================================DisplayOneChar(9,0,sec/10+0x30);DisplayOneChar(10,0,sec%10+0x30);//=================================DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2+0x30);//=================================WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号DisplayOneChar(4,1,T/10+0x30);DisplayOneChar(5,1,T%10+0x30);}/************************************/void key(void) //扫描键盘{uchar xx;P2=0xff; if(P2!=0xff) {delay(10); if(P2!=0xff) {xx=P2; switch(xx) { case 0xfe:set_adj();break; case 0xfd:inc_key();break; case 0xfb:dec_key();break; case 0xf7:ON_OFF=!ON_OFF;break; default:break; } } }}/************************************/void set_adj(void) //设定工作模式子函数{ if(cnt==5) {set++; if(set>=4)set=0; }}/***************************************/void inc_key(void) //按键加法子函数{ if(cnt==5) { switch(set) { case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; case 1:hour++;if(hour>=23)hour=23;break; case 2:min++;if(min>=59)min=59;break; case 3:T++;if(T>=99)T=99; break; default:break; } }}/***************************************/void dec_key(void) //按键减法子函数{ if(cnt==5) { switch(set) { case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; case 1:hour--;if(hour<=0)hour=0;break; case 2:min--;if(min<=0)min=0;break; case 3:T--;if(T<=1)T=1;break; default:break; } }}/***************************************//*****************************************/void delay15us(void) //延时15微秒子函数{uchar i;for(i=0;i<4;i++);}//*************************************************void delay60us(void) 延时60微秒子函数{uchar i;for(i=0;i<15;i++);}//***************************************************void write0TS(void) //write bit0{TSOR=1;TSOR=0;delay15us();delay15us();delay15us();delay15us();TSOR=1;_nop_();_nop_();}//********************************************************void write1TS(void) //write bit1{TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();delay15us();delay15us();delay15us();}//******************************bit readTS(void) //read databit{bit b;TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();b=TSOR;delay15us();delay15us();delay15us();_nop_();_nop_();return b;}//*************************************void resetTS(void) //reset databit{uchar i;TSOR=1;TSOR=0;for(i=0;i<8;i++)delay60us();TSOR=1;while(TSOR);for(i=0;i<8;i++)delay60us();}//***************************************void writeBTS(uchar byte) //write one byte{uchar i;for(i=0;i<8;i++){if(byte&0x01)write1TS();elsewrite0TS();byte=byte>>1;}}//****************************************uchar readBTS(void) //read one byte{uchar i,j;bit b;j=0;for(i=0;i<8;i++){b=readTS();if(b)j+=1;j=_cror_(j,1);}return j;}//************************************************void initTS(void) //初始化DS18B20{resetTS();writeBTS(0xcc);writeBTS(0x4e);writeBTS(0x64);writeBTS(0x8a);writeBTS(0x1f);}//******************************************************void gettempTS(void) //读取测得的环境温度{resetTS();writeBTS(0xcc);writeBTS(0x44);delay(200);resetTS();writeBTS(0xcc);writeBTS(0xbe);temp2=readBTS();temp1=readBTS();readBTS();readBTS();readBTS();readBTS();readBTS();readBTS();readBTS();temp1=temp1<<4;temp1+=(temp2&0xf0)>>4;temp2=(temp2&0x0f)?5:0;} //********主函数*********void main(void){delay(500); //延时500ms,等电源稳定InitLcd(); //LCM初始化init_timer0();DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);initTS();reset()for(;;){//========================switch(set) //LCD根据工作模式进行显示{case 0:fun0();break;case 1:fun1();break;case 2:fun2();break;case 3:fun3();break;default:break;}delay(300);gettempTS(); //读取测得的环境温度if(ON_OFF==1) //控制压缩机动作{ if(temp1>=T+1){delay(1000); if(temp1>=T+1){outflag=1;OUT=0;} } if(temp1<T){delay(1000); if(temp1<T){outflag=0;OUT=1;} }}else {outflag=0;OUT=1;}}}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。