单片机源程序如下:
- //******************温度采集与控制*******DS18B20芯片*******************//
- #include<stc15f2k60s2.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit DQ = P1^4; //单总线接口
- //数码管显示、按键、板子初始化、延时函数定义
- void delayms(int ms);
- void allinit();
- //void keyscan();
- void keyscan16();
- void Timer0Init(void);
- void display1(uchar yi,uchar er);
- void display2(uchar san,uchar si);
- void display3(uchar wu,uchar liu);
- void display4(uchar qi,uchar ba);
- //温度转化函数
- uchar Tempget();
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
- uchar yi,er,san,si,wu,liu,qi,ba;
- uchar wendu,tt=0;
- uchar max=35,min=25,qujian;
- bit S7_Flag=0,S6_Flag=0,S5_Flag=0,S4_Flag=0,fla=0;
- //********************************主函数******************************//
- void main()
- {
- allinit();
- Timer0Init();
- yi=10;er=1;san=10;si=11;wu=11;liu=11;qi=0;ba=0;
- while(1)
- {
- wendu=Tempget();
- if(wendu<min)
- {
- qujian=0;P2|=0xa0;P2&=0xbf;P0=0x00;
- }
- else if((wendu>=min)&&(wendu<=max))
- {
- qujian=1;P2|=0xa0;P2&=0xbf;P0=0x00;
- }
- else if(wendu>max)
- {
- qujian=2;P2|=0xa0;P2&=0xbf;P0=0x10;
- }
- yi=10;er=qujian,san=10,si=11,wu=11,liu=11,qi=wendu/10;ba=wendu%10;
- //keyscan();
- keyscan16();
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display4(qi,ba);
- }
- }
- //*****************************温度设置函数*************************//
- //void
- //*****************************定时函数****************************//
- void Timer0Init(void) //5毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0x28; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
-
- ET0=1;EA=1;//打开定时器
- }
- void timer0() interrupt 1
- {
- tt++;
- if((tt==160)&&(qujian==0))
- {
- tt=0;
- if(fla==1){fla=0;P2|=0x80;P2&=0x9f;P0=0xfe;}
- else if(fla==0){fla=1;P2|=0x80;P2&=0x9f;P0=0xff;}
- }
- if((tt==80)&&(qujian==1))
- {
- tt=0;
- if(fla==1){fla=0;P2|=0x80;P2&=0x9f;P0=0xfe;}
- else if(fla==0){fla=1;P2|=0x80;P2&=0x9f;P0=0xff;}
- }
- if((tt==40)&&(qujian==2))
- {
- tt=0;
- if(fla==1){fla=0;P2|=0x80;P2&=0x9f;P0=0xfe;}
- else if(fla==0){fla=1;P2|=0x80;P2&=0x9f;P0=0xff;}
- }
- }
- //*****************************DS18B20芯片************温度函数开始************************//
- //单总线延时函数
- void Delay_OneWire(unsigned int t)
- {
- unsigned char i;
- while(t--){
- for(i=0; i<8; i++);
- }
- }
- //通过单总线向DS18B20写一个字节
- void Write_DS18B20(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_OneWire(50);
- DQ = 1;
- dat >>= 1;
- }
- Delay_OneWire(50);
- }
- //从DS18B20读取一个字节
- unsigned char Read_DS18B20(void)
- {
- unsigned char i;
- unsigned char dat;
-
- for(i=0;i<8;i++)
- {
- DQ = 0;
- dat >>= 1;
- DQ = 1;
- if(DQ)
- {
- dat |= 0x80;
- }
- Delay_OneWire(50);
- }
- return dat;
- }
- //DS18B20设备初始化
- bit init_ds18b20(void)
- {
- bit initflag = 0;
-
- DQ = 1;
- Delay_OneWire(120);
- DQ = 0;
- Delay_OneWire(800);
- DQ = 1;
- Delay_OneWire(100);
- initflag = DQ;
- Delay_OneWire(50);
-
- return initflag;
- }
- //DS18B20温度获取函数
- uchar Tempget()
- {
- uchar temp,low,high;
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0x44);
- Delay_OneWire(200);
-
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0xbe);
- low=Read_DS18B20();
- high=Read_DS18B20();
- temp=high<<4;temp|=(low>>4);
-
- return temp;
- }
- //************************DS18B20芯片****************温度函数结束***********************//
- //************************延时函数***************************//
- void delayms(int ms)
- {
- int i,j;
- for(i=0;i<ms;i++)
- for(j=845;j>0;j--);
- }
- //***********************板子初始化函数**********************//
- void allinit()
- {
- P2|=0xa0;P2&=0xbf;P0=0x00;
- P2|=0x80;P2&=0x90;P0=0xff;
-
- P2|=0xc0;P2&=0xdf;P0=0xff;
- P2|=0xe0;P2&=0xff;P0=0xff;
- }
- ////***********************独立按键函数************************//
- //void keyscan()
- //{
- // if(P30==0)
- // {
- // S7_Flag=1;
- // }
- // else if(P31==0)
- // {
- // S6_Flag=1;
- // }
- // else if(P32==0)
- // {
- // S5_Flag=1;
- // }
- // else if(P33==0)
- // {
- // S4_Flag=0;
- // }
- //
- // if((P30==1)&&(S7_Flag==1))
- // {
- // S7_Flag=0;
- // yi=2;san=11;
- // }
- // else if((P31==1)&&(S6_Flag==1))
- // {
- // S6_Flag=0;
- // yi=3;san=10;
- // }
- // else if((P32==1)&&(S5_Flag==1))
- // {
- // S5_Flag=0;
- // yi=4;san=9;
- // }
- // else if((P33==1)&&(S4_Flag==1))
- // {
- // S4_Flag=0;
- // yi=5;san=8;
- // }
- //}
- //***************************矩阵按键****************************//
- void keyscan16()
- {
- uchar temp;
- //第一列
- P44=0;P42=1;P3=0x7f;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0x7e:break;
- case 0x7d:break;
- case 0x7b:break;
- case 0x77:break;
- }
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- //第二列
- P44=1;P42=0;P3=0xbf;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xbe:break;
- case 0xbd:break;
- case 0xbb:break;
- case 0xb7:break;
- }
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- //第三列
- P44=1;P42=1;P3=0xdf;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xde:break;
- case 0xdd:break;
- case 0xdb:break;
- case 0xd7:break;
- }
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- //第四列
- P44=1;P42=1;P3=0xef;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delayms(5);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee:break;
- case 0xed:break;
- case 0xeb:break;
- case 0xe7:break;
- }
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- }
- }
- //********************数码管显示函数******************//
- //第一、二个数码管
- void display1(uchar yi,uchar er)
- {
- P2|=0xc0;P2&=0xdf;P0=0x01;
- P2|=0xe0;P2&=0xff;P0=tab[yi];
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温度采集与控制.rar
(41.16 KB, 下载次数: 63)
|