|
文件庫在附件當中
uint32 dwTickCount,dwIntTick; //時鐘
uint8 idata sendBuf[16],receBuf[16]; //發送接收緩沖區
uint8 idata checkoutError; // ==2 偶校驗錯
uint8 idata receTimeOut; //接收超時
uint8 idata c10ms; //10ms 計時
bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms,flag; //定時標志位
sbit AA=P2^0;
sbit BB=P2^1;
//定時處理
void timeProc(void)
{
static uint8 c200ms;
b1ms = 0;
b10ms = 0;
b100ms = 0;
ET0 = 1;
if(bt1ms) //如果1ms到
{
bt1ms = 0;
b1ms = 1;
if(receTimeOut>0) //如果接收超時值>0
{
receTimeOut--; //接收超時-1(1ms減1次)
if(receTimeOut==0 && receCount>0) //判斷通訊接收是否超時
{
receCount = 0; //將接收地址偏移寄存器清零
checkoutError = 0;
}
}
}
if(bt100ms)
{
bt100ms = 0;
b100ms = 1;
}
if(bt10ms) //判斷中斷10ms標志位是否1
{
bt10ms = 0; //清中斷10ms標志位
b10ms = 1;
c200ms++; //200ms計時器加1
if(c200ms >= 20) //判斷是否計時到200ms
{
c200ms = 0; //清200ms計時器
}
}
}
//初始化串口
void initUart(void)
{
//串口1設置
SCON = 0x50; //方式2,9位數據,波特率不可變 TB8 偶校驗
PCON = 0;
TH1= 0xfd;
TL1 = 0xfd; //波特率 9600
ES = 1;
TR1=1;
//串口2設置
S2CON = 0x50; //方式1,9位數據,波特率不可變 S2TB8 偶校驗位
BRT=0XFD; //設置波特率9600
AUXR=0x10; //啟動串口1波特率發生器
IP=0x00; //優先級默認 //開串口1中斷
IE2=0x01; //開串口2中斷
}
//初始化中斷
void initInt(void)
{
TMOD = 0x21;
TH0 = TIMER_HIGHT;
TL0 = TIMER_LOW;
TR0 = 1;
ET0 = 1;
initUart(); //串口初始化
EA = 1;
}
//初始化
void initProg(void)
{
P4SW|=0x20; //配置P4.5為IO口
P4M0|=0x10; //配置P4.4為IO口
P4M1|=0x10;
P0=P1=P2=P3=0xff;
P4|=0x30;
initInt();
// b485Send = 0;
}
void delay(uint8 x)//延時程序 0.1秒
{
uint8 m,n,s;
for(m=x;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
//主函數
void main(void)
{
uint8 k;
initProg(); //程序初始化
while(1)
{
timeProc(); //發送接收超時檢測
checkComm0Modbus();
if(AA==0)
{
delay(10);
k=1;
}
if(BB==0&&k==1)
{
delay(10);
while(!BB);
k=0;
readCoil();
}
}
}
// 串行中斷程序
void commIntProc() interrupt 4
{
if(TI)
{
TI = 0;
if(sendPosi<sendCount) //如果發送位置小于發送計數,那么繼續發送
{
sendPosi++;
SBUF = sendBuf[sendPosi];
}
else //否則發送完畢,置接收狀態
{
receCount = 0; //清接收地址偏移寄存器
checkoutError = 0;
}
}
else if(RI)
{
RI = 0;
receTimeOut = 10; //通訊超時值
receBuf[receCount] = SBUF;
receCount++; //接收地址偏移寄存器加1
receCount &= 0x0f; //最多一次只能接收16個字節
}
}
void uart2_isr() interrupt 8
{
if( S2CON & 0x02 )
{
S2CON &= ~0x02;
if(sendPosi<receCount) //如果發送位置小于發送計數,那么繼續發送
{
sendPosi++;
S2BUF =receBuf[sendPosi];
}
else //否則發送完畢,置接收狀態
{
receCount = 0; //清接收地址偏移寄存器
checkoutError = 0;
}
}
}
//定時器0 1ms 中斷
void timer0IntProc() interrupt 1
{
TL0 = TIMER_LOW;
TH0 = TIMER_HIGHT;
dwIntTick++;
bt1ms = 1;
c10ms++;
if(c10ms >= 10)
{
c10ms = 0; //10ms計時器清零
bt10ms = 1;
}
}
|
-
-
modbus控制AB.rar
2019-10-7 23:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
49.67 KB, 下載次數: 72, 下載積分: 黑幣 -5
-
-
XST儀表Modbus通訊協議.rar
2019-10-7 23:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
20.31 KB, 下載次數: 47, 下載積分: 黑幣 -5
-
-
頻率自動變化的.rar
2019-10-7 23:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2.39 KB, 下載次數: 36, 下載積分: 黑幣 -5
-
-
數字放大器通訊協議.rar
2019-10-7 23:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.05 KB, 下載次數: 36, 下載積分: 黑幣 -5
|