|
用的是STC89C52單片機(jī),圖中四個(gè)非門(mén)是相當(dāng)于四個(gè)三極管,在仿真中閑麻煩就用非門(mén)代替。
1.jpg (93.81 KB, 下載次數(shù): 86)
下載附件
2016-8-2 09:46 上傳
實(shí)際效果
1.jpg (33.85 KB, 下載次數(shù): 64)
下載附件
2016-8-2 09:49 上傳
2.jpg (103.27 KB, 下載次數(shù): 89)
下載附件
2016-8-2 09:49 上傳
3.jpg (94.62 KB, 下載次數(shù): 79)
下載附件
2016-8-2 09:49 上傳
4.jpg (88.74 KB, 下載次數(shù): 74)
下載附件
2016-8-2 09:49 上傳
5.jpg (87.26 KB, 下載次數(shù): 100)
下載附件
2016-8-2 09:49 上傳
- #include<reg52.h>
- #include<intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
-
- uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
- uchar code wei[] = {0x01,0x02,0x04,0x08};
- sbit DQ = P3^7;
- sbit digt1=P2^0;
- sbit digt2=P2^1;
- sbit digt3=P2^2;
- sbit digt4=P2^3;
- uchar DS18B20_IS_OK;
- uchar CurrentT = 0;
- uchar Temp_Value[]={0x00,0x00};
- uchar Display_Digit[]={0,0,0,0};
- void delayus(uint us)
- {
- while(--us);
- }
- void delay(uint ms)
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
- uchar Init_DS18B20() //18B20初始化
- {
- uchar status;
- DQ = 1; //總線(xiàn)拉高
- delayus(8); // 12MHz晶振,20us左右
- DQ = 0;
- delayus(90); //720us左右
- DQ = 1; //釋放總線(xiàn)
- delayus(8);
- status=DQ;
- delayus(20); //160us左右
- DQ=1;
- return status;
- }
- uchar ReadOneByte()
- {
- uchar i,dat=0;
- DQ = 1;
- _nop_();
- for(i=0;i<8;i++)
- {
- DQ = 0;
- _nop_();_nop_();
- dat >>= 1;
- DQ = 1;
- _nop_();
- _nop_();
- if(DQ)
- dat |= 0X80;
- delayus(30);
- DQ = 1;
- }
- return dat;
- }
- void WriteOneByte(uchar dat) //18B20寫(xiě)數(shù)據(jù)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat& 0x01;
- delayus(3);
- DQ = 1;
- dat >>= 1; //右移一位
- }
- }
- void Read_Temperature() //讀取溫度
- {
- if(Init_DS18B20()==1)
- DS18B20_IS_OK=0;
- else
- {
- WriteOneByte(0xcc); //跳過(guò)序列號(hào)
- WriteOneByte(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneByte(0xcc);
- WriteOneByte(0xbe); //讀取溫度
- Temp_Value[0] = ReadOneByte(); //低八位
- Temp_Value[1] = ReadOneByte(); //高八位
- DS18B20_IS_OK=1;
- }
- }
- void Display_Temperature()
- {
-
- uchar t = 150, ng =0xff, a , b;
- if((Temp_Value[1]&0xf8)==0xf8) //判斷高5位,如果都為1則是負(fù)數(shù)
- {
- Temp_Value[1] = ~Temp_Value[1]; //如果為負(fù)數(shù)。高八位需要取反,第八位需要取反后加1.
- Temp_Value[0] = ~Temp_Value[0]+1;
- if(Temp_Value[0]==0x00)
- Temp_Value[1]++;
- ng = 10;
-
- }
- a=Temp_Value[0]&0x0f; //小數(shù)點(diǎn)后一位算法
- b=a*0.0625*10;
- /*----0度以上的數(shù)值顯示-----*/
- Display_Digit[0]=ng;
- CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4); //整數(shù)值
- Display_Digit[1] = CurrentT/10; //百位 CurrentT%1000/100;
- Display_Digit[2] = CurrentT%10; //十位 CurrentT%100/10;
- Display_Digit[3] = b%10; //個(gè)位 CurrentT%10;
-
- }
- void display(uchar ge,uchar shi,uchar bai,uchar fu) //數(shù)碼管掃描
- {
- P2=0X00;
- delayus(30);
- if(table[fu]==0x40) ////////
- {
- digt1=1; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- }
- else
- {
- digt1=0; //加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- }
- P0=table[fu];
- delay(3);
- digt1=0; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
-
- if(table[bai]==0x3f)
- {
- digt2=0; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- }
- else
- {
- digt2=1; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- }
- P0=table[bai];
- delay(3);
- digt2=0; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- digt3=1; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- P0=table[shi]+0X80;
- delay(3);
- digt3=0; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- digt4=1; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
- P0=table[ge];
- delay(3);
- digt4=0; //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
-
- }
- void main()
- {
- P0=0XFF;
- P2=0X00;
- // delayus(10);
- Read_Temperature();
- delay(500);
- delay(500);
- while(1)
- {
- display(Display_Digit[3],Display_Digit[2],Display_Digit[1],Display_Digit[0]);
- Read_Temperature();
- if(DS18B20_IS_OK)
- Display_Temperature();
- delayus(3);
-
- }
- }
復(fù)制代碼
0.png (75.61 KB, 下載次數(shù): 80)
下載附件
2016-8-2 23:31 上傳
全部資料51hei下載地址:
數(shù)碼管溫度顯示.zip
(54.94 KB, 下載次數(shù): 180)
2016-8-2 09:44 上傳
點(diǎn)擊文件名下載附件
5 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|