?? com.c
字號:
/*******************************************************************************
* 標題: 藍海微芯LJD-SY-5100單片機開發系統演示程序 *
* 文件: com.c *
* 日期: 2006-7-22 *
* 版本: 1.0 *
* 作者: Pillar *
********************************************************************************
* 描述: *
* 通信程序 *
* *
********************************************************************************
* 【版權】 Copyright(C) belongs to 天宇藍翔科技有限公司 All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
*******************************************************************************/
/********************************EEPROM存儲分配********************************/
//第一個扇區
//要存儲的內容:
//1.發射機工作頻率:3位。1-8頻率
//2.零點:2個字節 int
//3.分度值:1個字節 char
//4.量程:兩個字節;一個字節數字,1個字節10冪次 int*10
//5.單位:1位,k,0=kg,1=t;
//6.斜率:兩個字節 int
//7.傳感器量程:兩個字節;一個字節數字,1個字節10冪次 int*10
//第二個扇區
//1.出廠編號:兩個字節
//2.出廠時間:兩個字節。年,月,日。
//3.接收機編號:兩個字節
//第三扇區
//1.用戶名:20個字節
/**************保存參數寄存器***********************************************/
#include<com.h>
//常數區
//內部數據Flash第一扇區地址
#define FLASH_ADDRH 0x20
#define FLASH_ADDRL 0x00 //52
//內部數據Flash第2扇區地址
#define FLASH_ADDRH1 0x22
#define FLASH_ADDRL1 0x00 //52
//內部數據Flash第3扇區地址
#define FLASH_ADDRH2 0x24
#define FLASH_ADDRL2 0x00 //52
void LoadInt(int cs);
unsigned char Data_XRL(char *buf,int begin,int end);
void Hex_To_Ascii(buf); //把校驗數據轉換成ASCII
void Ascii_To_Hex(buf); //設備地址
void Make_Error(unsigned char ch); // 發射** 接收數據不正確要求重發
void Make_Two_Byte(int sj,char *jg);
/**********發射數據********/
void r_chengshang_data(unsigned char ch)
// IsBeginCom=1; //要求發射數據的標志
{
unsigned char buf[4];
ComHand=4;
ComBuf[0]=(unsigned char)(Para1.chuchang_bianhao&0x00ff); //出廠編號低位,設備地址
ComBuf[1]=(unsigned char)(Para1.chuchang_bianhao>>8);//出廠編號高位,設備地址
ComBuf[2]=0x30; //標志讀
ComBuf[3]=0x30;
if(ch==1)//讀重量數據 4
{
LoadInt(ch);
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x38;
}
else if(ch==2)//發射機工作頻率 1
{
LoadInt(ch); //數據地址 4
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x38;
}
else if(ch==3)//零點 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==4)//分度值 1
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x32;
}
else if(ch==5)//量程 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==6)//單位 1
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x32;
}
else if(ch==7)//斜率 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==8)//傳感器量程 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==9)//出廠編號 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==10)//出廠時間 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==11)//接收機編號 2
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x34;
}
else if(ch==12)//用戶名 20
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x44;
}
else if(ch==13)//電池數據 4
{
LoadInt(ch); //數據地址
ComBuf[8]=0x30; //數據直接數
ComBuf[9]=0x38;
}
buf[0]=Data_XRL(ComBuf,0,ComHand);
Hex_To_Ascii(buf); //把校驗數據轉換成ASCII
ComBuf[ComHand]=buf[0];
ComHand++;
ComBuf[ComHand]=buf[1];
ComHand++;
ComBuf[ComHand]=0x0D;//發射數據尾
SBUF=0x40; //啟動發射數據
}
/***********寫數據到稱上*****/
void w_data_to_chengshang(unsigned char ch)//ch為數據地址
{
unsigned char j;
unsigned char buf[4];
IsBeginCom=1; //要求發射數據的標志
ComHand=4;
//ComBuf[1]=ComBuf[0]; //設備地址
//ComBuf[2]=ComBuf[1];
ComBuf[0]=Para1.chuchang_bianhao&0x000f; //出廠編號低位,設備地址
ComBuf[1]=(Para1.chuchang_bianhao>>8);//出廠編號高位,設備地址
ComBuf[2]=0x30; //標志寫
ComBuf[3]=0x31;
if(buf[0]==2) //發射機工作頻率
{
ComBuf[ComHand]=0x32; //字節數為2
ComHand++;
LoadInt(Para.fasheji_pinlv);
}
else if(buf[0]==3) //零點
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para.lingdian);
}
else if(buf[0]==4) //分度值
{
ComBuf[ComHand]=0x32; //字節數2
ComHand++;
LoadInt(Para.fenduzhi);
}
else if(buf[0]==5) //量程
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para.liangcheng);
}
else if(buf[0]==6) //單位
{
ComBuf[ComHand]=0x32; //字節數2
ComHand++;
LoadInt(Para.dianwei);
}
else if(buf[0]==7) //斜率
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para.xielv_data);
}
else if(buf[0]==8) //傳感器量程
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para.chuanganqi_liangcheng);
}
else if(buf[0]==9) //出廠編號
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para1.chuchang_bianhao);
}
else if(buf[0]==10) //出廠時間
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para1.chuchang_time);
}
else if(buf[0]==11) //接收機編號
{
ComBuf[ComHand]=0x34; //字節數4
ComHand++;
LoadInt(Para1.jieshouji_bianhao);
}
else if(buf[0]==12) //用戶名
{
ComBuf[ComHand]=0x4f; //字節數20
for(j=0;j<10,j++;)
{
LoadInt(Para2.yonghuming[j]);
}
}
//CRC校驗數據
buf[0]=Data_XRL(ComBuf,1,ComHand);
Hex_To_Ascii(buf); //把校驗數據轉換成ASCII
ComBuf[ComHand]=buf[0];
ComHand++;
ComBuf[ComHand]=buf[1];
ComHand++;
ComBuf[ComHand]=0x0D;
ComHand++;
IsBeginCom=1; //要求發射數據的標志
//ComTime=5;
SBUF=0x40; //啟動發射數據
}
/*************************串行中斷程序**********************/
void ComInt() interrupt 4
{
unsigned char ch,j;
unsigned char buf[4];
unsigned char str[2];
long int i ;
if(TI==1) //發中斷
{
TI=0;
ComJs++;
if(ComJs<ComHand) //未發完
{
SBUF=ComBuf[ComJs];
}
else //已發完
{
IsBeginCom=0; //要求發射數據的標志
//QH=0;
}
}
else //收中斷
{
RI=0;
ch=SBUF;
if(!Is40H) //未收到數據頭
{
if(ch==0x40) //為數據頭
{
Is40H=1;
ComHand=0;
}
return;
}
else //已收到數據頭
{
if(ch!=0x0D) //不為數據尾
{
ComBuf[ComHand]=ch;
ComHand++;
if(ComHand>=23) //接收超個數
{
Is40H=0;
}
return;
}
else //收到數據尾
{
Is40H=0;
buf[0]=ComBuf[0]; //ComBuf的0,1字節為設備地址
buf[1]=ComBuf[1];
Ascii_To_Hex(buf); //設備地址
if(Para1.chuchang_bianhao!=buf[0]) //不為本機
{
return;
}
//為本機
//QH=1;
buf[0]=ComBuf[ComHand-2];
buf[1]=ComBuf[ComHand-1];
Ascii_To_Hex(buf); //取異或
ch=Data_XRL(ComBuf,0,ComHand-2); //計算異或
if(ch!=buf[0]) //異或錯
{
Make_Error(0x2A); // 發射** 接收數據不正確要求重發
}
else //異或和正確 接收數據正確
{
buf[0]=ComBuf[6];
buf[1]=ComBuf[7];
Ascii_To_Hex(buf); //buf[0]中為數據地址
ch=ComBuf[3]&0x01;
if(ch==1) //寫
{
// IsSave=1;
str[0]=ComBuf[10];
str[1]=ComBuf[11];
Ascii_To_Hex(str); //高字節
ch=str[0];
str[0]=ComBuf[12];
str[1]=ComBuf[13];
Ascii_To_Hex(str); //低字節
i=(long int)ch*256+(long int)str[0];
if(buf[0]==1) //稱重數據
{
str[0]=ComBuf[14];
str[1]=ComBuf[15];
Ascii_To_Hex(str); //高字節
ch=str[0];
str[0]=ComBuf[16];
str[1]=ComBuf[17];
Ascii_To_Hex(str); //高字節
zhongliang_data=(i<<16)+(long int)ch*256+(long int)str[0];
}
else if(buf[0]==2) //發射機頻率
{
Para.fasheji_pinlv=i;
}
else if(buf[0]==3) //零點
{
Para.lingdian=i;
}
else if(buf[0]==4) //分度值
{
Para.fenduzhi=i;
}
else if(buf[0]==5) //量程
{
Para.liangcheng=i;
}
/* else if(buf[0]==6) //單位
{
Para.danwei=ch;
}
*/
else if(buf[0]==7) //斜率
{
Para.xielv_data=i;
}
else if(buf[0]==8) //傳感器量程
{
Para.chuanganqi_liangcheng=i;
}
else if(buf[0]==9) //出廠編號
{
Para1.chuchang_bianhao=i;
}
else if(buf[0]==10) //出廠時間
{
Para1.chuchang_time=i;
}
else if(buf[0]==11) //接收機編號
{
Para1.jieshouji_bianhao=i;
}
else if(buf[0]==12) //用戶名
{
for (j=0;j<20;j++)
{
str[0]=ComBuf[j+10];
str[1]=ComBuf[j+11];
Ascii_To_Hex(str);
Para2.yonghuming[j]=str[0];
}
}
}
else return;
}
}
}
}
}
//向通信緩沖裝入int數據
void LoadInt(int cs)
{
unsigned char buf[4];
Make_Two_Byte(cs,buf); //把一個數據轉化成兩個ASCII并裝入
ComBuf[ComHand]=buf[0];
ComHand++;
ComBuf[ComHand]=buf[1];
ComHand++;
ComBuf[ComHand]=buf[2];
ComHand++;
ComBuf[ComHand]=buf[3];
ComHand++;
}
//初始化串口
void Init_Com()
{
/* TR2=0;
T2CON=0x30; //定時器2作為波特率發生器
TH2=Com24M[Para.Com*2];
RCAP2H=TH2;
TL2=Com24M[Para.Com*2+1];
RCAP2L=TL2; //波特率
SCON=0x50; //串口工作方式1+
PCON=PCON&0x7F; //波特率不加倍
*/
/*定義T1為串口發生器*/
TMOD=0x20; //確定定時器1工作方式為方式2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -