|
本設(shè)計(jì)是由單片機(jī)控制數(shù)碼管顯示ph值及溫度
單片機(jī)源程序如下:
- #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顯示更新計(jì)時(shí)
- unsigned char const num[]={ //數(shù)碼管段碼
- 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; //用于顯示的數(shù)據(jù)
- unsigned int Time1TimesCnt; //定時(shí)器1定時(shí)溢出計(jì)數(shù)
- unsigned char ShiftDisplay=0; //切換PH、溫度顯示標(biāo)志位
- unsigned int ShiftCnt=0; //切換顯示計(jì)數(shù)器
- unsigned int RecData; //接收到的數(shù)據(jù)
- unsigned char Cache9Byte=0; //連續(xù)緩存9個(gè)字節(jié)標(biāo)志位
- unsigned char EnDatadeal=0; //使能數(shù)據(jù)處理
- unsigned char receCount=0; //接收到的字節(jié)個(gè)數(shù)
- unsigned char receBuf[11]; //接收緩存區(qū)
- unsigned char i;
- void main (void)
- {
- //TIMER1用于動(dòng)態(tài)掃描數(shù)碼管
- TIMER1_MODE2_ENABLE;
- //未設(shè)置時(shí)鐘控制寄存器CKCON中的T1M(復(fù)位值為0),時(shí)鐘源為系統(tǒng)時(shí)鐘/12,計(jì)數(shù)周期為12/16M=0.75us
- //TH1 = (256-TIMER1_CNTTIMES_VALUE);
- //TL1 = (256-TIMER1_CNTTIMES_VALUE);
- TH1 = 89; //125.25us溢出一次(計(jì)數(shù)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 (有效數(shù)據(jù)是第4、5、6、7字節(jié))
-
- if(ShiftDisplay) RecData= (receBuf[3]<<8)| receBuf[4]; //轉(zhuǎn)換第4、5字節(jié)數(shù)據(jù)(溫度)
- else RecData= (receBuf[5]<<8)| receBuf[6]; //轉(zhuǎn)換第6、7字節(jié)數(shù)據(jù)(PH值)
-
- for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- receCount = 0; //清接收數(shù)
- EnDatadeal=0; //數(shù)據(jù)處理完成
- REN=1; //允許新一輪接收
- }
- }
- }
- //定時(shí)器1溢出中斷:125.25us溢出一次
- void Timer1_ISR (void) interrupt 3
- {
- if(Time1TimesCnt>=16) //計(jì)數(shù)1次時(shí)間為0.12525ms,16次為2.004ms
- {
- Time1TimesCnt=1;
-
- if(Dispdata>=10.0)
- {
- switch(LedUpdateCnt%7)//每隔4ms掃描一個(gè)數(shù)碼管,每輪掃描時(shí)長16ms<40ms(理論上人眼的視覺延遲感應(yīng)速度為>=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掃描一個(gè)數(shù)碼管,每輪掃描時(shí)長16ms<40ms(理論上人眼的視覺延遲感應(yīng)速度為>=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更新一次顯示數(shù)據(jù),掃16輪后切換一個(gè)新數(shù)據(jù)掃描
- {
- 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++;
- // 清除更新中斷標(biāo)記,防止不斷進(jìn)入中斷程序
- clr_TF1;
- }
- //串口0中斷
- void SerialPort_ISR(void) interrupt 4
- {
- unsigned char i,Recev=0; //定義變量,用來轉(zhuǎn)存接收數(shù)據(jù)
-
- if (RI) /* if reception occur */
- {
- clr_RI; /* clear reception flag for next reception */
- Recev = SBUF; //收到的數(shù)值放在變量(暫存)中
- //接收到f7且之前未接收數(shù)據(jù)則緩存9個(gè)字節(jié)(一幀完整數(shù)據(jù)共9個(gè)字節(jié))
- //例如:F7 10 04 01 13 00 5C 9E 9F (間隔500ms發(fā)送一次數(shù)據(jù)的前3個(gè)字節(jié)是固定的)
- if(Recev==247 && receCount==0) Cache9Byte=1;//使能緩存9個(gè)字節(jié)
-
- if(Cache9Byte)
- {
- receBuf[receCount] = Recev; //緩存
- receCount++; //接收計(jì)數(shù)加1
-
- if(receCount==9)
- {
- if(receBuf[1]==16 && receBuf[2]==4) //前3字節(jié)分別是:F7 10 04
- {
- REN=0;//禁止接收
- Cache9Byte=0; //緩存標(biāo)志清理
- EnDatadeal=1; //使能數(shù)據(jù)處理
-
- //下面指令在程序處理完當(dāng)前接收到的數(shù)據(jù)之后再執(zhí)行
- //也就是下一輪接收僅再本輪接收完成的數(shù)據(jù)處理好后才允許再次進(jìn)行
- //for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- //receCount = 0; //清接收數(shù)
- //EnDatadeal=0; //數(shù)據(jù)處理完成
- //REN=1; //允許新一輪接收
- }
- else
- {
- //未能正常接收,清理已接收的緩存區(qū),清理后重新來過,清理過程中禁止新的接收
- REN=0;//禁止接收
- for(i=0;i<receCount;i++)receBuf[i]=0; //清接收緩存
- Cache9Byte=0; //緩存標(biāo)志清理
- receCount = 0; //清接收計(jì)數(shù)器
- REN=1; //允許新一輪接收
- }
- }
- }
- }
- if(TI) //接收中斷過程中禁止發(fā)送
- {
- 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
- }
復(fù)制代碼
所有資料51hei提供下載:
PH串口模塊 1米PH溫度電極 試劑采集器溫度傳感器酸堿度水質(zhì)檢測.rar
(105.39 KB, 下載次數(shù): 61)
2018-9-18 21:48 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|