【Proteus仿真】DS18B20+报警温度可调+LM016显示 【Proteus仿真】DS18B20+报警温度可调+LM016显示
主程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 #include<reg52.h> #include<1602.h> #include<intrins.h> sbit ds = P2^2;//ds18b20 sbit beep = P2^3;//蜂鸣器报警 sbit rd = P3^7; bit flag; uchar ds_rom[8]; uchar H,L,Key_value; void TempDelay(uchar us) { while(us--); //6.51us } void ds\_reset() { ds=1; \_nop\_(); ds=0; TempDelay(80);//520us ds=1; TempDelay(5); if(ds==0) flag=1; else flag=0; TempDelay(20); ds=1; } bit ds\_read\_bit() { bit dat; ds=0; \_nop\_(); \_nop\_(); ds=1; \_nop\_(); dat=ds; TempDelay(12); return dat; } uchar ds\_read\_byte() { uchar i,j,value; for(i=0;i<8;i++) { j=ds\_read\_bit(); value=(j<<7)|(value>>1); } return value; } void ds\_write\_byte(uchar dat) { uchar i,onebit; for(i=0;i<8;i++) { onebit=dat&0x01; if(onebit) //д1 { ds=0; TempDelay(1); ds=1; \_nop\_(); } else //д0 { ds=0; TempDelay(11); ds=1; \_nop\_(); } dat>>=1; } } void ds\_change() { ds\_reset(); ds\_write\_byte(0xcc); ds\_write\_byte(0x44); } uchar get\_temperature() { uint temp; uchar a,b,c; ds\_reset(); ds\_write\_byte(0xcc); ds\_write\_byte(0xbe); a=ds\_read\_byte(); b=ds\_read\_byte(); temp=b; temp<<=8; temp|=a; c = temp\*0.0625; return c; } void key() { Key_value = P3; Key_value = Key_value & 0x0f; if ( Key_value != 0x0f ) { delay(120); if(Key_value != 0x0f ){ switch(Key_value) { case 0x0e: H++; break;//P30 case 0x0d: H--; break;//P31 case 0x0b: L++; break;//P32 case 0x07: L--; break;//P33 } } } } void main() { uchar i; rd = 0; init\_1602(); write\_com( 0x80 + 0 + 3); write\_data( 'H' ); write\_com( 0x80 + 0 + 8); write\_data( 'L' ); lcd\_distostr(1,1,0); H = 40; L = 10; while(1) { ds\_change(); i = get\_temperature(); lcd\_dis( 1,14,uchartostr( i ) ); lcd\_dis( 0,5,uchartostr( H ) ); lcd\_dis( 0,10,uchartostr( L ) ); if ( i >= H || i <= L) { beep = 0; } else { beep = 1; } key(); } }
程序源码和仿真资源
本实验基于Proteus8.12平台。
1 2 3 链接:https://pan.baidu.com/s/1cNOvEdcso85SK95N7-QrSA 提取码:okxs
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!