最近在用STC12C5A60S2的1T單片機做DS18B20的溫度監控電路,晶振11.0592MHz。電路一直讀不出正確的溫度值,剛開始以為是1us軟件延時有問題,不過試了好幾種軟件延時方式結果都是一樣,麻煩各位有做過1T單片機的溫度監控的大蝦幫忙看看問題究竟出在哪里,謝謝!
溫度是用串口助手輸出的,溫度值一直讀取到的是160.00℃。
11.png (15.93 KB, 下載次數: 58)
下載附件
2019-6-9 14:38 上傳
這是兩路溫度監控用串口讀取的數值
下面為源代碼:
- /************************************************************
- STC12C5A60S2 11.0592MHz
- ************************************************************/
- #include <STC12C5A60S2.h>
- #include <intrins.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define nop _nop_()
- #define RECEIVE_SIZE 255
- #define SEND_TEMP_ELECTRICITY_VALUE 0XFF
- #define SEND_TEMP1_VALUE 0X00
- #define SEND_TEMP2_VALUE 0X01
- sbit TP2_alm = P2^2;
- sbit TP1_alm = P2^1;
- sbit F_PG = P1^4;
- sbit F_pwm = P1^3;
- sbit TP2 = P1^1;
- sbit TP1 = P1^0;
- uint n2, ValueDelayCount=0, CT_conut1 = 0, CT_conut2 = 0;
- uint ReceiveBuf[6]=0,ReceiveTotal=0;
- float value = 0;
- int temp1, temp2;
- char *reg;
- char temp1buf[6] = 0, temp2buf[6] = 0;
- int len1 = 0, len2 = 0;
- const double eps = 1e-11;
- void T1init(void){
- AUXR |= 0x40;
- TMOD &= 0x0F;
- TMOD |= 0x10;
- TL1 = 0xCD;
- TH1 = 0xD4;
- TF1 = 0;
- TR1 = 1;
- ET1=1;
- EA=1;
- }
- void delay_ms(uint n){
- uint i,j;
- for (i=0;i<n*10;i++)
- for(j=0;j<363;j++);
- }
- /*
- void delay_us(uint t){
- do{
- nop; nop;
- nop; nop;
- nop; nop;
- nop; nop;
- nop; nop;
- }while(t--);
- }
- */
- void delay_us(uchar t){ // 延時:1.6us~232us
- uchar i;
- for(i = t; i > 0 ; i--);
- }
- /*
- void Delay_T0(uint t) { // t = time(us) * fosc(MHz) - 45 延時:5us ~ 5ms
- AUXR |= 0x80;
- TMOD &= 0xF0;
- TMOD |= 0x01;
-
- t = 65536 - t;
- TL0 = t;
- TH0 = t >> 8;
-
- TR0 = 1;
-
- while (!TF0);
- TR0 = 0;
- TF0 = 0;
- }
- */
- void UART1_Init(void){ // 115200bps @11.0592MHz
- PCON &= 0x7F;
- SCON = 0x50;
- AUXR |= 0x04;
- BRT = 0xFD;
- AUXR |= 0x01;
- AUXR |= 0x10;
- ES = 1;
- }
- void SendByte(uint SendData){
- SBUF = SendData;
- while(TI == 0);
- TI = 0;
- }
- /*************************************
- * DS18B20溫度傳感器控制函數 *
- *************************************/
- void TP1_DS18B20_Rst(void){
- TP1 = 0;
- delay_us(250);
- delay_us(250);
- delay_us(250); // 延時 750us
- TP1 = 1;
- delay_us(15); // 延時 15us
- nop;
- }
- void TP2_DS18B20_Rst(void){
- TP1 = 0;
- delay_us(250); // 延時 750us
- delay_us(250);
- delay_us(250);
- TP1 = 1;
- delay_us(15); // 延時 15us
- }
- uint TP1_DS18B20_Check(void){
- uint retry=0;
- while(TP1&&retry<200){
- retry++;
- delay_us(1);
- }
- if(retry>=200)
- return 1;
- else
- retry=0;
- while(!TP1&&retry<240){
- retry++;
- delay_us(1);
- }
- if(retry>=240)
- return 1;
- return 0;
- }
- uint TP2_DS18B20_Check(void)
- {
- uint retry=0;
- while(TP2&&retry<200){
- retry++;
- delay_us(1);
- }
- if(retry>=200)
- return 1;
- else
- retry=0;
- while(!TP2&&retry<240){
- retry++;
- delay_us(1);
- }
- if(retry>=240)
- return 1;
- return 0;
- }
- void TP1_DS18B20_Write_Byte(uint dat){
- uint i;
- uint testb;
- for(i=0; i<8; i++){
- testb=dat&0x01;
- dat=dat>>1;
- if(testb){
- TP1=0; // Write 1
- delay_us(2); // 2us
- TP1=1;
- delay_us(60); // 60us
- }else{
- TP1=0; // Write 0
- delay_us(60);
- TP1=1;
- delay_us(2);
- }
- }
- }
- void TP2_DS18B20_Write_Byte(uint dat){
- uint i;
- uint testb;
- for(i=0; i<8; i++){
- testb=dat&0x01;
- dat=dat>>1;
- if(testb){
- TP2=0; // Write 1
- delay_us(2); // 2us
- TP2=1;
- delay_us(60); // 60us
- }else{
- TP2=0; // Write 0
- delay_us(60);
- TP2=1;
- delay_us(2);
- }
- }
- }
- uint TP1_DS18B20_Read_Bit(void){
- uint dat;
- TP1 = 0;
- delay_us(1); // 2us
- TP1 = 1;
- delay_us(12); // 12us
- if(TP1)dat = 1;
- else dat = 0;
- delay_us(50); // 50us
- return dat;
- }
- uchar TP1_DS18B20_Read_Byte(void){
- uint i,j,dat;
- dat=0;
- for(i=1;i<=8;i++){
- j=TP1;
- dat=(j<<7)|(dat>>1);
- }
- return dat;
- }
- uchar TP2_DS18B20_Read_Bit(void){
- uint dat;
- TP2 = 0;
- delay_us(1); // 2us
- TP2 = 1;
- delay_us(12); // 12us
- if(TP2)dat = 1;
- else dat = 0;
- delay_us(50); // 50us
- return dat;
- }
- uchar TP2_DS18B20_Read_Byte(void){
- uint i,j,dat;
- dat=0;
- for(i=1;i<=8;i++){
- j=TP2;
- dat=(j<<7)|(dat>>1);
- }
- return dat;
- }
- void TP1_DS18B20_Start(void){
- TP1_DS18B20_Rst();
- TP1_DS18B20_Check();
- TP1_DS18B20_Write_Byte(0xcc);
- TP1_DS18B20_Write_Byte(0x44);
- }
- void TP2_DS18B20_Start(void){
- TP2_DS18B20_Rst();
- TP2_DS18B20_Check();
- TP2_DS18B20_Write_Byte(0xcc);
- TP2_DS18B20_Write_Byte(0x44);
- }
- short TP1_DS18B20_ReadTemperature(void){
- uint TL,TH;
- uint temp;
- short tem;
- EA = 0;
- TP1_DS18B20_Start ();
- TP1_DS18B20_Rst();
- TP1_DS18B20_Check();
- TP1_DS18B20_Write_Byte(0xCC);
- TP1_DS18B20_Write_Byte(0xBE);
- TL = TP1_DS18B20_Read_Byte();
- TH = TP1_DS18B20_Read_Byte();
- EA = 1;
- if(TH>7){
- TH=~TH;
- TL=~TL;
- temp=0;
- }else temp=1;
- tem=TH;
- tem<<=8;
- tem+=TL;
- tem=(float)tem*0.625;
- if(temp)
- return tem;
- else
- return -tem;
- }
- short TP2_DS18B20_ReadTemperature(void){
- uint TL,TH;
- uint temp;
- short tem;
- EA = 0;
- TP1_DS18B20_Start ();
- TP1_DS18B20_Rst();
- TP1_DS18B20_Check();
- TP1_DS18B20_Write_Byte(0xCC);
- TP1_DS18B20_Write_Byte(0xBE);
- TL = TP1_DS18B20_Read_Byte();
- TH = TP1_DS18B20_Read_Byte();
- EA = 1;
- if(TH>7){
- TH=~TH;
- TL=~TL;
- temp=0;
- }else temp=1;
- tem=TH;
- tem<<=8;
- tem+=TL;
- tem=(float)tem*0.625;
- if(temp)
- return tem;
- else
- return -tem;
- }
- void float_to_str(char *str,float num){
- int high;
- float low, tp;
- char *start=str;
- int n=0;
- char ch[20];
- int i;
- high=(int)num;
- low=num-high;
- while(high>0){
- ch[n++]='0'+high%10;
- high=high/10;
- }
-
- for(i=n-1;i>=0;i--){
- *str++=ch[i];
- }
-
- num -= (int)num;
- tp = 0.1;
- *str++='.';
-
- while(num > eps){
- num -= tp * (int)(low * 10);
- tp /= 10;
- *str++='0'+(int)(low*10);
- low=low*10.0-(int)(low*10);
- }
- *str='\0';
- str=start;
- }
- void time1(void) interrupt 3
- {
- CY = 0;
- TL1 += 0xDA;
- TH1 = 0xD4 + (uchar)CY;
- n2 ++;
- if(n2 == 250){
- temp1 = TP1_DS18B20_ReadTemperature();
- float_to_str(&temp1buf,temp1);
- }else if(n2 >= 500){
- n2 = 0;
- temp2 = TP2_DS18B20_ReadTemperature();
- float_to_str(&temp2buf,temp2);
- }
- ValueDelayCount++;
- }
- void UART1_Int(void) interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- ReceiveBuf[ReceiveTotal]=SBUF;
- ReceiveTotal++;
- if(ReceiveTotal>=RECEIVE_SIZE)
- {
- ReceiveTotal=RECEIVE_SIZE;
- }
- }
- }
- void SendTEMPValue(void){
- if(ValueDelayCount>=500){ //500ms
- ValueDelayCount=0;
- SendByte(SEND_TEMP_ELECTRICITY_VALUE);
- SendByte(SEND_TEMP1_VALUE);
- for(len1 = 0; len1 < 6; len1++){
- SendByte(temp1buf[len1]);
- }
- SendByte(SEND_TEMP_ELECTRICITY_VALUE);
- SendByte(SEND_TEMP2_VALUE);
- for(len2 = 0; len2 < 6; len2++){
- SendByte(temp2buf[len2]);
- }
- }
- }
- void main(void){
- P1M1=0x00;
- P1M0=0xFF;
- P2M1=0x00;
- P2M0=0xFF;
-
-
- TP1_alm = 0;
- TP2_alm = 0;
- UART1_Init();
- delay_ms(500);
- T1init();
- delay_ms(500);
- TP1_alm = 1;
- TP2_alm = 1;
- while (1){
- SendTEMPValue();
- }
- }
復制代碼
|