//———————–函数声明,变量界说———————
#include
sbit RE_DE=P1^0;
#define COUNT 10 // 界说接纳缓冲区巨细
#define Slaver_NUM 10
unsignedcharbdata flag;//在可位寻址去界说一个标志变量
sbit time_over_flag =flag^0;//接纳超时标志
unsignedcharbuffer[COUNT];//界说缓冲区
unsignedcharpoint;//界说缓冲区方位指示
unsignedcharSlave_AD[Slaver_NUM];//界说有用地址寄存区
unsignedcharADD_num;//有用地址个数
unsignedcharidata count_10ms;//用于表明有多少次10ms中止
unsignedcharidata send_data[7]={
0x31,0x32,0x33,0x34,0x35,0x36,0x37};//与界说发送数据,共7位
voidUART_init();//串口初始化函数
voidCOM_send(void);//串口接纳函数
unsignedcharCLU_checkdata(void);//核算校验位函数
//—————————————————————
// 函数称号: UART_init()串口初始化函数
// 函数功用: 在体系时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接纳中止答应,发送中止制止,设定定时器中止答应
//—————————————————————
voidUART_init()
{
//初始化串行设置
SCON =0x58;//挑选串口作业方法为1,翻开接纳答应,TB8=1
TMOD =0x21;//定时器1作业在方法2,定时器0作业在方法1
TR1 =1;//发动定时器T1
ES=1;//答应串行口中止
PS=1;//规划串行口中止优先级
//初始化定时器1
TH1 =0xfd;//完结波特率9600(体系时钟11.0592MHZ)
ET1 =0;//定时器1中止制止
}
//—————————————————————
// 函数称号: timer0_init()初始化定时器0
// 函数功用: 设置timer0作业形式
//—————————————————————
voidtimer0_init()
{
time_over_flag=0;
count_10ms=0;
ADD_num=0;
TL0=0x0F0;//T0用于发生10ms的中止
TH0=0x0D8;//50次T0中止发生1次超时溢出
ET0=1;//答应定时器0中止
}
//—————————————————————
// 函数称号: system_init()体系初始化
// 函数功用: 调用串口、定时器初始化函数,完结体系初始化
//—————————————————————
voidsystem_init(void)
{
//体系总设置
UART_init();
timer0_init();
EA =1;//单片机中止答应
}
//—————————————————————
// 函数称号: com_interrup()串口接纳中止处理函数
// 函数功用: 接纳包含开始位”S”在内的十位数据到数据缓冲区
//—————————————————————
com_interrupt(void) interrupt 4using3
{
unsignedcharRECEIVR_buffer;
if(RI)//处理接纳中止
{RI=0;//铲除中止标志位
RECEIVR_buffer=SBUF;//接纳串口数据
if(point==0)//假如还没有接纳到开始位
{
if(RECEIVR_buffer==0xFE)//判别是否开始标志位
{
buffer[point++]=RECEIVR_buffer;//把接纳到的数据放入接纳缓存区
}
else
point=0;//不是,持续等候开始位
}
elseif(point>0&&point<10)//判别是否接纳够十位数据
buffer[point++]=RECEIVR_buffer;//不行,把接纳到的数据放入接纳缓存区
elseif(point==10)
{
if(RECEIVR_buffer==0xEF)//判别完毕标志位是否正确
{
buffer[point]=RECEIVR_buffer;//把接纳到的数据放入接纳缓存区
Slave_AD[ADD_num++]=buffer[2];//把接纳到的地址放到地址存储器
//表明该地址有有用设备
}
else
point=0;//不是,持续等候开始位
}
elsepoint=0;//缓冲区已满,铲除缓存区内数据从头接纳
}
if(TI)//串口发送中止
{
TI=0;//铲除发送中止
}
}
//—————————————————————
// 函数称号: timer0_interrup()
// 函数功用:定时器T0中止服务程序
// 函数阐明:T0枚10ms中止一次,接连中止50次置time_over_flag=1;
//—————————————————————
timer0_interrupt(void) interrupt 1using2
{
count_10ms++;
if(count_10ms==50)
{
ET0=0;//封闭定时器T0中止
TR0=0;//中止定时器T0
time_over_flag=1;//设置接纳超时标志
count_10ms=0x00;//10ms计数器复位
}
else
{
TL0=0x0F0;//重装定时器初始值
TH0=0x0D8;
}
}
//—————————————————————
// 函数称号: COM_send()串口发送函数
// 函数功用: 把数据缓冲区的十位数据发送出去
//—————————————————————
voidCOM_send(void)
{
RE_DE=1;//设置MAX483进入发送状况
for(point=0;point=10,TI=1;point++)//接连发送十位数据
//把缓存区的数据都发送到串口
{
SBUF=buffer[point];
TI=0;
}
RE_DE=0;//设置MAX483进入接纳状况
}
//—————————————————————
// 函数称号: write_buffer()
// 函数功用: 写发送缓冲区十位数据
//—————————————————————
voidwrite_buffer(unsignedcharslaver_add)
{
unsignedchari;
TB8=1;//翻开多机通讯方法
buffer[0]=0xFE;
buffer[1]=slaver_add;
for(i=2;i<9;i++)//接连发送十位数据
//把缓存区的数据都发送到串口
{
buffer[i]=send_data[i-2];
}
buffer[9]=0xEF;
}
//—————————————————————
// 函数称号: 主函数
// 函数功用: 调度个子函数,完结通讯进程
//—————————————————————
voidmain(void)
{
unsignedchari=0;
system_init();//体系初始化
do{//查旬0到10好地址有没有对应设备
write_buffer(i++);//写查询第i号设备的发送信息
COM_send();//调用发送函数,完结发送
timer0_init();//完结一次查询,从头初始定时器0,预备下一次查询
}
while(time_over_flag&&i<10);
}