#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);
}