89c51+ds18b20實(shí)現(xiàn)溫度檢測及設(shè)定
文檔中有原理圖及程序。親測可行
1.001.jpg (51.98 KB, 下載次數(shù): 36)
下載附件
2017-8-2 17:44 上傳
數(shù)碼管采用共陽數(shù)碼管
1.002.jpg (9.33 KB, 下載次數(shù): 35)
下載附件
2017-8-2 17:44 上傳
1.003.jpg (12.71 KB, 下載次數(shù): 39)
下載附件
2017-8-2 17:44 上傳
共陽數(shù)碼管結(jié)構(gòu)圖 數(shù)碼管上對應(yīng)的各段
例如:1的字形碼為 0xf9;0為0xc0;
1.004.jpg (38.17 KB, 下載次數(shù): 28)
下載附件
2017-8-2 17:44 上傳
矩陣式鍵盤的優(yōu)缺點(diǎn):在按鍵多時(shí),占用的I/O少,但程序編寫復(fù)雜。
獨(dú)立式鍵盤的優(yōu)缺點(diǎn):占用的I/O多,但程序編寫簡單。 本次設(shè)計(jì)為獨(dú)立鍵盤(所選單片機(jī)I/O足夠用)
1.005.jpg (1.41 KB, 下載次數(shù): 30)
下載附件
2017-8-2 17:44 上傳
1.006.jpg (4.64 KB, 下載次數(shù): 38)
下載附件
2017-8-2 17:44 上傳
1.007.jpg (4.63 KB, 下載次數(shù): 36)
下載附件
2017-8-2 17:44 上傳
程序(此程序只能做到左側(cè)兩個數(shù)碼管顯示設(shè)定溫度,右側(cè)兩個數(shù)碼管顯示測量的溫度,并沒有實(shí)現(xiàn)溫度的控制調(diào)節(jié)功能)
單片機(jī)源程序如下:
- #include //52系列頭文件
- #include //特殊寄存器頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #include
-
- //--定義要使用的IO口--//
-
- #define GPIO_DIG P0 //段選
- #define GPIO_PLACE P2 //位選
- sbit DSPORT=P3^7;
- unsigned char code DIG_PLACE[8] = {
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制 查表的方法控制
- unsigned char code DIG_CODE[17] = {
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
- unsigned char DisplayData[5];//用來存放要顯示的8位數(shù)的值
- void Delay10ms(unsigned int c); //延時(shí)10ms
- void Key_Scan();
- void DigDisplay();
- uchar Ds18b20Init(); //初始化程序
- sbit key1=P3^4; //設(shè)定溫度加
- sbit key2=P3^5; //設(shè)定溫度減
- void Ds18b20WriteByte(uchar dat); //寫一個字節(jié)
- uchar Ds18b20ReadByte(); //讀一個字節(jié)
- void Ds18b20ChangTemp(); //轉(zhuǎn)換溫度
- void Ds18b20ReadTempCom(); //發(fā)送讀取溫度命令
- int Ds18b20ReadTemp(); //讀取溫度命令
- int sdtemp1=30;
- int wendu; //定義臨時(shí)變量
- /********************主程序*****************************************8 */
- void main(void)
- {
- while (1)
- {
- Key_Scan();
- DigDisplay();
- DisplayData[0]=DIG_CODE[sdtemp1/10];
- DisplayData[1]=DIG_CODE[sdtemp1%10];
- wendu=Ds18b20ReadTemp();
- wendu=wendu>>4;
- DisplayData[2] = DIG_CODE[wendu%100/10];
- DisplayData[3] = DIG_CODE[wendu % 10];
-
-
-
- }
- }
-
- /***************按鍵掃描程序*******************************************/
- void Key_Scan()
- {
- //--檢測按鍵1--//
- if (key1== 0) //檢測按鍵K1是否按下
- {
- Delay10ms(1); //消除抖動
- if (key1== 0) //再次檢測按鍵是否按下
- { //DigDisplay();
- sdtemp1=sdtemp1+1;
- if(sdtemp1>99) sdtemp1=30;
- // DigDisplay();
- while (!key1 ) //檢測按鍵是否松開
- {//Delay10ms(20);
- DigDisplay();
-
- }
-
- }
- }
-
- if (key2== 0) //檢測按鍵K1是否按下
- { DigDisplay();
- Delay10ms(1); //消除抖動
-
- if (key2== 0) //再次檢測按鍵是否按下
- { DigDisplay();
- sdtemp1=sdtemp1-1;
- if(sdtemp1<15) sdtemp1=15;
-
- while (!key2 ) //檢測按鍵是否松開
- { //Delay10ms(2);
- DigDisplay();
-
- }
- }
- }
- }
- /***************************************************
- 函數(shù)名 :Delay
- 函數(shù)功能 :延時(shí)
- 輸入 :無
- 輸出 :無
- ***************************************************/
- void Delay10ms(unsigned int c) //誤差 0us
- {
- unsigned char a, b;
-
- //--c已經(jīng)在傳遞過來的時(shí)候已經(jīng)賦值了,所以在for語句第一句就不用賦值了--//
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
-
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : DigDisplay
- * 函數(shù)功能 : 使用數(shù)碼管顯示
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
-
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
-
-
- for(i=0; i<4; i++)
- {
- GPIO_PLACE = DIG_PLACE[i]; //發(fā)送位選
- GPIO_DIG = DisplayData[i]; //發(fā)送段碼
-
- j = 80; //掃描間隔時(shí)間設(shè)定
- while(j--);
- GPIO_DIG = 0xFF;//消隱
- }
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20Init
- * 函數(shù)功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
-
- uchar Ds18b20Init()
- {
- uchar i;
- DSPORT = 0; //將總線拉低480us~960us
- i = 70;
- while(i--);//延時(shí)642us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- DigDisplay();
- // Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
-
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20WriteByte
- * 函數(shù)功能 : 向18B20寫入一個字節(jié)
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
-
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個數(shù)值
- dat >>= 1;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadByte
- * 函數(shù)功能 : 讀取一個字節(jié)
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
-
- uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
- bi = DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- /*將byte右移移一位,然后與上左移7位后的bi,注意移動之后移掉那位補(bǔ)0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數(shù)
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ChangTemp
- * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- DigDisplay();// Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- // Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時(shí)了
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadTempCom
- * 函數(shù)功能 : 發(fā)送讀取溫度命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20ReadTempCom()
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
所有文檔.doc
(115.5 KB, 下載次數(shù): 33)
2017-8-2 15:21 上傳
點(diǎn)擊文件名下載附件
原理圖及程序 下載積分: 黑幣 -5
|