单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include<absacc.h>
- #define uint unsigned int
- #define unchar unsigned char
- unchar templ, temph, i, y, z, n;
- unchar a, b; //LCD 的变量
- unchar sign=0; //标志变量
- bit k; //判断正负变量
- sbit dq=P3^5;
- sbit rs=P2^0; //LCD 显示的定义取值
- sbit rw=P2^1;
- sbit e=P2^2;
- sbit bf=P0^7;
- sbit DQ=P2^5;
- //键盘定义
- sbit read=P3^0;
- sbit incH=P3^2;
- sbit desH=P3^3;
- sbit reset=P3^4;
- //蜂鸣器
- sbit BUZZER=P2^6;
- float t4, t5, t6, t7, tt; //温度转换的变量
- uint tp;
- unchar temperature, Htemp, Ltemp;
- unchar D1, D2, D3;
- uint D4, D5, D6, D9, D7, D8;
- unchar code dis1[]={"0123456789"} ;
- unchar code dis2[]={"temp: "} ;
- unchar code dis3[]={"WARN"} ;
- unchar code dis4[]={"Htemp: "} ;
- unchar code dis5[]={"working"} ;
- unchar code dis6[]={"Ltemp: "} ;
- bit flag_1820_1;
- bit flag_1820_2;
- void delay_ms(unsigned char time) ;
- void ledshow(void) ;
- void keypress(void) ;
- void init(void) ;
- void gettemp() ;
- void init1820(void) ;
- void write1820(unchar) ;
- unsigned char read1820(void) ;
- void delay_us(unchar) ;
- void delay3(unchar) ;
- /* 延时*/
- void delay(uint t)
- { uint i;
- while(t--)
- { for(i=0; i<121; i++)
- {}
- }
- }
- //LCD 显示函数
- void delay1(unchar time)
- { unchar n;
- n=0;
- while(n<time)
- {n++; }
- return;
- }
- void delay3(unchar x)
- { for(y=x; y>0; y--)
- for(z=x; z>0; z--) ;
- }
- unchar testBF()
- { bit result;
- rs=0;rw=1;e=1;
- _nop_() ; _nop_() ; _nop_() ; _nop_() ;
- result=bf; e=0;
- return result;
- }
- void writecmd(unchar ZL)
- { while(testBF() ==1) ;
- rs=0; rw=0; e=0;
- _nop_() ; _nop_() ;
- P0=ZL; e=1;
- _nop_() ; _nop_() ; _nop_() ; _nop_() ;
- e=0;
- }
- void pos(unchar pos)
- { writecmd(pos| 0x80) ;
- }
- void writedate(unchar date)
- {while(testBF() ==1) ;
- rs=1; rw=0; e=0;
- _nop_() ;_nop_() ;
- P0=date; e=1;
- _nop_() ; _nop_() ; _nop_() ; _nop_() ;
- e=0;
- }
- void init()
- { delay3(20) ;
- writecmd(0x38) ;
- delay3(30) ;
- writecmd(0x0d) ;
- delay3(30) ;
- writecmd(0x06) ;
- delay3(30) ;
- writecmd(0x01) ;
- delay3(30) ;
- }
- //键盘程序
- //主程序
- void main(void)
- {
- TMOD=0x01;
- TH0=50000/256;
- TL0=50000%256;
- Htemp=121;Ltemp=20;
- P3=0xFF;
- init() ;
- if(sign==0)
- {EA=1; TR0=1; ET0=1;
- EX0=0; //关闭外部中断 0
- EX1=0; //关闭外部中断 1
- while(1)
- {
- if(read==0)
- {
- delay3(2000) ;
- if(read==0)
- {sign++;}
- }
- }
- }
- if(sign==1)
- {
- BUZZER=1; //关闭蜂鸣器
- EX0=1; //开启外部中断 0
- EX1=1; //开启外部中断 1
- init() ;
- pos(0) ;
- for(i=0; i<6; )
- { writedate(dis4[i]);i++;
- }
- D6=Htemp%10;
- D7=Htemp%100/10;
- D8=Htemp/100;
- pos(0x6) ;
- writedate(dis1[D8]);
- writedate(dis1[D7]) ; }
- if(sign==2)
- {BUZZER=1; //关闭蜂鸣器
- EX0=1; //开启外部中断 0
- EX1=1; //开启外部中断 1
- init() ;
- pos(0) ;
- for(i=0; i<6; )
- { writedate(dis6[i]) ; i++; }
- D6=Htemp%10;
- D7=Htemp%100/10;
- D8=Htemp/100;
- pos(0x6) ;
- writedate(dis1[D8]) ;
- writedate(dis1[D7]) ;
- writedate(dis1[D6]) ;
- }
- if(sign>2)
- { sign=0; }
- }
- //中断程序
- void int0(void) interrupt 0
- {
- EX0=0; //关外部中断 0
- if(desH==0&&sign==1)
- {
- Htemp--;
- if(Htemp<Ltemp)
- Htemp=Ltemp;
- }
- else if(desH==0&&sign==2)
- {
- Ltemp--;
- }
- }
- /*****外部中断 1 服务程序*****/
- void int1(void) interrupt 2
- {
- EX1=0; //关外部中断 1
- if(incH==0&&sign==1)
- {
- Htemp++;
- }
- else if(incH==0&&sign==2)
- {
- Ltemp++;
- if(Ltemp>Htemp)
- Ltemp=Htemp;
- }
- }
- //定时器 T0 服务程序
- void isr_t0(void) interrupt 1
- { TH0=50000/256;
- TL0=50000%256;
- TMOD=0x10;
- TH1=50000/256;
- TL1=50000%256;
- gettemp() ;
- delay(50) ;
- if (tp<Htemp)
- { BUZZER=1;
- pos(0x04) ;
- for(i=0; i<7; )
- {
- writedate(dis5[i]) ;
- i++;
- }
- pos(0x40) ;
- for(i=0; i<5; )
- {writedate(dis2[i]) ;
- i++; }
- D1=(unchar) (tp%10) ;
- D2=(unchar) (tp%100/10) ;
- D3=(unchar) (tp/100) ;
- D4=(uint) (tt*10) ;
- D5=((uint) (tt*100) ) %10;
- if(k==1)
- {pos(0x46);
- writedate('-');}
- else
- pos(0x47);
- writedate(dis1[D3]) ;
- writedate(dis1[D2]) ;
- writedate(dis1[D1]) ;
- writedate('.');
- writedate(dis1[D4]) ;
- writedate(dis1[D5]) ;
- writedate(0xdf) ;
- writedate('C') ;
- }
- else
- { init() ;
- pos(0x04) ;
- for(i=0; i<4; )
- {
- writedate(dis3[i]) ;
- i++; }
- BUZZER=0;
- }
- }
- //DS18B20 读取温度
- void gettemp()
- {
- init1820() ;
- write1820(0xcc) ;
- write1820(0x44) ;
- init1820() ;
- write1820(0xcc) ;
- write1820(0xbe) ;
- templ=read1820() ; //低 8 位(其中的第四位是小数点后的)
- temph=read1820() ; //高 8 位(其中前五位是符号值)
- z=temph; //把符号位留下判断正负
- k=(bit) (z>>7) ;
- if(k==1) //负数就取反加一
- { templ=~templ;
- templ=templ+1;
- temph=~temph;
- }
- else
- {templ=templ;
- temph=temph; }
- n=templ;
- y=n&0x01;
- t7=y*0.0625;
- n>>=1;
- y=n&0x01; //小数点最后的数
- t4=y*0.125;
- n>>=1;
- y=n&0x01;
- t5=y*0.25;
- n>>=1;
- y=n&0x01;
- t6=y*0.5;
- tt=t4+t5+t6+t7;
- init1820() ;
- tp=temph*256+templ;
- temperature=tp;
- tp=tp>>4;
- }
- //1820 初始化
- void init1820()
- {
- DQ = 1; _nop_() ;
- DQ = 0;
- delay_us(120) ; //延时 510us,
- delay_us(120) ;
- DQ = 1;
- delay_us(15) ;
- while(DQ)
- { _nop_() ; }
- delay_us(60) ;
- DQ = 1;
- }
- //******write********
- void write1820(unchar a)
- {
- unchar i;
- for(i=0; i<8; i++)
- {if(a & 0x01) //低位在前;
- {DQ = 0;
- _nop_() ; _nop_() ; _nop_() ;
- DQ = 1; }
- else
- DQ = 0;
- _nop_() ; _nop_() ; _nop_() ;
- delay_us(30) ;
- DQ = 1;
- _nop_() ;
- a >>= 1;
- }
- }
- //*******read************
- unsigned char read1820(void)
- {
- unsigned char i;
- unsigned char tmp=0;
- DQ = 1; _nop_() ;
- for(i=0; i<8; i++)
- {
- tmp >>= 1;
- DQ = 0;
- _nop_() ;
- DQ = 1;
- delay_us(2) ;
- _nop_() ;
- if(DQ)
- tmp |= 0x80;
- delay_us(30) ;
- DQ = 1; _nop_() ;
- }
- return tmp; }
- void delay_us(unchar a)
- {
- while(--a) ;
- }
- void delay_ms(unchar a)
- {
- unchar i, j;
- for(i=0; i<a; i++)
- for(j=0; j<200; j++)
- {
- _nop_() ;
- _nop_() ;
- }
- }
复制代码
|