欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
N76E003單片機控制ph值傳感器的源程序
[打印本頁]
作者:
上善-若水
時間:
2018-9-18 21:49
標題:
N76E003單片機控制ph值傳感器的源程序
本設計是由單片機控制數碼管顯示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
}
復制代碼
0.png
(7.14 KB, 下載次數: 40)
下載附件
2018-9-19 01:58 上傳
所有資料51hei提供下載:
PH串口模塊 1米PH溫度電極 試劑采集器溫度傳感器酸堿度水質檢測.rar
(105.39 KB, 下載次數: 61)
2018-9-18 21:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1