熱電偶資料電路原理圖如下:
單片機源程序如下:
- /********************************************************************
- 開發環境:Keil
- 單片機:AT89S52-24PU 晶振:12 MZ
- 程序描述: K型熱電偶+MAX6675,LCD1602 顯示
- 注:1:本程序沒有作斷偶檢測,請根據實際情況參考DATASHEET 編寫
- 2:本程序只供學習參考之用,請勿用于其它用途!!參考請自行驗證程序正確性及可靠性!!!
- **************************定義頭文件*****************************************/
- #include <reg52.h>
- #include<intrins.h>
- /*******************************************************************/
- //lcd part
- #define LINE1 0
- #define LINE2 1
- #define LINE1_HEAD 0x80
- #define LINE2_HEAD 0xC0
- #define LCD_DELAY_TIME 40
- #define DATA_MODE 0x38
- #define OPEN_SCREEN 0x0C
- #define DISPLAY_ADDRESS 0x80
- #define CLEARSCREEN LCD_en_command(0x01)
- #define HIGH 1
- #define LOW 0
- #define TRUE 1
- #define FALSE 0
- #define ZERO 0
- #define MSB 0x80
- #define LSB 0x01
- /*******************************************************************/
- #define LCDIO P0
- sbit led1=P1^0;
- sbit LCD1602_RS=P3^5;//P2^0; //設置RS
- sbit LCD1602_RW=P3^6;//P2^1; //設置RW
- sbit LCD1602_EN=P3^4;//P2^2; //設置E
- sbit MAX6675_SO=P1^6;//P2^4;
- sbit MAX6675_SCK=P1^7;//P2^5;
- sbit MAX6675_CS=P2^0;
- unsigned char data disdata[5];
- unsigned int Value;
- /********************************************************************/
- void LCD_delay(void);//LCD延時函數
- void LCD_en_command(unsigned char command);//LCD寫指令
- void LCD_en_dat(unsigned char temp);//LCD寫數據
- void LCD_set_xy( unsigned char x, unsigned char y );//設置LCD顯示位置
- void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//向LCD寫入一個字符
- void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//向LCD寫入一串字符
- void LCD_init(void);//LCD初始化函數
- /********************************************************************/
- void delay_nms(unsigned int n);//延時函數
- /********************************************************************/
- /***********************從MAX6675讀取溫度*********************************************/
- unsigned int ReadMAX6675()
- {
- unsigned char count;
- MAX6675_CS=1; //關閉MAX6675
- //_nop_();
- // _nop_();
- MAX6675_CS=0;//置低,使能MAX6675
- //_nop_();
- MAX6675_SCK=1;
- Value=0;
- //_nop_();
- //_nop_();
- for(count=16;count>0;count--) //獲取16位MSB
- {
- MAX6675_SCK=0; //sck置低
- Value=Value<<1; //左移
- if(MAX6675_SO==1) //取當前值
- Value|=0x0001;
- else
- Value&=0xffff;
- MAX6675_SCK=1;
- //_nop_();
- //_nop_();
- //_nop_();
- //_nop_();
- }
- MAX6675_CS=1; //關閉MAX6675
- return Value;
- }
- /***************************************************************************************/
- /**************************溫度值顯示 **************************************************/
- void tempdisp()
- {
- unsigned int temp;
- unsigned int TempValue;
- // unsigned int testD2;
- unsigned int xiaoshu;
-
- TempValue=ReadMAX6675();//讀取MAX6675 轉換后的溫度數值;
- TempValue=TempValue<<1; //去掉第15位
- TempValue=TempValue>>4;//去掉第0~2位
- xiaoshu=TempValue*10;
- TempValue=TempValue/4; //MAX6675最大數值為1023。75,而AD精度為12位,即2的12次方為4096,轉換對應數,故要除4;
- xiaoshu=xiaoshu/4; //與上述同理
- if(TempValue>=1024)
- {TempValue=1024;}
- disdata[0]=(TempValue/1000)%10+0x30;//千位 +0x30是對應LCD里的ROM字符位置編碼
- disdata[1]=(TempValue/100)%10+0x30;//百位 +0x30是對應LCD里的ROM字符位置編碼
- disdata[2]=(TempValue/10)%10+0x30;//十位 +0x30是對應LCD里的ROM字符位置編碼
- disdata[3]=(TempValue)%10+0x30;//個位 +0x30是對應LCD里的ROM字符位置編碼
- disdata[4]=xiaoshu%10+0x30;//分位 +0x30是對應LCD里的ROM字符位置編碼
- if(disdata[0]==0x30)
- {
- LCD_write_char(4,LINE2,0x20); //顯示千位
- if(disdata[1]==0x30)
- { LCD_write_char(5,LINE2,0x20);
- if(disdata[2]==0x30)
- LCD_write_char(6,LINE2,0x20);
- else LCD_write_char(6,LINE2,disdata[2]); //顯示十位
- }
- else
- { LCD_write_char(5,LINE2,disdata[1]); //顯示百位
- LCD_write_char(6,LINE2,disdata[2]); //顯示十位
- }
- }
- else
- {
- LCD_write_char(4,LINE2,disdata[0]); //顯示千位
- LCD_write_char(5,LINE2,disdata[1]); //顯示百位
- LCD_write_char(6,LINE2,disdata[2]); //顯示十位
- }
- // LCD_write_char(6,LINE2,disdata[2]); //顯示十位
- LCD_write_char(7,LINE2,disdata[3]); //顯示個位
- LCD_write_char( 8,LINE2,0X2e);//顯示"點"
- LCD_write_char(9,LINE2,disdata[4]); //顯示分位
- LCD_write_char( 10,LINE2,0XDF);//顯示"度"
- LCD_write_char( 11,LINE2,0X43);//顯示"C"
-
- }
- /****************************主 程 序********************************************************/
- void main(void)
- {
- delay_nms(10);
- LCD_init(); //LCD初始化
- delay_nms(50);
- CLEARSCREEN; //清屏
- delay_nms(10);
- LCD_write_string(0,LINE1,"temperature TEST");
- while(TRUE )
- {
- led1=0;
- tempdisp();
- delay_nms(220);
- }
- }
- /********************************************************************/
- /******************** LCD 函數部份 ***********************************/
- void LCD_delay(void)
- {
- unsigned char i;
- for(i=LCD_DELAY_TIME;i>ZERO;i--)
- ;
- }
- /********************************************************************/
- void LCD_en_command(unsigned char command)
- {
- LCD_delay();
- LCD1602_RS=LOW;
- LCD1602_RW=LOW;
- LCD1602_EN=HIGH;
- LCDIO=command;
- LCD1602_EN=LOW;
- }
- /********************************************************************/
- void LCD_en_dat(unsigned char dat)
- {
- LCD_delay();
- LCD1602_RS=HIGH;
- LCD1602_RW=LOW;
- LCD1602_EN=HIGH;
- LCDIO=dat;
- LCD1602_EN=LOW;
- }
- /********************************************************************/
- void LCD_set_xy( unsigned char x, unsigned char y )
- {
- unsigned char address;
- if (y == LINE1)
- address = LINE1_HEAD + x;
- else
- address = LINE2_HEAD + x;
- LCD_en_command(address);
- }
- /********************************************************************/
- void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
- {
- LCD_set_xy( x, y );
- LCD_en_dat(dat);
- }
- /********************************************************************/
- void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
- {
- LCD_set_xy( X, Y );//設置顯示XY地址
- while (*s) // 寫字符
- {
- LCDIO=*s;
- LCD_en_dat(*s);
- s ++;
- }
- }
- /********************************************************************/
- void LCD_init(void)
- { CLEARSCREEN;//clear screen
- LCD_en_command(DATA_MODE);//8位模式
- LCD_en_command(DATA_MODE);
- LCD_en_command(DATA_MODE);
- LCD_en_command(DATA_MODE);
- LCD_en_command(OPEN_SCREEN);//開顯示
- LCD_en_command(DISPLAY_ADDRESS);//設定顯示起始位
- CLEARSCREEN;//清屏
- }
- /********************************************************************/
- /*********************** 延時 *********************************/
- void delay_nms(unsigned int n)
- {
- unsigned int i=0,j=0;
- for (i=n;i>0;i--)
- for (j=0;j<1140;j++);
- }
- /********************************************************************/
復制代碼
所有資料51hei提供下載:
K型熱電偶MAX6675資料.zip
(197.02 KB, 下載次數: 98)
2019-5-19 20:47 上傳
點擊文件名下載附件
|