main.c
来自「9S12单片机实现电压、温度采集程序」· C语言 代码 · 共 706 行 · 第 1/2 页
C
706 行
* completion
*/
return 0;
}
//-------------------votage test function-------------------
// -------------------test 12 general Voltage to gvdata---------
void Read12GV(void){
unsigned int i;
for( i=0;i<=3;i++){
PTS=i<<4;
waits();
gvdata0[i]=AD_Filter(1);
}
for( i=0;i<=3;i++){
PTS=(i+4)<<4;
waits();
gvdata1[i]=AD_Filter(1);
}
for( i=0;i<=3;i++){
PTS=(i+8)<<4;
waits();
gvdata2[i]=AD_Filter(1);
}
}
//-------------------test 16 single Voltage to svdata---------
void Read16SV(void){
DDRK=0X3F;
PORTK=0X00;
waits();
waits();
waits();
svdata0[0]=AD_Filter(0);
PORTK=0X01;
waits();
waits();
waits();
svdata0[1]=AD_Filter(0);
PORTK=0X02;
waits();
waits();
waits();
svdata0[2]=AD_Filter(0);
PORTK=0X03;
waits();
waits();
waits();
svdata0[3]=AD_Filter(0);
PORTK=0X14;
waits();
waits();
waits();
waits();
svdata1[0]=AD_Filter(0);
PORTK=0X15;
waits();
waits();
waits();
waits();
svdata1[1]=AD_Filter(0);
PORTK=0X16;
waits();
waits();
waits();
waits();
svdata1[2]=AD_Filter(0);
PORTK=0X17;
svdata1[3]=AD_Filter(0);
waits();
waits();
waits();
waits();
PORTK=0X28;
waits();
svdata2[0]=AD_Filter(0);
PORTK=0X29;
waits();
waits();
waits();
waits();
svdata2[1]=AD_Filter(0);
PORTK=0X2A;
waits();
svdata2[2]=AD_Filter(0);
PORTK=0X2B;
waits();
svdata2[3]=AD_Filter(0);
waits();
PORTK=0X3C;
waits();
svdata3[0]=AD_Filter(0);
PORTK=0X3D;
waits();
svdata3[1]=AD_Filter(0);
PORTK=0X3E;
waits();
svdata3[2]=AD_Filter(0);
PORTK=0X3F;
waits();
svdata3[3]=AD_Filter(0);
waits();
}
//-------------------test General Voltage and Current to guandi---------
void Readguandi(){
guandi0=AD_Filter(2);
guandi[0]=(int)(9.8*guandi0);
guandi1=AD_Filter(3);
isoc=0.98*((float)guandi1-411);
guandi[1]=(int)(isoc*10);
}
void inttofloat() {
int i;
for( i=0;i<=3;i++){
//fsvdata0[i]=0.00162*svdata0[i];
//fsvdata1[i]=0.00162*svdata1[i];
//fsvdata2[i]=0.00162*svdata2[i];
//fsvdata3[i]=0.00162*svdata3[i];
fgvdata0[i]=0.01468*gvdata0[i];
fgvdata1[i]=0.01468*gvdata1[i];
fgvdata2[i]=0.01468*gvdata2[i];
}
}
//--------------18B20 function------------------
void delay0(unsigned int useconds)
{
for(; useconds>0; useconds--);
}
void delay1(unsigned long int useconds)
{
for(; useconds>0; useconds--);
}
unsigned char Init_18B20(void) {
unsigned char k;
DDRM=0B01000000;
PTM_PTM6=0;
delay0(4100); //leave it low for 650us
PTM_PTM6=1;
DDRM=0B00000000;
delay0(1000) ; //leave it for 118us wait for presence
k=PTM_PTM6;
//delay0(3850); // leave it for 620us
return( k );// 1=presence, 0 = no part
}
void DS18B20_Write_Byte(char Val)
{
unsigned char i;
for (i=0; i<8; i++) // writes byte, one bit at a time
{ DDRM=0B01000000;
PTM_PTM6=0;
delay0(0);
if( Val&0x01 )
PTM_PTM6=1;
else
PTM_PTM6=0;
delay0(170);
DDRM=0B00000000;
Val >>= 1;
}
delay0(170);
}
unsigned char DS18B20_Read_Byte(void)
{
unsigned char i, Value = 0;
for (i=0; i<8; i++)
{
DDRM=0B01000000;
PTM_PTM6=0; // DQ = 0; // pull DQ low to start timeslot
Value >>= 1;
delay0(0);
PTM_PTM6=0;// DQ = 1; // then return high
asm NOP;
DDRM=0B00000000;
delay0(0);
if( PTM_PTM6 )
Value|=0x80;
delay0(380); // wait for rest of timeslot!!!!!!!!!!!!!!!!!!!!!
}
return(Value);
}
void Config_18B20(void)
{
a=Init_18B20();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0x4E);
DS18B20_Write_Byte(0x19);
DS18B20_Write_Byte(0x1A);
DS18B20_Write_Byte(0x7F); // 12bit LSB: 0.0625
}
void Read_8bytes_RomID(void) {
int i;
for (i=0; i<8; i++){
ROMID[i]=DS18B20_Read_Byte();
}
}
void Write_8bytes_RomID(unsigned char* P) {
int i;
for (i=0; i<8; i++){
DS18B20_Write_Byte(P[i]) ;
}
}
void DS18B20_read_temp ()
{
unsigned char i,j;
for(j=0;j<4;j++) //为便于调试,仅以4 路为例,改循环次数即可扩充到8 路或更多
{
Init_18B20();
DS18B20_Write_Byte (0x55); //发送ROM 匹配命令
for(i=0;i<8;i++)
{
DS18B20_Write_Byte(SN0[j][i]); //发送64 位序列号
}
DS18B20_Write_Byte (0xBE); //发送读取暂存寄存器的命令
a=DS18B20_Read_Byte();
b=DS18B20_Read_Byte(); //前两位是发出的温度信号,只读前两位即可。
t=b;
t<<=8;
t=t|a;
temp0[j]=t;
tt=t*0.0625; //将温度的高位与低位合并
t= tt*10+0.5; //对结果进行4舍5入 */
data[j]=tt;
}
for(j=0;j<4;j++) //为便于调试,仅以4 路为例,改循环次数即可扩充到8 路或更多
{
Init_18B20();
DS18B20_Write_Byte (0x55); //发送ROM 匹配命令
for(i=0;i<8;i++)
{
DS18B20_Write_Byte(SN1[j][i]); //发送64 位序列号
}
DS18B20_Write_Byte (0xBE); //发送读取暂存寄存器的命令
a=DS18B20_Read_Byte();
b=DS18B20_Read_Byte(); //前两位是发出的温度信号,只读前两位即可。
t=b;
t<<=8;
t=t|a;
temp1[j]=t;
tt=t*0.0625; //将温度的高位与低位合并
t= tt*10+0.5; //对结果进行4舍5入 */
data[j]=tt;
}
}
#pragma CODE_SEG NON_BANKED
//--------------------receiveinterrupt------------
//receive :the messages with the RXIDR0&0x0f are puted in the corresponding rxdatax[]
//the lefted are puted in the rxdata[],if RXIDR0&0x0f==0,right led open,ifRXIDR0&0x0f==1 mid led open
//void interrupt 38 CAN0RxISR(void) {
//unsigned char length, index;
//sendflag=CAN0RXDSR0&0XFF;
// }
void interrupt 20 Receiv485fun(void) {
unsigned int a;
a=SCI0SR1;
Trsym=SCI0DRL;
if(socchangeenable==1){
SOCSHI=Trsym*0.004;
SOCFEN=Trsym*0.24;
SOCMIAO=Trsym*14.4;
socchangeenable=0;
} else if (Trsym==0x01)
scisendsign=1;
else if (Trsym==0x02)
socchangeenable=1;
/*if (Trsym==0X1F) {
masterTrRr485conbit=1; //Enable 485Tr
wait();
TransmitT(pp0,16); //it is not perfect the last two letters cannot be translate
wait();
wait();
masterTrRr485conbit=0;//Unenble 485Tr
} else if (Trsym==0X2F){
masterTrRr485conbit=1; //Enable 485Tr
TransmitT(pp1,24); //it is not perfect the last two letters cannot be translate
wait();
wait();
masterTrRr485conbit=0;//Unenble 485Tr
} */
//asm rti
}
void interrupt 7 RTICRG(void) {
CRGFLG_RTIF=1;
if(readisign==1){
readisign=0;
PORTE=0x00;
sign=0;
} else {
readisign=1;
PORTE=0x60;
sign=1;
}
DS18B20_read_temp ();
present0=Init_18B20();
DS18B20_Write_Byte (0xCC); // 跳过读序号列号的操作
DS18B20_Write_Byte(0x44); // 启动温度转换
//CAN0SendFrame((0x00180002), 0x00, 8, svdata0);
//CAN0SendFrame((0x00180004), 0x00, 8, svdata1);
//CAN0SendFrame((0x00180006), 0x00, 8, svdata2);
// CAN0SendFrame((0x00180008), 0x00, 8, svdata3);
CAN0SendFrame((0x0018000A), 0x00, 8, gvdata0);
CAN0SendFrame((0x0018000C), 0x00, 8, gvdata1);
CAN0SendFrame((0x0018000E), 0x00, 8, gvdata2);
CAN0SendFrame((0x00180010), 0x00, 8, temp0);
CAN0SendFrame((0x00180012), 0x00, 8, temp1);
CAN0SendFrame((0x00180014), 0x00, 8, guandi);
CRGFLG_RTIF=1;
}
void interrupt 38 CAN0RxISR(void) {
unsigned char length, index;
receiveintc=receiveintc+1;
length = (CAN0RXDLR & 0x0F);
if((CAN0RXIDR0&0X0F)==0)
{ for (index=0; index<length; index++)
// rxdata0[index] = *(&CAN0RXDSR0 + index); /* Get received data */
if(receiveflagp==0) {
PTP_PTP3=1;
receiveflagp=1;
} else if(receiveflagp==1) {
PTP_PTP3=0;
receiveflagp=0;
}
} else if((CAN0RXIDR0&0X0F)==1) { for (index=0; index<length; index++)
//rxdata1[index] = *(&CAN0RXDSR0 + index); /* Get received data */
if(receiveflagt==0) {
PTT_PTT4 = 1;
receiveflagt=1;
} else if(receiveflagt==1) {
PTT_PTT4 = 0;
receiveflagt=0;
}
/* else if((CAN0RXIDR0&0X0F)==2) { for (index=0; index<length; index++)
// rxdata2[index] = *(&CAN0RXDSR0 + index); // Get received data
}
else if((CAN0RXIDR0&0X0F)==3) { for (index=0; index<length; index++)
// rxdata3[index] = *(&CAN0RXDSR0 + index); // Get received data
} else if((CAN0RXIDR0&0X0F)==4) { for (index=0; index<length; index++)
// rxdata4[index] = *(&CAN0RXDSR0 + index); //Get received data
}
else if((CAN0RXIDR0&0X0F)==5) { for (index=0; index<length; index++)
// rxdata5[index] = *(&CAN0RXDSR0 + index); // Get received data
}
}else { for (index=0; index<length; index++)
//rxdata[index] = *(&CAN0RXDSR0 + index); //Get received data
} */
}
CAN0RFLG = 0x01; //Clear RXF
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?