1、系統工作原理 TC72溫度數字傳感器能夠讀取從-55℃至+125℃范圍內的溫度,可用于連續溫度轉換模式或單次轉換模式。連續溫度轉換模式每隔約150ms測量溫度并將溫度存儲在溫度寄存器中。相反,單次轉換模式只進行單次溫度測量,然后轉換到節能的關斷模式。該傳感器具有的串行接口能夠與主控制器或其它外設通信。TC72接口兼容SPI協議。TC72不需要額外的外部元器件。 本系統以MCS-51系列單片機為核心器件,組成一個溫度傳感器,采用數字溫度傳感器TC72為檢測器件,進行單點溫度檢測,檢測精度為±0.5攝氏度。溫度顯示采用LCD1602顯示,兩位整數,一位小數。 2、系統硬件原理圖 圖1.系統硬件原理圖
3、程序流程圖 采用AT89C51單片機作為控制核心對溫度傳感器TC72控制,讀取溫度信號并進行計算處理,并送到液晶顯示器LCD1602顯示。 按照系統設計功能的要求,確定系統由3個模塊組成:主控制器、測溫電路和顯示電路。程序設計流程圖如下:
圖2.程序流程圖 4、程序清單 系統程序主要包括主程序、讀出溫度子程序、溫度轉換子程序、計算溫度子程序、顯示程序、延時程序等等。主程序主要功能是完成TC72的初始化工作,并進行讀溫度,將溫度轉化成為字符型數據并在顯示器上顯示傳感器所測得的實際溫度。讀出溫度子程序的主要功能是讀出RAM中的9字節,在讀出時需要進行CRC校驗,校驗有錯時不進行溫度數據的改寫。
5、Proteus仿真調試結果及分析
PROTEUS 是單片機課堂教學的先進助手。PROTEUS不僅可以將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當程度上得到實物演示實驗的效果,后者則是實物演示實驗難以達到的效果。它的元器件、連接線路等卻和傳統的單片機實驗硬件高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟件調試、運行結果等。 在PROTEUS繪制好原理圖后,調入已編譯好的目標代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態和過程。 SPI接口TC72溫度傳感器應用測試課題仿真調試結果如下: 第一步:編寫C語言程序,編譯成功0 error;0 warning;并生成HEX文件; 第二步:繪制仿真圖,檢查無誤,導入HEX文件,運行結果:LCD亮但不顯示TC72溫度傳感器溫度; 第三步:檢查源程序及仿真圖,無法發現錯誤; 第四步:咨詢老師,經檢查缺少LCD1602液晶顯示屏控制與顯示程序; 第五步:修改程序即在已建工程中新建并編寫LCD1602液晶顯示屏控制與顯示程序,編譯成功,生成HEX文件,導入Proteus仿真圖運行成功 第六步:送老師檢查通過。 圖3.仿真結果圖 元件清單 - //-----------------------------------------------------------------
- // 名稱: SPI接口溫度傳感器TC72應用測試
- //-----------------------------------------------------------------
- // 說明: 本例運行時,單片機將持續從TC72傳感器讀取溫度數據并轉換為
- // 浮點型字符串送LCD顯示(內置SPI接口需要在實物電路測試)
- //
- //-----------------------------------------------------------------
- #include <REG51.H>
- #include <intrins.h>
- #include <stdio.h>
- #include <math.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- //SPI使能與禁用(注意TC72是高電平使能,低電平禁用)
- #define SPI_EN() P1 |= (1<<4)
- #define SPI_DI() P1 &= ~(1<<4)
- //TC72寄存器地址定義
- #define TC72_CTRL 0x80 //控制寄存器
- #define TC72_TEMP_LSB 0x01 //溫度低字節
- #define TC72_TEMP_MSB 0x02 //溫度高字節
- #define TC72_MANU_ID 0x03 //制造商ID
- //SPI接口引腳定義(模擬方式)
- sbit SCK = P3^4; //串行時鐘
- sbit CE = P3^5; //片選
- sbit SDI = P3^6; //串行數據輸入
- sbit SDO = P3^7; //串行數據輸出
- //內置SPI寄存器及寄存器位定義
- //SPCON C3h SPI Control SPR2 SPEN SSDIS MSTR CPOL CPHA SPR1 SPR0
- //SPSTA C4h SPI Status SPIF WCOL SSERR MODF - - - -
- //SPDAT C5h SPI Data SPD7 SPD6 SPD5 SPD4 SPD3 SPD2 SPD1 SPD0
- sfr SPCON = 0xC3;
- sfr SPSTA = 0xC4;
- sfr SPDAT = 0xC5;
- extern void Initialize_LCD();
- extern void LCD_ShowString(INT8U r, INT8U c,INT8U *str);
- extern void delay_ms(INT16U x);
- INT8U T[2]; //兩字節原始溫度數據
- float TempX = 0.0; //浮點溫度值
- //-----------------------------------------------------------------
- // SPI主機初始化
- //-----------------------------------------------------------------
- void SPI_MasterInit()
- {
- SPCON=0xD0;
- SPSTA=0xC0;
- }
-
- //-----------------------------------------------------------------
- // SPI數據傳輸
- //-----------------------------------------------------------------
- INT8U SPI_SendData(INT8U dat)
-
- {
- SPDAT=dat;
- while((SPSTA&0x80)==0x00);
- SPSTA=0xC0;
- return SPDAT;
- }
- //-----------------------------------------------------------------
- // 從當前地址讀取一字節數據(模擬方式)
- //-----------------------------------------------------------------
- INT8U ReadByte()
- {
- INT8U i,d=0x00;
- for(i=0;i<8;i++)
- {
- SCK=1;SCK=0;d=(d<<1)|SDO;
- }
- return d;
- }
- //-----------------------------------------------------------------
- // 向當前地址寫入一字節數據(模擬方式)
- //-----------------------------------------------------------------
- void WriteByte(INT8U dat)
- {
- INT8U i;
- for(i=0;i<8;i++)
- { dat<<=1;SDI=CY;
- SCK=0;SCK=1;
- }
- }
- //-----------------------------------------------------------------
- // 向TC72寫入兩字節(地址,數據)(模擬方式)
- //-----------------------------------------------------------------
- void Write_TC72(INT8U addr, INT8U dat)
- {
- CE=1;
- WriteByte(addr);
- WriteByte(dat);
- CE=0;
- }
- //-----------------------------------------------------------------
- // 寫TC72配置數據
- //-----------------------------------------------------------------
- void Config_TC72()
- {
- Write_TC72(TC72_CTRL,0x15);
- }
- //-----------------------------------------------------------------
- // 從TC72讀取兩字節溫度數據并轉換為浮點溫度值
- //-----------------------------------------------------------------
- void Read_TC72_Temperature()
- {
- Config_TC72();
- delay_ms(20);
- CE=1;
- WriteByte(TC72_TEMP_MSB);
- T[1]=ReadByte();
- T[0]=ReadByte();
- CE=0;
- TempX=(((int)((T[1]<<8)|T[0]))>>6)*0.25;
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- char DisplayBuffer[17];
- Initialize_LCD();
- LCD_ShowString(0,0,"TC72 Sensor Test");
- while(1)
- { Config_TC72();
- Read_TC72_Temperature();
- sprintf(DisplayBuffer,"%TEMP:%6.1f\xDF\x43",TempX);
- LCD_ShowString(1,0,DisplayBuffer);
- }
- }
- //-----------------------------------------------------------------
- // 液晶控制與顯示程序
- //-----------------------------------------------------------------
- #include <reg51rc2.h>
- #include <intrins.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- sbit RS = P2^0; //寄存器選擇線
- sbit RW = P2^1; //讀/寫控制線
- sbit EN = P2^2; //使能控制線
- //-----------------------------------------------------------------
- // 延時
- //-----------------------------------------------------------------
- void delay_ms(INT16U ms)
- {
- INT8U i;
- while(ms--) for(i = 0; i < 120; i++);
- }
- //-----------------------------------------------------------------
- // 忙等待
- //-----------------------------------------------------------------
- void Busy_Wait()
- {
- INT8U LCD_Status; //液晶狀態字節變量
- do
- { P0=0xff; //液晶屏端口初始置高電平
- EN=0;RS=0;RW=1; //LCD禁止,選擇狀態寄存器,準備讀
- EN=1;LCD_Status=P0; //LCD使能,從P0端口讀取液晶屏狀態字節
- EN=0; //LCD禁止
- } while (LCD_Status & 0x80); //液晶忙繼續循環
- }
- //-----------------------------------------------------------------
- // 寫LCD命令
- //-----------------------------------------------------------------
- void Write_LCD_Command(INT8U cmd)
- {
- Busy_Wait();
- RS=0;
- RW=0;
- EN=0;
- P0=cmd;
- EN=1;
- delay_ms(1);
- EN=0;
- }
- //-----------------------------------------------------------------
- // 發送數據
- //-----------------------------------------------------------------
- void Write_LCD_Data(INT8U dat)
- {
- Busy_Wait();
- RS=1;
- RW=0;
- EN=0;
- P0=dat;
- EN=1;
- delay_ms(1);
- EN=0;
- }
- //-----------------------------------------------------------------
- // LCD初始化
- //-----------------------------------------------------------------
- void Initialize_LCD()
- {
- Write_LCD_Command(0x38); delay_ms(1); //置功能,8位,雙行,5*7
- Write_LCD_Command(0x01); delay_ms(1); //清屏
- Write_LCD_Command(0x06); delay_ms(1); //字符進入模式:屏幕不動,字符后移
- Write_LCD_Command(0x0C); delay_ms(1); //顯示開,關光標
- }
- //-----------------------------------------------------------------
- // 顯示字符串
- //-----------------------------------------------------------------
- void LCD_ShowString(INT8U r, INT8U c,INT8U *str)
- {
- INT8U i = 0;
- code INT8U DDRAM[] = {0x80,0xC0}; //1602LCD兩行的起始DDRAM地址
- Write_LCD_Command(DDRAM[r] | c); //設置顯示起始位置
-
- for ( i = 0; str[i] && i < 16 ;i++) //輸出字符串
- Write_LCD_Data(str[i]);
-
- for (i=0; i < 16; i++) //不足一行時用空格填充
- Write_LCD_Data(' ');
- }
復制代碼
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便大家保存):
單片機原理及系統設計.doc
(121 KB, 下載次數: 31)
2018-6-25 15:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|