久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

于RS-485的多機通信程序(主機端)

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年11月02日   【字體:

//-----------------------函數聲明,變量定義---------------------
#include <reg51.h>
sbit RE_DE=P1^0;
#define COUNT 10 // 定義接收緩沖區大小
#define Slaver_NUM 10
unsigned char bdata flag; //在可位尋址去定義一個標志變量
sbit time_over_flag =flag^0; //接收超時標志
unsigned char buffer[COUNT]; //定義緩沖區
unsigned char point; //定義緩沖區位置指示
unsigned char Slave_AD[Slaver_NUM]; //定義有效地址存放區
unsigned char ADD_num; //有效地址個數
unsigned char idata count_10ms; //用于表示有多少次10ms中斷
unsigned char idata send_data[7]={
0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //與定義發送數據,共7位
void UART_init(); //串口初始化函數
void COM_send(void); //串口接收函數
unsigned char CLU_checkdata(void); //計算校驗位函數
//---------------------------------------------------------------
// 函數名稱: UART_init()串口初始化函數
// 函數功能: 在系統時鐘為11.059MHZ時,設定串口波特率為9600bit/s
// 串口接收中斷允許,發送中斷禁止,設定定時器中斷允許
//---------------------------------------------------------------
void UART_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工作模式
//---------------------------------------------------------------
void timer0_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()系統初始化
// 函數功能: 調用串口、定時器初始化函數,完成系統初始化
//---------------------------------------------------------------
void system_init(void)
{
//系統總設置
UART_init();
timer0_init();
EA =1; //單片機中斷允許
}
//---------------------------------------------------------------
// 函數名稱: com_interrup()串口接收中斷處理函數
// 函數功能: 接收包括起始位"S"在內的十位數據到數據緩沖區
//---------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //處理接收中斷
{RI=0; //清除中斷標志位
RECEIVR_buffer=SBUF; //接收串口數據
if(point==0) //如果還沒有接收到起始位
{
if(RECEIVR_buffer==0xFE) //判斷是否起始標志位
{
buffer[point++]=RECEIVR_buffer;//把接收到的數據放入接收緩存區
}
else
point=0; //不是,繼續等待起始位
}
else if(point>0&&point<10) //判斷是否接收夠十位數據
buffer[point++]=RECEIVR_buffer; //不夠,把接收到的數據放入接收緩存區
else if(point==10)
{
if(RECEIVR_buffer==0xEF) //判斷結束標志位是否正確
{
buffer[point]=RECEIVR_buffer; //把接收到的數據放入接收緩存區
Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存儲器
//表示該地址有有效設備
}
else
point=0; //不是,繼續等待起始位
}
else point=0; //緩沖區已滿,清除緩存區內數據重新接收
}
if(TI) //串口發送中斷
{
TI=0; //清除發送中斷
}
}
//---------------------------------------------------------------
// 函數名稱: timer0_interrup()
// 函數功能:定時器T0中斷服務程序
// 函數說明:T0枚10ms中斷一次,連續中斷50次置time_over_flag=1;
//---------------------------------------------------------------
timer0_interrupt(void) interrupt 1 using 2
{
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()串口發送函數
// 函數功能: 把數據緩沖區的十位數據發送出去
//---------------------------------------------------------------
void COM_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()
// 函數功能: 寫發送緩沖區十位數據
//---------------------------------------------------------------
void write_buffer(unsigned char slaver_add)
{
unsigned char i;
TB8=1; //打開多機通信方式
buffer[0]=0xFE;
buffer[1]=slaver_add;
for(i=2;i<9;i++) //連續發送十位數據
//把緩存區的數據都發送到串口
{
buffer[i]=send_data[i-2];
}
buffer[9]=0xEF;
}
//---------------------------------------------------------------
// 函數名稱: 主函數
// 函數功能: 調度個子函數,完成通信過程
//---------------------------------------------------------------
void main(void)
{
unsigned char i=0;
system_init(); //系統初始化
do{ //查旬0到10好地址有沒有對應設備
write_buffer(i++); //寫查詢第i號設備的發送信息
COM_send(); //調用發送函數,完成發送
timer0_init(); //完成一次查詢,重新初始定時器0,準備下一次查詢
}
while(time_over_flag&&i<10);
}

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲欧美一区二区三区1000 | 久草在线高清 | 一区二区三区四区免费观看 | 成人亚洲网| 精品久久久久久久久久久久 | 色狠狠一区 | 亚洲91精品 | 91久久看片 | 成人午夜免费福利视频 | 国产日韩一区二区 | 伊人伊人 | 亚洲综合电影 | 久久国产电影 | 99久久免费精品国产男女高不卡 | 黄色毛片在线播放 | 中文字幕第十页 | 成人免费大片黄在线播放 | 91大神在线看 | 精品久久久久久 | 中文在线一区 | 国产黄色小视频 | 国产日韩精品视频 | 国产精品无码专区在线观看 | 国产视频综合 | 羞羞视频免费在线观看 | 国产69精品久久久久777 | 国产精品欧美一区二区三区 | av手机在线免费观看 | 国产在线观看一区二区三区 | 久久精品16 | 爱爱无遮挡 | 亚洲精品在线视频 | 亚洲色图婷婷 | 久久久久久久夜 | 午夜寂寞福利视频 | 国产男女视频网站 | 成人亚洲性情网站www在线观看 | 刘亦菲国产毛片bd | 欧美日韩综合一区 | 日韩网| 日韩欧美一区二区三区免费观看 |