|
文件库在附件当中
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;
}
}
|
|