本設計是由單片機控制數碼管顯示ph值及溫度
單片機源程序如下:
- #include "N76E003.h"
- #include "SFR_Macro.h"
- #include "Function_define.h"
- #include "LED.h"
- #define BAUDRATE 9600 //通訊波特率
- void InitialUART0_Timer3(unsigned long u32Baudrate); //use timer3 as Baudrate generator
- unsigned char LedUpdateCnt=0; //LED顯示更新計時
- unsigned char const num[]={ //數碼管段碼
- 0x3f,0x06,0x5b,0x4f,0x66,//0~4
- 0x6d,0x7d,0x07,0x7f,0x6f,//5~9
- 0x77,0x7C,0x58,0x5E,0x79,0x71,//A~F
- 0x40/*16-*/,0x3e/*17U*/,0x39/*18C*/,
- 0x76/*19H*/,0x48/*20=*/,0x00/*21滅*/
- };
- float Dispdata; //用于顯示的數據
- unsigned int Time1TimesCnt; //定時器1定時溢出計數
- unsigned char ShiftDisplay=0; //切換PH、溫度顯示標志位
- unsigned int ShiftCnt=0; //切換顯示計數器
- unsigned int RecData; //接收到的數據
- unsigned char Cache9Byte=0; //連續緩存9個字節標志位
- unsigned char EnDatadeal=0; //使能數據處理
- unsigned char receCount=0; //接收到的字節個數
- unsigned char receBuf[11]; //接收緩存區
- unsigned char i;
- void main (void)
- {
- //TIMER1用于動態掃描數碼管
- TIMER1_MODE2_ENABLE;
- //未設置時鐘控制寄存器CKCON中的T1M(復位值為0),時鐘源為系統時鐘/12,計數周期為12/16M=0.75us
- //TH1 = (256-TIMER1_CNTTIMES_VALUE);
- //TL1 = (256-TIMER1_CNTTIMES_VALUE);
- TH1 = 89; //125.25us溢出一次(計數167次后溢出中斷)
- TL1 = 89;
- set_ET1; //enable Timer1 interrupt
- set_TR1; //Timer1 run
-
- InitialUART0_Timer3(BAUDRATE); //use timer3 as Baudrate generator
- set_ES; //enable UART interrupt
-
- set_EA; //enable global interrupt
-
- LED_Init();
-
- while(1)
- {
- if(EnDatadeal)
- {
- //例如:F7 10 04 01 13 00 5C 9E 9F (有效數據是第4、5、6、7字節)
-
- if(ShiftDisplay) RecData= (receBuf[3]<<8)| receBuf[4]; //轉換第4、5字節數據(溫度)
- else RecData= (receBuf[5]<<8)| receBuf[6]; //轉換第6、7字節數據(PH值)
-
- for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- receCount = 0; //清接收數
- EnDatadeal=0; //數據處理完成
- REN=1; //允許新一輪接收
- }
- }
- }
- //定時器1溢出中斷:125.25us溢出一次
- void Timer1_ISR (void) interrupt 3
- {
- if(Time1TimesCnt>=16) //計數1次時間為0.12525ms,16次為2.004ms
- {
- Time1TimesCnt=1;
-
- if(Dispdata>=10.0)
- {
- switch(LedUpdateCnt%7)//每隔4ms掃描一個數碼管,每輪掃描時長16ms<40ms(理論上人眼的視覺延遲感應速度為>=40ms)
- {
- case 0: LED_Light(num[(int)(Dispdata/10.0)],1);break;
- case 2: LED_Light(num[((int)Dispdata)%10]+0x80,2); break;
- case 4: LED_Light(num[((int)(Dispdata*10.0))%10],3); break;
- case 6: //LED_Light(num[21],4);break;
- default : break;
- }
- }
- else
- {
- switch(LedUpdateCnt%7)//每隔4ms掃描一個數碼管,每輪掃描時長16ms<40ms(理論上人眼的視覺延遲感應速度為>=40ms)
- {
- case 0: LED_Light(num[((int)Dispdata)%10]+0x80,1); break;
- case 2: LED_Light(num[((int)(Dispdata*10.0))%10],2); break;
- case 4: LED_Light(num[((int)(Dispdata*100.0))%10],3); break;
- case 6: //LED_Light(num[21],4);break;
- default : break;
- }
-
- }
-
- //112除以7=16
- if(LedUpdateCnt<112) LedUpdateCnt++;
- else //2.004ms*112=224.448ms更新一次顯示數據,掃16輪后切換一個新數據掃描
- {
- LedUpdateCnt=0;
- Dispdata=RecData/10.0;
- }
-
- if(ShiftCnt<5000) ShiftCnt++;
- else//5000*2ms=10S
- {
- if(ShiftDisplay) ShiftDisplay=0;
- else ShiftDisplay=1;
- ShiftCnt=0;
- }
- }
- else Time1TimesCnt++;
- // 清除更新中斷標記,防止不斷進入中斷程序
- clr_TF1;
- }
- //串口0中斷
- void SerialPort_ISR(void) interrupt 4
- {
- unsigned char i,Recev=0; //定義變量,用來轉存接收數據
-
- if (RI) /* if reception occur */
- {
- clr_RI; /* clear reception flag for next reception */
- Recev = SBUF; //收到的數值放在變量(暫存)中
- //接收到f7且之前未接收數據則緩存9個字節(一幀完整數據共9個字節)
- //例如:F7 10 04 01 13 00 5C 9E 9F (間隔500ms發送一次數據的前3個字節是固定的)
- if(Recev==247 && receCount==0) Cache9Byte=1;//使能緩存9個字節
-
- if(Cache9Byte)
- {
- receBuf[receCount] = Recev; //緩存
- receCount++; //接收計數加1
-
- if(receCount==9)
- {
- if(receBuf[1]==16 && receBuf[2]==4) //前3字節分別是:F7 10 04
- {
- REN=0;//禁止接收
- Cache9Byte=0; //緩存標志清理
- EnDatadeal=1; //使能數據處理
-
- //下面指令在程序處理完當前接收到的數據之后再執行
- //也就是下一輪接收僅再本輪接收完成的數據處理好后才允許再次進行
- //for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- //receCount = 0; //清接收數
- //EnDatadeal=0; //數據處理完成
- //REN=1; //允許新一輪接收
- }
- else
- {
- //未能正常接收,清理已接收的緩存區,清理后重新來過,清理過程中禁止新的接收
- REN=0;//禁止接收
- for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- Cache9Byte=0; //緩存標志清理
- receCount = 0; //清接收計數器
- REN=1; //允許新一輪接收
- }
- }
- }
- }
- if(TI) //接收中斷過程中禁止發送
- {
- clr_TI; /* if emission occur */
- }
- }
- void InitialUART0_Timer3(unsigned long u32Baudrate) //use timer3 as Baudrate generator
- {
- P06_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
- P07_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
-
- SCON = 0x50; //UART0 Mode1,REN=1,TI=1
- set_SMOD; //UART0 Double Rate Enable
- T3CON &= 0xF8; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
- set_BRCK; //UART0 baud rate clock source = Timer3
-
- RH3 = ( (unsigned char)( (65536 - (1000000/u32Baudrate)-1) >>8 ) ); /*16 MHz */
- RL3 = ( (unsigned char)( (65536 - (1000000/u32Baudrate)-1) &0xff) ); /*16 MHz */
-
- set_TR3; //Trigger Timer3
- set_TI; //For printf function must setting TI = 1
- }
復制代碼
所有資料51hei提供下載:
PH串口模塊 1米PH溫度電極 試劑采集器溫度傳感器酸堿度水質檢測.rar
(105.39 KB, 下載次數: 61)
2018-9-18 21:48 上傳
點擊文件名下載附件
|