?? last.c
字號:
/**********************************
程序框架
**********************************/
#include <p18f4520.h>
#define MAXNUM 400
#define MAXNUM2 200 //最大容許分配384個字節,見連接器配置文件
unsigned char AD_flag=0; //AD轉換完標志
unsigned char DATA_flag;
unsigned char databattery[2];
unsigned char datatemp[2]={0,0};
unsigned int datacount; //測量記數
unsigned char temper[2]="wd"; // 溫度標志
unsigned char battery[2]="dl"; // 電量標志
#pragma udata testdata //強制將大數組分配到一個特定的區域
ram unsigned char datace[MAXNUM]; //測量數據數組
// ram unsigned char datace2[MAXNUM2]; //測量數據數組
#pragma udata
void ADinitial(void);
void serialinital(void);
void initial(void);
void datatest(void); //導軌數據測量函數
void batterytest(void);
void Testtemp(void); //溫度測試
void waitidle(void); //等待IIC空閑
void IICinitial(void); //IIC初試化
void AD_isr(void); //AD中斷函數
//void senddata(unsigned char *p,unsigned char *q,unsigned int num);
void senddata(unsigned char *p);
void closeoropen(unsigned char key); //電機電源開關
void control(unsigned char flag); //電機正反轉控制
void ADread(); //AD讀數
/******************************
函數:void reset()
電機初始化復位,并設定任何開始測量時,電機都必須在左邊
*******************************/
void reset(void)
{
unsigned int i = 20000,j,p;
if(PORTDbits.RD7 == 0)
{
control(0); //控制電機左轉
closeoropen(1); //開電機電源
while(PORTDbits.RD7 == 0); //等待電機到頭
while(i-->0);
while(PORTDbits.RD7 == 0);
closeoropen(0); //關電機
}
}
/*****************************
函數:void timer0inition(void)
初始化為定時方式
*******************************/
void timer0inition(void)
{
T0CON=0x09; //16為定時方式,不分頻,查詢方式
// TMR0H=0xf5;
// TMR0L=0x26; // 延時1MS
TMR0H=0xfa;
TMR0L=0x93; //延時500us
T0CONbits.TMR0ON=0;
INTCONbits.TMR0IF=0;
}
/****************************
函數:void delay(unsigned int time)
延時
*****************************/
void delay(unsigned int time)
{
while(time--)
{
T0CONbits.TMR0ON=1;
while(INTCONbits.TMR0IF==0);
T0CONbits.TMR0ON=0;
INTCONbits.TMR0IF=0;
// TMR0H=0xf5;
// TMR0L=0x26; // 延時1MS
// TMR0H=0xfa;
// TMR0L=0x93; //延時500us
TMR0H=0xfc;
TMR0L=0xbe; //延時300us
while(PORTDbits.RD6 == 1||PORTDbits.RD7 == 1)
break;
}
}
/******************************
函數:void closeoropen(char key)
電機電源開關,'0'關,‘1’開
*******************************/
void closeoropen(unsigned char key)
{ unsigned int i = 200,j,p;
if(key == 1)
// LATBbits.LATB4 = 1; //開電機
LATBbits.LATB4 = 0; //開電機
else
// LATBbits.LATB4 = 0; // 關電機
LATBbits.LATB4 = 1; // 關電機
while(i-->0);
}
/******************************
函數:void control(char flag)
電機正反轉控制,‘0’時,電機往左跑,為‘1’時電機往右跑
*******************************/
void control(unsigned char flag)
{ unsigned int i = 200,j,p;
if(flag == 1)
LATDbits.LATD4 = 1;
else
LATDbits.LATD4 = 0;
while(i-->0);
}
/******************************
函數名:initial()
單片機初試化
******************************/
void initial(void)
{
//senddata("wo shi liu hongwen",40);
INTCON=0;
PIE1=0;
PIE2=0;
PIR1=0;
PIR2=0;
RCONbits.IPEN = 0; //禁止中斷優先級
TRISDbits.TRISD7 = 1; //RD7為左到頭,光電管檢測,配置為輸入
TRISDbits.TRISD6 = 1; //RD6為右到頭,光電管檢測,配置為輸入
TRISBbits.TRISB4 = 0; //電機電源控制總開關
TRISDbits.TRISD4 = 0; //電機正反轉控制,先假設控制信號為‘0’時,電機往左跑,為‘1’時電機往右跑
PORTBbits.RB4 = 1; //切斷電機電源 RB is input LAT is output
}
/*****************************
函數名:serialinitial()
串口初始化
*****************************/
void serialinital(void)
{
TXSTA=0X04;
RCSTA=0X80; //串行端口使能,異步模式下使能連續接收
TRISC=TRISC|0X80;
TRISC=TRISC&0XBF;
SPBRG=35; //11.0592M晶振時,SPBRG寄存器為35,波特率=FOSC/[16(X+1)] 波特率為19200
TXSTAbits.TXEN = 1;
RCSTAbits.CREN = 1;
}
/*******************************
函數名:IICinitial()
IIc總線初始化
********************************/
void IICinitial(void)
{
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
SSPCON1 = 0X28; //使能IIC串行總線,并工作在主控方式
SSPADD = 7; //定義波特率,4MHz時,時鐘=4MHZ/[4*(7+1)]=0。125MHZ
SSPSTAT = 0X80; //IIC模式下,關閉標準速度方式的回轉率控制
PIR1bits.SSPIF == 0;
TMR1H = 0;
TMR1L = 0;
PIR1bits.TMR1IF = 0;
}
/********************************
函數名:waitidle()
等待IIC空閑
********************************/
void waitidle(void)
{
while ((SSPCON2 & 0x1F )|(SSPSTATbits.R_W ))
continue;
}
/********************************
函數名:configtcn75(unsigned char cmd)
配置TCN75
*********************************/
void configtcn75(unsigned char cmd)
{
SSPSTATbits.CKE = 1;
SSPCON2bits.SEN = 1; //啟動IIC
while(SSPCON2bits.SEN == 1); //等待IIC空閑將它設為1
SSPBUF = 0x90; //寫TCN75器件地址
waitidle();
while(SSPCON2bits.ACKSTAT == 1); //等待應答
SSPBUF = 0x01; //寫TCN75配制寄存器config地址
waitidle();
while(SSPCON2bits.ACKSTAT == 1); //等待應答
SSPBUF = cmd; //寫TCN75配制寄存器config內容
waitidle();
while(SSPCON2bits.ACKSTAT == 1); //等待應答
SSPCON2bits.PEN = 1;
while(SSPCON2bits.PEN == 1); //發送停止位
}
/********************************
函數名:Testtemp()
啟動溫度測試
********************************/
void Testtemp(void)
{
unsigned char str[]="wd";
unsigned char temp,readdata = 0;
unsigned char cmd_byte = 0x01;
unsigned int j;
IICinitial();
configtcn75(0xE0); //連續測量模式
while(1)
{
SSPSTATbits.CKE = 1;
SSPCON2bits.SEN = 1; //啟動IIC
while(SSPCON2bits.SEN == 1); //等待IIC空閑將它設為1
SSPBUF = 0x90; //寫TCN75器件地址
waitidle();
while(SSPCON2bits.ACKSTAT == 1); //等待應答
SSPBUF = cmd_byte; //寫TCN75配制寄存器config地址
waitidle();
while(SSPCON2bits.ACKSTAT == 1); //等待應答
SSPCON2bits.RSEN = 1; //重新發起始信號
while(SSPCON2bits.RSEN == 1);
SSPBUF = 0X91; //讀TCN75
waitidle();
while(SSPCON2bits.ACKSTAT == 1);
SSPCON2bits.RCEN = 1; //容許接收
while(SSPCON2bits.RCEN == 1);
while(!SSPSTATbits.BF);
readdata = SSPBUF;
if(cmd_byte == 0)
{
SSPCON2bits.ACKDT = 0;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN == 1);
SSPCON2bits.RCEN = 1; //容許接收
while(SSPCON2bits.RCEN == 1);
while(!SSPSTATbits.BF);
temp = SSPBUF;
}
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN == 1);
SSPCON2bits.PEN = 1;
while(SSPCON2bits.PEN == 1); //發送停止位
if(cmd_byte == 0) break;
if(readdata & 0x80)
cmd_byte = 0x01;
else
cmd_byte = 0x00;
}
senddata(temper);
datatemp[1]=readdata;
senddata(datatemp);
TXREG = 0xaa;
while(PIR1bits.TXIF == 0); //等待串口發送完成
for(j = 300;j > 0;j--);
// senddata(&readdata,str,1);
/* TXREG = '#' ;
while(PIR1bits.TXIF == 0); //等待串口發送完成
for(j = 300;j > 0;j--);
TXREG = readdata ;
while(PIR1bits.TXIF == 0); //等待串口發送完成
for(j = 300;j > 0;j--);
// senddata(datatemp);
// senddata(end);
TXREG = 0xaa;
while(PIR1bits.TXIF == 0); //等待串口發送完成
for(j = 300;j > 0;j--);
*/
}
/******************************
函數名:ADinitial()
AD初始化
*******************************/
void ADinitial(void)
{
// ADCON0 = 0X00; //選擇通道0
// ADCON0 = 0X04; //選擇通道1
ADCON1 = 0X3D; //選擇只有通道0,1為模擬輸入,其它的為數字IO,采用外部基準電壓源
ADCON2 = 0XB1;
PIE1bits.ADIE=0; //AD中斷不容許
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -