89c51+ds18b20實現溫度檢測及設定
文檔中有原理圖及程序。親測可行
1.001.jpg (51.98 KB, 下載次數: 36)
下載附件
2017-8-2 17:44 上傳
數碼管采用共陽數碼管
1.002.jpg (9.33 KB, 下載次數: 35)
下載附件
2017-8-2 17:44 上傳
1.003.jpg (12.71 KB, 下載次數: 39)
下載附件
2017-8-2 17:44 上傳
共陽數碼管結構圖 數碼管上對應的各段
例如:1的字形碼為 0xf9;0為0xc0;
1.004.jpg (38.17 KB, 下載次數: 28)
下載附件
2017-8-2 17:44 上傳
矩陣式鍵盤的優缺點:在按鍵多時,占用的I/O少,但程序編寫復雜。
獨立式鍵盤的優缺點:占用的I/O多,但程序編寫簡單。 本次設計為獨立鍵盤(所選單片機I/O足夠用)
1.005.jpg (1.41 KB, 下載次數: 30)
下載附件
2017-8-2 17:44 上傳
1.006.jpg (4.64 KB, 下載次數: 38)
下載附件
2017-8-2 17:44 上傳
1.007.jpg (4.63 KB, 下載次數: 36)
下載附件
2017-8-2 17:44 上傳
程序(此程序只能做到左側兩個數碼管顯示設定溫度,右側兩個數碼管顯示測量的溫度,并沒有實現溫度的控制調節功能)
單片機源程序如下:
- #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位數的值
- void Delay10ms(unsigned int c); //延時10ms
- void Key_Scan();
- void DigDisplay();
- uchar Ds18b20Init(); //初始化程序
- sbit key1=P3^4; //設定溫度加
- sbit key2=P3^5; //設定溫度減
- void Ds18b20WriteByte(uchar dat); //寫一個字節
- uchar Ds18b20ReadByte(); //讀一個字節
- void Ds18b20ChangTemp(); //轉換溫度
- void Ds18b20ReadTempCom(); //發送讀取溫度命令
- int Ds18b20ReadTemp(); //讀取溫度命令
- int sdtemp1=30;
- int wendu; //定義臨時變量
- /********************主程序*****************************************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();
-
- }
- }
- }
- }
- /***************************************************
- 函數名 :Delay
- 函數功能 :延時
- 輸入 :無
- 輸出 :無
- ***************************************************/
- void Delay10ms(unsigned int c) //誤差 0us
- {
- unsigned char a, b;
-
- //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
-
- }
- }
- /*******************************************************************************
- * 函 數 名 : DigDisplay
- * 函數功能 : 使用數碼管顯示
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
-
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
-
-
- for(i=0; i<4; i++)
- {
- GPIO_PLACE = DIG_PLACE[i]; //發送位選
- GPIO_DIG = DisplayData[i]; //發送段碼
-
- j = 80; //掃描間隔時間設定
- while(j--);
- GPIO_DIG = 0xFF;//消隱
- }
-
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20Init
- * 函數功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
-
- uchar Ds18b20Init()
- {
- uchar i;
- DSPORT = 0; //將總線拉低480us~960us
- i = 70;
- while(i--);//延時642us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- DigDisplay();
- // Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
-
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20WriteByte
- * 函數功能 : 向18B20寫入一個字節
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
-
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數據之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數據,從最低位開始
- i=6;
- while(i--); //延時68us,持續時間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
- dat >>= 1;
- }
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadByte
- * 函數功能 : 讀取一個字節
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
-
- uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時6us等待數據穩定
- bi = DSPORT; //讀取數據,從最低位開始讀取
- /*將byte右移移一位,然后與上左移7位后的bi,注意移動之后移掉那位補0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ChangTemp
- * 函數功能 : 讓18b20開始轉換溫度
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- DigDisplay();// Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉換命令
- // Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
-
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadTempCom
- * 函數功能 : 發送讀取溫度命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
-
- void Ds18b20ReadTempCom()
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
所有文檔.doc
(115.5 KB, 下載次數: 33)
2017-8-2 15:21 上傳
點擊文件名下載附件
原理圖及程序 下載積分: 黑幣 -5
|