main.c
来自「9S12单片机实现电压、温度采集程序」· C语言 代码 · 共 706 行 · 第 1/2 页
C
706 行
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define masterTrRr485conbit (PTS_PTS2) //CHOOSE Tr OR Rr
//---------------variable declaration---------------
unsigned int testint[23],j=0,receivecount=0, databasecarray[4],qq ,Trsym,guandi0,guandi1,guandi2,guandi3,SOCMIAOINT,scisendsign=1,socchangeenable;
float database=2.25;
unsigned char to232;
int guandi[4];
unsigned int svdata0[4],svdata1[4],svdata2[4],svdata3[4],gvdata0[4],gvdata1[4],gvdata2[4],temp0[4],temp1[4];
float fsvdata0[4],fsvdata1[4],fsvdata2[4],fsvdata3[4],fgvdata0[4],fgvdata1[4],fgvdata2[4],fguandi[4],ii=0,isoc,SOCMIAO,SOCFEN,SOCSHI,SOCSHI1,SOCV;
char *psvdata0=(char*)svdata0,*psvdata1=(char*)svdata1,*psvdata2=(char*)svdata2,*psvdata3=(char*)svdata3,
*pgvdata0=(char*)gvdata0,*pgvdata1=(char*)gvdata1,*pgvdata2=(char*)gvdata2,*ptemp0=(char*)temp0,*ptemp1=(char*)temp1,*pguandi=(char*)guandi;
int receiveflagp,receiveflag,receiveflagt,errorintflag,errortimeflag,transintc,rxdata1c,
transtimec,receiveintc,receivetimec,timetestc, txtimeflag;
int sendnum1=100,sendnum,sendflag,sign,readisign;
int long sendtimes=0;
//-------------------------------------------------------------
unsigned int present0,present1;
unsigned char a=0, b=0,SN0[4][8]={{0X28,0X82,0X2A,0X9D,0X01,0X00,0X00,0X08},
{0X28,0X26,0X3C,0X9D,0X01,0X00,0X00,0X68},{0X28,0XD3,0X2D,0X9D,0X01,0X00,0X00,0X40},
{0X28,0XC1,0X2E,0X9D,0X01,0X00,0X00,0X3B}
},SN1[4][8]={{0X28,0X26,0X61,0X9F,0X01,0X00,0X00,0X16},
{0X28,0X70,0X39,0X9D,0X01,0X00,0X00,0X26}} ; //a,b Tl And Th;ROMID Store ID;
unsigned char ROMIDA[8]={0X28,0X82,0X2A,0X9D,0X01,0X00,0X00,0X08},ROMIDB[8]={0X28,0X26,0X3C,0X9D,0X01,0X00,0X00,0X68},
ROMIDC[8]={0X28,0XD3,0X2D,0X9D,0X01,0X00,0X00,0X40},ROMIDBD[8]={0X28,0XC1,0X2E,0X9D,0X01,0X00,0X00,0X3B},
ROMIDE[8]={0X28,0X26,0X61,0X9F,0X01,0X00,0X00,0X16},ROMIDF[8]={0X28,0X70,0X39,0X9D,0X01,0X00,0X00,0X26};
unsigned int t=0;
float tt=0,data[6];
int ROMID[8];
//-----------function declaration----------------------------
void Read12GV(void);
void Read16SV(void);
void Readguandi(void);
void inttofloat(void);
void wait(void);
void iniports(void);
void initialcan(void) ;
int CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata );
void TransmitT(char* text,int textnum);
void initialATD(void);
unsigned long AD_Filter(unsigned char chanel) ;
void initpll(void);
void waits(void);
void IniCOM(void);
void SCIsendgroup(void);
//-------------------------------
void DS18B20_read_temp (void);
void delay0(unsigned int) ;
void delay1(unsigned long int) ;
unsigned char Init_18B20(void);
void DS18B20_Write_Byte(char);
unsigned char DS18B20_Read_Byte(void);
unsigned int DS18B20_Read_Temp(char);
void Config_18B20(void);
void Read_8bytes_RomID(void);
void Write_8bytes_RomID(unsigned char* P);
//-----------main ----------------------------
void main(void) {
/* put your own code here */
initpll(); // 总线频率25M
/*-------端口初始化----------*/
RDRT=0xff; // reduce the power of T port
RDRIV=0x93; //reduce the power of
// int errorflagtime=0; //symbol for translate
iniports(); //initial ports
initialcan();
initialATD();
IniCOM();//initial sci com
DDRS_DDRS2=1;
masterTrRr485conbit=0;//unenble 485Tr
present0=Init_18B20();
DS18B20_Write_Byte (0xCC); // 跳过读序号列号的操作
DS18B20_Write_Byte(0x44); // 启动温度转换
RTICTL=0xff; //产生定时中断350m每个周期
CRGINT_RTIE=1; //允许RTI中断
SOCSHI=SOCV;
EnableInterrupts;
for(;;) {
//Read16SV();
Read12GV();
inttofloat();
Readguandi();
if(sign==1){
SOCMIAO=SOCMIAO+0.01296296296*isoc;
SOCFEN=SOCFEN+2.1604938e-4*isoc;
SOCSHI=SOCSHI+3.600823e-6*isoc;
guandi[2]=SOCSHI*10000;
guandi[3]=SOCV*10000;
sign=0;}
/*if(scisendsign==1){
masterTrRr485conbit=1;//enble 485Tr
SCIsendgroup();
wait();
wait();
wait();
wait();
masterTrRr485conbit=0;//unenble 485Tr
}*/
} /* wait forever */
/* please make sure that you never leave this function */
}
//----------------------initial three ports---------------
void iniports(void) {
DDRH=0X20;
DDRE=0X60; //set port E5,6 as out put
DDRS=0XF0;
DDRK=0X3F;
//DDRA=0XFF;
DDRH=0XFF;
DDRP=0X0F;
} /*--------锁相环初始化-------*/
void initpll(){
CLKSEL=0x00; //disable pll;
CLKSEL=0;
CLKSEL_PLLSEL = 0;
PLLCTL_PLLON = 0;
SYNR = 24; //6M晶镇获得25M总线
REFDV = 5;
PLLCTL = 192;
PLLCTL_PLLON = 1;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL = 1;
}
/*-------延时-------*/
void wait(void)
{
unsigned long i;
for(i=0;i<300;i++) {
asm nop;
asm nop;
}
}
void waits()
{
unsigned long i;
for(i=0;i<350;i++) {
asm nop;
asm nop;
}
}
//-------------ATD function-----------------
//--------initialATD---------
void initialATD(void) {
ATD0CTL2=0xc0; //打开AD电源并关闭边沿触发
ATD0CTL3=0x28; //一个序列转换5次,非fifo模式
//ATD0CTL3=0x40; //一个序列转换8次,非fifo模式
ATD0CTL4=0x09; //10位精度,速率1.25M(采用25M总线)
ATD0CTL5=0xC0;
}
//---------启动ATD--------
unsigned long AD_Filter(unsigned char chanel)
{ unsigned long sum,Max,Min,a[5];
unsigned char i;
ATD0CTL5=0xa0+chanel; //右对齐,无符号数,单次转化
while(!ATD0STAT0_SCF); //等待一个转换队列完成
//ATD0STAT0_SCF=1; //清除标志
a[0]=ATD0DR0;a[1]=ATD0DR1;a[2]=ATD0DR2;a[3]=ATD0DR3;a[4]=ATD0DR4;
//a[5]=ATD0DR5;a[6]=ATD0DR6;a[7]=ATD0DR7;
Max=a[0];Min=a[0];sum=a[0];
for(i=1;i<5;i++)
{sum=sum+a[i];
if(a[i]>Max)Max=a[i];
if(a[i]<Min)Min=a[i];
}
return ((sum-Max-Min)/3);
}
//--------SCI使用函数-----------------
//--------------SCI传送数据函数------
void TransmitT( char* text,int textnum)
{ unsigned char a;
unsigned int ii;
a=SCI0SR1;
for(ii=0;ii<=textnum;ii++)
{while (!(SCI0SR1 & 0x80)); /* wait for output buffer empty */
SCI0DRL = *(text+ii);} //test add 1 after performing
//while (!(SCI0SR1 & 0x80));
}
//---------------初始化串口------------
void IniCOM(void)
{SCI0BDL=163; //)6M晶振,25M总线,波特率为9600
SCI0CR1=0; //无奇偶校验,1个起始位8个数据位1个停止位
SCI0CR2 = 0x2c; //允许接收中断
}
void SCIsendgroup(void) {
TransmitT(psvdata0,7);
TransmitT(psvdata1,7);
TransmitT(psvdata2,7);
TransmitT(psvdata3,7);
TransmitT(pgvdata0,7);
TransmitT(pgvdata1,7);
TransmitT(pgvdata2,7);
TransmitT(ptemp0,7);
TransmitT(ptemp1,7);
TransmitT(pguandi,9);//多传一个字节,为无用字节,因为485传字节最后一个误码
}
//--------------CAN function---------------------------------
//----------------------initial CAN0rig--------------------
void initialcan(void) {
CAN0CTL0 = 0x01; /*Enter Initialization Mode
*
* 0b00000001
* ||||||||__ Enter Initialization Mode
* |||||||___ Sleep Mode Request bit
* ||||||____ Wake-Up disabled
* |||||_____ Time stamping disabled
* ||||______ Synchronized Status
* |||_______ CAN not affected by Wait
* ||________ Receiver Active Status bit
* |_________ Received Frame Flag bit
*/
while(CAN0CTL1_INITAK!=1); /* Wait for Initialization Mode acknowledge
* INITRQ bit = 1
*/
CAN0CTL1 = 0x80; /* Enable MSCAN module and not LoopBack Mode
*
* 0b10100000
* ||||||||__ Initialization Mode Acknowledge
* |||||||___ Sleep Mode Acknowledge
* ||||||____ Wake-up low-pass filter disabled
* |||||_____ Unimplemented
* ||||______ Listen Only Mode disabled
* |||_______ not Loop Back Mode enabled
* ||________ Ext Osc/Xtal as Clock Source
* |_________ MSCAN Module enabled
*/
CAN0BTR0 = 0x40; /* Synch Jump = 2 Tq clock Cycles
*
* 0b01000100
* ||||||||__
* |||||||___\
* ||||||____ |
* |||||_____ |_ CAN Clock Prescaler = 5
* ||||______ |
* |||_______ |
* ||________/
* |_________>- SJW = 2
*/
CAN0BTR1 = 0x36; /* Set Number of samples per bit, TSEG1 and TSEG2 (bit=500k)
*
* 0b00100100
* ||||||||__
* |||||||___|
* ||||||____|- TSEG1 = 5
* |||||_____|
* ||||______
* |||_______\_ TSEG2 = 3
* ||________/
* |_________ One sample per bit
*/
CAN0IDAC = 0x10; /* Set four 16-bit Filters
*
* 0b00010000
* ||||||||__
* |||||||___\_ Filter Hit Indicator
* ||||||____/
* |||||_____ Unimplemented
* ||||______
* |||_______>- Four 16-bit Acceptance Filters
* ||________
* |_________>- Unimplemented
*/
/* note Acceptance Filters neither Acceptance Filter is accorded with,message in receivebuffer will pass */
CAN0IDAR0 = 0xff; //|\ 16 bit Filter 0
CAN0IDMR0 = 0xff ; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR1 = 0xff; //| / with ID 0x100
CAN0IDMR1 = 0xff; //|/
CAN0IDAR2 = 0xff; //|\ 16 bit Filter 1
CAN0IDMR2 = 0xff; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR3 = 0xff; //| / with ID 0x000
CAN0IDMR3 = 0xff; //|/
CAN0IDAR4 = 0xff; //|\ 16 bit Filter 2
CAN0IDMR4 = 0xff; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR5 = 0xff; //| / with ID 0x000
CAN0IDMR5 = 0xff; //|/
CAN0IDAR6 = 0xff; //|\ 16 bit Filter 3
CAN0IDMR6 = 0xff; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR7 = 0xff; //| / with ID 0x000
CAN0IDMR7 = 0xff; //|/
CAN0CTL0 = 0x00; /* Exit Initialization Mode Request */
while ((CAN0CTL1&0x01) != 0){}; /* Wait for Normal Mode */
while(!(CAN0CTL0&0x10)); //note allways loop here
CAN0RFLG = 0xC3; /* Reset Receiver Flags
*
* 0b11000011
* ||||||||__ Receive Buffer Full Flag
* |||||||___ Overrun Interrupt Flag
* ||||||____
* |||||_____>- Transmitter Status Bits
* ||||______
* |||_______>- Receiver Status Bits
* ||________ CAN Status Change Interrupt Flag
* |_________ Wake-Up Interrupt Flag
*/
CAN0RIER = 0x01; /* Enable Receive Buffer Full Interrupt
*
* 0b00000001
* ||||||||__ Receive Buffer Full Int enabled
* |||||||___ Overrun Int disabled
* ||||||____
* |||||_____>- Tx Status Change disabled
* ||||______
* |||_______>- Rx Status Change disabled
* ||________ Status Change Int disabled
* |_________ Wake-Up Int disabled
*/
}
//-------------------------------sendframe-----------------------
int CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata ){
unsigned char index; //number for read message
unsigned char txbuffer = {0}; //symbol for CAN0TBSEL
if (!CAN0TFLG) /* Is Transmit Buffer full?? */
return 1;
CAN0TBSEL = CAN0TFLG; /* Select lowest empty buffer */
txbuffer = CAN0TBSEL; /* Backup selected buffer */
/* Load Id to IDR Registers */
*((unsigned long *) ((unsigned long)(&CAN0TXIDR0)))= id;
for (index=0;index<length;index++) {
*(&CAN0TXDSR0 + index) = txdata[index]; /* Load data to Tx buffer
* Data Segment Registers
*/
}
CAN0TXDLR = length; /* Set Data Length Code */
CAN0TXTBPR = priority; /* Set Priority */
CAN0TFLG = txbuffer; /* Start transmission */
while ((CAN0TFLG & txbuffer) != txbuffer); /* Wait for Transmission
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?