附录1 main.c
#include "wei.h"
#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0x7005 #define P_IOB_Dir (volatile unsigned int *)0x7007 #define P_IOB_Attrib (volatile unsigned int *)0x7008 #define P_TimerB_Data (volatile unsigned int *)0x700C #define P_TimerB_Ctrl (volatile unsigned int *)0x700D #define P_INT_Ctrl (volatile unsigned int *)0x7010 #define P_INT_Clear (volatile unsigned int *)0x7011 #define P_ADC (volatile unsigned int *)0x7014 #define P_ADC_Ctrl (volatile unsigned int *)0x7015 #define P_ADC_MUX_Ctrl (volatile unsigned int *)0x702B #define P_ADC_MUX_Data (volatile unsigned int *)0x702C #define C_FIQ_PWM 0x8000 // P_INT_Ctrl #define C_FIQ_TMA 0x2000 // P_INT_Ctrl #define C_FIQ_TMB 0x0800 // P_INT_Ctrl #define C_IRQ4_1KHz 0x0010 // P_INT_Ctrl #define C_IRQ4_2KHz 0x0020 // P_INT_Ctrl #define C_IRQ4_4KHz 0x0040 // P_INT_Ctrl #define C_IRQ5_2Hz 0x0004 // P_INT_Ctrl #define C_IRQ5_4Hz 0x0008 // P_INT_Ctrl #define C_TMB_32KHz 0x0002 // P_TimerB_Ctrl #define C_TMB_PWM_OFF 0x0000 // P_TimerB_Ctrl #define P_Watchdog_Clear (volatile unsigned int *)0x7012 unsigned int mm,min,cny,Delaynumber,xp=255,flag,dd; unsigned int left,right; unsigned int pulse_x,pulse_y; unsigned int paixu[7]; //排序
unsigned int chdata[7]; //火焰传感器检测通道 unsigned int workstate=0; //进入检测范围 unsigned int sucessfire=0; //灭火成功标记
void PWM_left(unsigned int high_time,unsigned int cyclical_time); void PWM_right(unsigned int high_time,unsigned int cyclical_time); void forward(unsigned int m,unsigned int n) ; void forward_s(unsigned int m,unsigned int n); void forward_s2(unsigned int m,unsigned int n); void backward(unsigned int m,unsigned int n); void turn_left (unsigned int m); void turn_right(unsigned int m); void stop(void);
void system_init(void); //系统初始化
void delay_ms(unsigned int t ); //ms级延时程序 void delay_s(unsigned int t ); //s级延时程序 void adjust(void); //调整 void adjust_s(void); //粗调 void seekfire(void); //寻找火源 void fire(void); //灭火 void hf(void); int abs(int m);
void bizhan(void ) ; //避障 void biya(void ); //避崖 void Stage0(void);//阶段0 void Stage1(void); //阶段1 void Stage2(void); //阶段2 void Stage3(void); //阶段3 void revison();//修正函数
//++++++++++++主函数++++++++++++++++++// int main(void) {
system_init(); delay_s(3); while(1) {
seekfire(); fire(); delay_s(8); } }
//***************系统初始化*********************// void system_init(void) {
__asm("INT OFF");
*P_IOA_Dir=0xE700; // *P_IOA_Attrib=0xE7FF; *P_IOA_Data=0x1800;
*P_IOB_Dir = 0x0FFF; *P_IOB_Attrib = 0x0FFF; *P_IOB_Data = 0xF000;
*P_TimerB_Ctrl=(C_TMB_32KHz|C_TMB_PWM_OFF); *P_TimerB_Data=(65536-0.1*0.001*32768);
*P_INT_Ctrl |=(C_FIQ_TMB + C_IRQ4_1KHz + C_IRQ5_2Hz + C_IRQ5_4Hz); //TMB用来控制2个电机,1KHZ 控制避崖,
__asm("INT IRQ,FIQ"); //2HZ用来控制AD 采集 4HZ用来避障
//***************寻找火源*********************// void seekfire(void) {
Stage0(); //阶段0 按一定的路径走
Stage1(); //阶段1 有发现火源,做初步调整 Stage2(); //阶段2 接近火源,边走边调整
Stage3(); //阶段3 到达火源前面,做最后的调整 }
void Stage0(void) //阶段0 {
flag=0;
while(1) {
turn_left(120); //转360度 扫描有没有火源 forward(250,250);
if(workstate==1 && flag==0) break; } }
void Stage1(void) //阶段1 {
flag=1;
Set_IOB_Data(0,1); // 开启蜂鸣器报警 adjust_s(); switch(mm)
{
case 1: forward(60,60); break; case 2: forward(55,55); break; case 3: forward(50,50); break; case 4: forward(45,45); break; case 5: forward(35,35); break; case 6: forward(30,30); break; case 7: forward(20,20); break;
case 8: forward(10,10); break; case 9: forward(5,5); break; case 10: forward(2,2); break; case 11: forward_s(1,1); break; default: break; } }
void Stage2(void) //阶段2 {
flag=2; while(1) {
switch(mm) {
case 1: forward(40,40); break; case 2: forward(30,30); break; case 3: forward(25,25); break; case 4: forward(20,20); break; case 5: forward(18,18); break; case 6: forward(15,15); break; case 7: forward(12,12); break;
case 8: forward(10,10); break; case 9: forward(5,5); break; case 10: forward(2,2); break; case 11: forward_s(1,1); break; default: break; }
if(chdata[3]
void Stage3(void) //阶段3 灭火前最后调整 {
unsigned int i; flag=3;
for(i=0;i
if(chdata[3]
if(chdata[3]0x05 ) {turn_left(1) ; delay_ms(10); } if(chdata[3]>0x05 && chdata[4]
//***************灭火*********************// void fire() {
unsigned int n;
while(chdata[3]
if(n>=1)revison();//如果1次吹不灭则调用修正 Set_IOA_Data(15,1); // 灭火风扇开启 delay_s(8);
Set_IOA_Data(15,0); // 灭火风扇关闭 delay_s(3); n++;
sucessfire=1; // 1 灭火成功 workstate=0; flag=0;
Set_IOB_Data(0,0); // 开启蜂鸣器报警 xp=255; mm=0; min=255; }
//***************修正子程序*********************// void revison() {
forward(8,8); adjust(); }
//***************调整*********************// void adjust_s(void) {
if(min==chdata[1]) turn_left(21); if(min==chdata[2]) turn_left(12);
if(min==chdata[3] && abs(chdata[3]-chdata[4])>30 )turn_left(5) ;
if(min==chdata[4] && abs(chdata[3]-chdata[4])>30 )turn_right(5); if(min==chdata[5]) turn_right(15); if(min==chdata[6]) turn_right(30); }
void adjust(void) {
while(min
if(min==chdata[1]) {turn_left(21); delay_ms(20); } if(min==chdata[2]) {turn_left(5); delay_ms(20); }
if( min==chdata[3] && abs(chdata[3]-chdata[4])>20 ){turn_left(1); delay_ms(20); } if( min==chdata[4] && abs(chdata[3]-chdata[4])>20 ){turn_right(1); delay_ms(20); } if( min==chdata[3] && abs(chdata[3]-chdata[4])
if(min==chdata[5]) {turn_right(5); delay_ms(20); } if(min==chdata[6]) {turn_right(30); delay_ms(20); } } }
//***************前进*********************// void forward(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(17,217); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
void forward_s(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(17,417); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
void forward_s2(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(15,215); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************后退*********************// void backward(unsigned int m,unsigned int n) {
while(1) {
if(pulse_xm && pulse_yn) { PWM_left(13,213); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************左转*********************// void turn_left(unsigned int m) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_ym) { PWM_left(13,413) ;}
if(pulse_x>m && pulse_y>m) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************右转*********************// void turn_right(unsigned int m) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_ym) { PWM_left(17,417) ; }
if(pulse_x>m && pulse_y>m) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************停止*********************// void stop(void) {
*P_IOA_Data &=~(bit13 + bit14); //将IOA13、IOA14清0
}
//***************控制小车左轮*********************//
void PWM_left(unsigned int high_time,unsigned int cyclical_time) {
if(left
Set_IOA_Data(14,0); // 将IOA14清0
if(left > cyclical_time) {
left=0; pulse_x ++; }
*P_Watchdog_Clear=0x0001; }
//***************控制小车右轮*********************//
void PWM_right(unsigned int high_time,unsigned int cyclical_time) {
if(right
Set_IOA_Data(13,1); // 将IOA13置1 else
Set_IOA_Data(13,0); // 将IOA13清0 if(right > cyclical_time) {
right=0; pulse_y ++; }
*P_Watchdog_Clear=0x0001; }
//***************IRQ4中断*********************// void IRQ4(void) __attribute__ ((ISR)); void IRQ4(void) {
if(*P_INT_Ctrl & C_IRQ4_1KHz) {
*P_INT_Clear |=C_IRQ4_1KHz ; dd++;
if(dd>=100) //100ms检测一次 {
dd=0; biya();
}
if(*P_INT_Ctrl & C_IRQ4_2KHz) {
*P_INT_Clear |=C_IRQ4_2KHz ; } else {
*P_INT_Clear |=C_IRQ4_4KHz;
} }
//***************IRQ5中断*********************// void IRQ5(void) __attribute__ ((ISR)); void IRQ5(void) {
if(*P_INT_Ctrl & C_IRQ5_4Hz) { //IRQ5_4HZ
*P_INT_Clear |=C_IRQ5_4Hz ; bizhan(); //避障 }
else
{ //IRQ5_2HZ
*P_INT_Clear |=C_IRQ5_2Hz; hf(); //比较检测到AD 的最小值
if(xp
} }
//***************A/D转换*********************// void get_AD(void) {
unsigned int ak[15];
unsigned int i,j,temp,k,sum; unsigned int Line,AD_Data;
*P_ADC_Ctrl=0x01; //允许转换 for(Line=1;Line
*P_ADC_MUX_Ctrl=Line;//选择通道
AD_Data=*P_ADC_MUX_Data;//启动转换 for(i=0;i
while(!(*P_ADC_MUX_Ctrl&0x8000)); //没有转换完则继续等待
AD_Data =AD_Data>>8 ; //右移8位,只取8高位数据 ak[i]=AD_Data; }
for(i=0;i
for(j=i+1;j
if(ak[i]>ak[j]){temp=ak[i];ak[i]=ak[j];ak[j]=temp;} }
sum=0;
for(k=5;k
/***********************************************************/ void hf(void) {
unsigned int i,j,temp; get_AD();
for(i=1;i
paixu[i]=chdata[i]; for(i=1;i
for(j=i+1;j
if(paixu[i]>paixu[j]){temp=paixu[i];paixu[i]=paixu[j];paixu[j]=temp;} }
min=paixu[1]; //min 为单前这次检测到的最低值 xp =xp
if(0xC9
if(0x0F
/******************避崖程序*********************************/ void biya(void )
if(!(*P_IOB_Data & 0x8000)) //q1 1000 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0x4000)) //q2 0100 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0xc000)) //q12 1100 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0x2000)) //h1 0010 {
stop();
forward(15,15); turn_left(10); }
if(!(*P_IOB_Data & 0x1000)) //h2 0001 {
stop();
forward(15,15); turn_left(10); }
if(!(*P_IOB_Data & 0x3000)) //h1 2 0011 {
stop();
forward(15,15); turn_left(10); }
else; }
/******************避障程序******************************/ void bizhan(void ) {
if(Get_IOA_Data(12)==0 && Get_IOA_Data(11) ==1 ) //zuobing {
backward(15,15);
while(Get_IOA_Data(12)==0) {
turn_right(30); forward(20,20); turn_left(21); } }
if(Get_IOA_Data(11)==0 && Get_IOA_Data(12) ==1 ) //youbing {
backward(15,15);
while(Get_IOA_Data(11)==0) {
turn_left(21); forward(20,20); turn_right(30); } }
if(Get_IOA_Data(11)==0 && Get_IOA_Data(12) ==0) {
backward(15,15); turn_left(21); forward(20,20); turn_right(30); } }
/******************延时子程序******************************/ void delay_s(unsigned int t ) // s级延时程序 {
unsigned int i; for(i=0;i
delay_ms(1000); }
void delay_ms(unsigned int t) // ms级延时程序 {
Delaynumber=0;
while(Delaynumber
附录2 FIQ.asm
.DEFINE P_INT_Ctrl 0x7010 // Control port for interrupt source .DEFINE P_INT_Clear 0x7011 // Clear interrupt source .DEFINE C_FIQ_TMB 0x0800 // Timer B FIQ .DEFINE C_FIQ_TMA 0x2000 // Timer A FIQ .DEFINE C_FIQ_PWM 0x8000 // PWM FIQ .external _left,_right,_Delaynumber
.PUBLIC _IRQ0,_IRQ1,_IRQ2,_IRQ3,_IRQ6,_IRQ7,_BREAK .TEXT
.PUBLIC _FIQ _FIQ:
push r1,r5 to [sp] r1 = C_FIQ_TMA
test r1,[P_INT_Ctrl] jnz L_FIQ_TimerA r1 = C_FIQ_TMB
test r1,[P_INT_Ctrl] jnz L_FIQ_TimerB L_FIQ_PWM:
r1 = C_FIQ_PWM [P_INT_Clear] = r1 pop r1,r5 from [sp] reti
L_FIQ_TimerA:
[P_INT_Clear] = r1 pop r1,r5 from [sp] reti
L_FIQ_TimerB:
[P_INT_Clear] = r1 r2=[_left] r2 +=1 [_left]=r2
r3=[_right] r3 +=1
[_right]=r3
r4=[_Delaynumber] r4 +=1
[_Delaynumber]=r4
pop r1,r5 from [sp] reti
_IRQ0: reti _IRQ1: reti _IRQ2: reti _IRQ3: reti _IRQ6: reti _IRQ7: reti _BREAK: reti
附录3 wei.h
#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOB_Data (volatile unsigned int *)0x7005 #ifndef __WEI_h__ #define __WEI_h__
// write your header here #define bit0 0x0001 #define bit1 0x0002 #define bit2 0x0004 #define bit3 0x0008 #define bit4 0x0010 #define bit5 0x0020 #define bit6 0x0040 #define bit7 0x0080 #define bit8 0x0100 #define bit9 0x0200 #define bit10 0x0400 #define bit11 0x0800 #define bit12 0x1000 #define bit13 0x2000 #define bit14 0x4000 #define bit15 0x8000
//**********单独设置I/O的Data 信息***********
void Set_IOA_Data(unsigned int x,unsigned int y) {
switch(x) {
case 0: if(y==1) *P_IOA_Data |= 0x0001; if(y==0) *P_IOA_Data &= 0xfffe; break;
case 1: if(y==1) *P_IOA_Data |= 0x0002; if(y==0) *P_IOA_Data &= 0xfffd; break;
case 2: if(y==1) *P_IOA_Data |= 0x0004; if(y==0) *P_IOA_Data &= 0xfffb; break;
case 3: if(y==1) *P_IOA_Data |= 0x0008; if(y==0) *P_IOA_Data &= 0xfff7; break;
case 4: if(y==1) *P_IOA_Data |= 0x0010; if(y==0) *P_IOA_Data &= 0xffef; break;
case 5: if(y==1) *P_IOA_Data |= 0x0020;
} void {
}
if(y==0) break; case 6: if(y==1) if(y==0) break; case 7: if(y==1) if(y==0) break; case 8: if(y==1) if(y==0) break; case 9: if(y==1) if(y==0) break; case 10:if(y==1) if(y==0) break; case 11:if(y==1) if(y==0) break; case 12:if(y==1) if(y==0) break; case 13:if(y==1) if(y==0) break; case 14:if(y==1) if(y==0) break; case 15:if(y==1) if(y==0) break;
*P_IOA_Data &= 0xffdf; *P_IOA_Data |= 0x0040; *P_IOA_Data &= 0xffbf; *P_IOA_Data |= 0x0080; *P_IOA_Data &= 0xff7f; *P_IOA_Data |= 0x0100; *P_IOA_Data &= 0xfeff; *P_IOA_Data |= 0x0200; *P_IOA_Data &= 0xfdff; *P_IOA_Data |= 0x0400; *P_IOA_Data &= 0xfbff; *P_IOA_Data |= 0x0800; *P_IOA_Data &= 0xf7ff; *P_IOA_Data |= 0x1000; *P_IOA_Data &= 0xefff; *P_IOA_Data |= 0x2000; *P_IOA_Data &= 0xdfff; *P_IOA_Data |= 0x4000; *P_IOA_Data &= 0xbfff; *P_IOA_Data |= 0x8000; *P_IOA_Data &= 0x7fff;
Set_IOB_Data(unsigned int x,unsigned int y) switch(x) {
case 0: if(y==1) if(y==0) break; case 1: if(y==1) if(y==0) break; case 2: if(y==1)
*P_IOB_Data |= 0x0001; *P_IOB_Data &= 0xfffe; *P_IOB_Data |= 0x0002; *P_IOB_Data &= 0xfffd; *P_IOB_Data |= 0x0004;
if(y==0) *P_IOB_Data &= break;
case 3: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 4: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 5: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= 0xfffb; 0x0008; 0xfff7; 0x0010; 0xffef; 0x0020; 0xffdf; break;
case 6: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 7: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 8: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 9: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 10:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 11:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 12:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 13:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 14:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 15:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break; } }
//**********单独获取I/O的Data 信息*********** unsigned int Get_IOA_Data(unsigned int x)
0x0040; 0xffbf; 0x0080; 0xff7f; 0x0100; 0xfeff; 0x0200; 0xfdff; 0x0400; 0xfbff; 0x0800; 0xf7ff; 0x1000; 0xefff; 0x2000; 0xdfff; 0x4000; 0xbfff; 0x8000; 0x7fff;
{
unsigned int a; switch(x) {
case 0: a=*P_IOA_Data&0x0001; if(a==0) return a; else return 1; case 1: a=*P_IOA_Data&0x0002; if(a==0) return a; else return 1; case 2: a=*P_IOA_Data&0x0004; if(a==0) return a; else return 1; case 3: a=*P_IOA_Data&0x0008; if(a==0) return a; else return 1; case 4: a=*P_IOA_Data&0x0010; if(a==0) return a; else return 1; case 5: a=*P_IOA_Data&0x0020; if(a==0) return a; else return 1; case 6: a=*P_IOA_Data&0x0040; if(a==0) return a; else return 1; case 7: a=*P_IOA_Data&0x0080; if(a==0) return a; else return 1; case 8: a=*P_IOA_Data&0x0100; if(a==0) return a; else return 1; case 9: a=*P_IOA_Data&0x0200; if(a==0) return a; else return 1; case 10:a=*P_IOA_Data&0x0400; if(a==0) return a; else return 1; case 11:a=*P_IOA_Data&0x0800; if(a==0) return a; else return 1; case 12:a=*P_IOA_Data&0x1000; if(a==0) return a; else return 1; case 13:a=*P_IOA_Data&0x2000; if(a==0) return a; else return 1;
case 14:a=*P_IOA_Data&0x4000; if(a==0) return a; else return 1; case 15:a=*P_IOA_Data&0x8000; if(a==0) return a; else return 1; default: return a; } }
unsigned int Get_IOB_Data(unsigned int x) {
unsigned int a; switch(x) {
case 0: a=*P_IOB_Data&0x0001; if(a==0) return a; else return 1; case 1: a=*P_IOB_Data&0x0002; if(a==0) return a; else return 1; case 2: a=*P_IOB_Data&0x0004; if(a==0) return a; else return 1; case 3: a=*P_IOB_Data&0x0008; if(a==0) return a; else return 1; case 4: a=*P_IOB_Data&0x0010; if(a==0) return a; else return 1; case 5: a=*P_IOB_Data&0x0020; if(a==0) return a; else return 1; case 6: a=*P_IOB_Data&0x0040; if(a==0) return a; else return 1; case 7: a=*P_IOB_Data&0x0080; if(a==0) return a; else return 1; case 8: a=*P_IOB_Data&0x0100; if(a==0) return a; else return 1; case 9: a=*P_IOB_Data&0x0200; if(a==0) return a; else return 1; case 10:a=*P_IOB_Data&0x0400;
if(a==0) return a; else return 1; case 11:a=*P_IOB_Data&0x0800; if(a==0) return a; else return 1; case 12:a=*P_IOB_Data&0x1000; if(a==0) return a; else return 1; case 13:a=*P_IOB_Data&0x2000; if(a==0) return a; }
}
#endif
else return 1; case 14:a=*P_IOB_Data&0x4000; if(a==0) return a; else return 1; case 15:a=*P_IOB_Data&0x8000; if(a==0) return a; else return 1; default: return a;
附录4 ds18b20.c
//晶振12m ,P0口为数据口,P2.0~P2.3为扫描端口,共阳LED 数码管,P1.0为数据输入口 #include
void delay(unsigned int i);
void display(unsigned int number);
ReadTemperature(void);
void delayMs(unsigned int a);
Init_DS18B20(void);
ReadOneChar(void);
WriteOneChar(unsigned char dat);
unsigned int temp;
sbit DQ =P1^0; //定义通信端口
sbit BEEP=P1^1; //喇叭输出脚
sbit KEY=P1^7;
unsigned int outseg[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; //0123456789. 段控
unsigned int outbit[4] ={0xfe,0xfd,0xfb,0xf7}; //位控
unsigned int ledbuf[4];
unsigned int xs;
void bi(unsigned int t) ;
void main(void)
{
KEY=1;
while(1) //主循环
{
ReadTemperature();
display(1000);
if(temp>45)bi(800);//报警
if(KEY==0)
{
bi(800);//嘀一阵
}
else;
}
}
void bi(unsigned int t)
{
unsigned int c;
for(c=0;c
{
display(1); //延时
BEEP=~BEEP; //取反输出到喇叭的信号
}
ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
unsigned int k;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
a=a>>4;
t=b
temp=t|a;
k=a &(0x0f);
xs=k*(0.625);
}
void display(unsigned int number) //主程序温度显示函数 {
unsigned int i,j;
ledbuf[0] =xs;//小数位
ledbuf[1] =10;// 小数点
ledbuf[2] =temp%10;// 个位数
ledbuf[3] =temp/10;// 十位数
for(i=0;i
for(j=0;j
{
P2=outbit[j];
P0=outseg[ledbuf[j]];
delayMs(1);
P2 |=0xf0;
}
}
//延时 a * 1ms
void delayMs(unsigned int a)
{
unsigned int i, j;
for(i = a; i > 0; i--)
for(j =5; j > 0; j--);
}
void delay(unsigned int count)
unsigned int i;
for(i=0;i
}
Init_DS18B20(void) //初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ 拉低
delay(60); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(6);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
附录1 main.c
#include "wei.h"
#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0x7005 #define P_IOB_Dir (volatile unsigned int *)0x7007 #define P_IOB_Attrib (volatile unsigned int *)0x7008 #define P_TimerB_Data (volatile unsigned int *)0x700C #define P_TimerB_Ctrl (volatile unsigned int *)0x700D #define P_INT_Ctrl (volatile unsigned int *)0x7010 #define P_INT_Clear (volatile unsigned int *)0x7011 #define P_ADC (volatile unsigned int *)0x7014 #define P_ADC_Ctrl (volatile unsigned int *)0x7015 #define P_ADC_MUX_Ctrl (volatile unsigned int *)0x702B #define P_ADC_MUX_Data (volatile unsigned int *)0x702C #define C_FIQ_PWM 0x8000 // P_INT_Ctrl #define C_FIQ_TMA 0x2000 // P_INT_Ctrl #define C_FIQ_TMB 0x0800 // P_INT_Ctrl #define C_IRQ4_1KHz 0x0010 // P_INT_Ctrl #define C_IRQ4_2KHz 0x0020 // P_INT_Ctrl #define C_IRQ4_4KHz 0x0040 // P_INT_Ctrl #define C_IRQ5_2Hz 0x0004 // P_INT_Ctrl #define C_IRQ5_4Hz 0x0008 // P_INT_Ctrl #define C_TMB_32KHz 0x0002 // P_TimerB_Ctrl #define C_TMB_PWM_OFF 0x0000 // P_TimerB_Ctrl #define P_Watchdog_Clear (volatile unsigned int *)0x7012 unsigned int mm,min,cny,Delaynumber,xp=255,flag,dd; unsigned int left,right; unsigned int pulse_x,pulse_y; unsigned int paixu[7]; //排序
unsigned int chdata[7]; //火焰传感器检测通道 unsigned int workstate=0; //进入检测范围 unsigned int sucessfire=0; //灭火成功标记
void PWM_left(unsigned int high_time,unsigned int cyclical_time); void PWM_right(unsigned int high_time,unsigned int cyclical_time); void forward(unsigned int m,unsigned int n) ; void forward_s(unsigned int m,unsigned int n); void forward_s2(unsigned int m,unsigned int n); void backward(unsigned int m,unsigned int n); void turn_left (unsigned int m); void turn_right(unsigned int m); void stop(void);
void system_init(void); //系统初始化
void delay_ms(unsigned int t ); //ms级延时程序 void delay_s(unsigned int t ); //s级延时程序 void adjust(void); //调整 void adjust_s(void); //粗调 void seekfire(void); //寻找火源 void fire(void); //灭火 void hf(void); int abs(int m);
void bizhan(void ) ; //避障 void biya(void ); //避崖 void Stage0(void);//阶段0 void Stage1(void); //阶段1 void Stage2(void); //阶段2 void Stage3(void); //阶段3 void revison();//修正函数
//++++++++++++主函数++++++++++++++++++// int main(void) {
system_init(); delay_s(3); while(1) {
seekfire(); fire(); delay_s(8); } }
//***************系统初始化*********************// void system_init(void) {
__asm("INT OFF");
*P_IOA_Dir=0xE700; // *P_IOA_Attrib=0xE7FF; *P_IOA_Data=0x1800;
*P_IOB_Dir = 0x0FFF; *P_IOB_Attrib = 0x0FFF; *P_IOB_Data = 0xF000;
*P_TimerB_Ctrl=(C_TMB_32KHz|C_TMB_PWM_OFF); *P_TimerB_Data=(65536-0.1*0.001*32768);
*P_INT_Ctrl |=(C_FIQ_TMB + C_IRQ4_1KHz + C_IRQ5_2Hz + C_IRQ5_4Hz); //TMB用来控制2个电机,1KHZ 控制避崖,
__asm("INT IRQ,FIQ"); //2HZ用来控制AD 采集 4HZ用来避障
//***************寻找火源*********************// void seekfire(void) {
Stage0(); //阶段0 按一定的路径走
Stage1(); //阶段1 有发现火源,做初步调整 Stage2(); //阶段2 接近火源,边走边调整
Stage3(); //阶段3 到达火源前面,做最后的调整 }
void Stage0(void) //阶段0 {
flag=0;
while(1) {
turn_left(120); //转360度 扫描有没有火源 forward(250,250);
if(workstate==1 && flag==0) break; } }
void Stage1(void) //阶段1 {
flag=1;
Set_IOB_Data(0,1); // 开启蜂鸣器报警 adjust_s(); switch(mm)
{
case 1: forward(60,60); break; case 2: forward(55,55); break; case 3: forward(50,50); break; case 4: forward(45,45); break; case 5: forward(35,35); break; case 6: forward(30,30); break; case 7: forward(20,20); break;
case 8: forward(10,10); break; case 9: forward(5,5); break; case 10: forward(2,2); break; case 11: forward_s(1,1); break; default: break; } }
void Stage2(void) //阶段2 {
flag=2; while(1) {
switch(mm) {
case 1: forward(40,40); break; case 2: forward(30,30); break; case 3: forward(25,25); break; case 4: forward(20,20); break; case 5: forward(18,18); break; case 6: forward(15,15); break; case 7: forward(12,12); break;
case 8: forward(10,10); break; case 9: forward(5,5); break; case 10: forward(2,2); break; case 11: forward_s(1,1); break; default: break; }
if(chdata[3]
void Stage3(void) //阶段3 灭火前最后调整 {
unsigned int i; flag=3;
for(i=0;i
if(chdata[3]
if(chdata[3]0x05 ) {turn_left(1) ; delay_ms(10); } if(chdata[3]>0x05 && chdata[4]
//***************灭火*********************// void fire() {
unsigned int n;
while(chdata[3]
if(n>=1)revison();//如果1次吹不灭则调用修正 Set_IOA_Data(15,1); // 灭火风扇开启 delay_s(8);
Set_IOA_Data(15,0); // 灭火风扇关闭 delay_s(3); n++;
sucessfire=1; // 1 灭火成功 workstate=0; flag=0;
Set_IOB_Data(0,0); // 开启蜂鸣器报警 xp=255; mm=0; min=255; }
//***************修正子程序*********************// void revison() {
forward(8,8); adjust(); }
//***************调整*********************// void adjust_s(void) {
if(min==chdata[1]) turn_left(21); if(min==chdata[2]) turn_left(12);
if(min==chdata[3] && abs(chdata[3]-chdata[4])>30 )turn_left(5) ;
if(min==chdata[4] && abs(chdata[3]-chdata[4])>30 )turn_right(5); if(min==chdata[5]) turn_right(15); if(min==chdata[6]) turn_right(30); }
void adjust(void) {
while(min
if(min==chdata[1]) {turn_left(21); delay_ms(20); } if(min==chdata[2]) {turn_left(5); delay_ms(20); }
if( min==chdata[3] && abs(chdata[3]-chdata[4])>20 ){turn_left(1); delay_ms(20); } if( min==chdata[4] && abs(chdata[3]-chdata[4])>20 ){turn_right(1); delay_ms(20); } if( min==chdata[3] && abs(chdata[3]-chdata[4])
if(min==chdata[5]) {turn_right(5); delay_ms(20); } if(min==chdata[6]) {turn_right(30); delay_ms(20); } } }
//***************前进*********************// void forward(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(17,217); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
void forward_s(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(17,417); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
void forward_s2(unsigned int m,unsigned int n) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_yn) { PWM_left(15,215); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************后退*********************// void backward(unsigned int m,unsigned int n) {
while(1) {
if(pulse_xm && pulse_yn) { PWM_left(13,213); }
if(pulse_x>m && pulse_y>n) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************左转*********************// void turn_left(unsigned int m) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_ym) { PWM_left(13,413) ;}
if(pulse_x>m && pulse_y>m) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************右转*********************// void turn_right(unsigned int m) {
pulse_x=0; pulse_y=0; while(1) {
if(pulse_xm && pulse_ym) { PWM_left(17,417) ; }
if(pulse_x>m && pulse_y>m) { pulse_x=0;pulse_y=0 ; break;} if(workstate==1 && flag==0) { pulse_x=0;pulse_y=0 ; break;} } }
//***************停止*********************// void stop(void) {
*P_IOA_Data &=~(bit13 + bit14); //将IOA13、IOA14清0
}
//***************控制小车左轮*********************//
void PWM_left(unsigned int high_time,unsigned int cyclical_time) {
if(left
Set_IOA_Data(14,0); // 将IOA14清0
if(left > cyclical_time) {
left=0; pulse_x ++; }
*P_Watchdog_Clear=0x0001; }
//***************控制小车右轮*********************//
void PWM_right(unsigned int high_time,unsigned int cyclical_time) {
if(right
Set_IOA_Data(13,1); // 将IOA13置1 else
Set_IOA_Data(13,0); // 将IOA13清0 if(right > cyclical_time) {
right=0; pulse_y ++; }
*P_Watchdog_Clear=0x0001; }
//***************IRQ4中断*********************// void IRQ4(void) __attribute__ ((ISR)); void IRQ4(void) {
if(*P_INT_Ctrl & C_IRQ4_1KHz) {
*P_INT_Clear |=C_IRQ4_1KHz ; dd++;
if(dd>=100) //100ms检测一次 {
dd=0; biya();
}
if(*P_INT_Ctrl & C_IRQ4_2KHz) {
*P_INT_Clear |=C_IRQ4_2KHz ; } else {
*P_INT_Clear |=C_IRQ4_4KHz;
} }
//***************IRQ5中断*********************// void IRQ5(void) __attribute__ ((ISR)); void IRQ5(void) {
if(*P_INT_Ctrl & C_IRQ5_4Hz) { //IRQ5_4HZ
*P_INT_Clear |=C_IRQ5_4Hz ; bizhan(); //避障 }
else
{ //IRQ5_2HZ
*P_INT_Clear |=C_IRQ5_2Hz; hf(); //比较检测到AD 的最小值
if(xp
} }
//***************A/D转换*********************// void get_AD(void) {
unsigned int ak[15];
unsigned int i,j,temp,k,sum; unsigned int Line,AD_Data;
*P_ADC_Ctrl=0x01; //允许转换 for(Line=1;Line
*P_ADC_MUX_Ctrl=Line;//选择通道
AD_Data=*P_ADC_MUX_Data;//启动转换 for(i=0;i
while(!(*P_ADC_MUX_Ctrl&0x8000)); //没有转换完则继续等待
AD_Data =AD_Data>>8 ; //右移8位,只取8高位数据 ak[i]=AD_Data; }
for(i=0;i
for(j=i+1;j
if(ak[i]>ak[j]){temp=ak[i];ak[i]=ak[j];ak[j]=temp;} }
sum=0;
for(k=5;k
/***********************************************************/ void hf(void) {
unsigned int i,j,temp; get_AD();
for(i=1;i
paixu[i]=chdata[i]; for(i=1;i
for(j=i+1;j
if(paixu[i]>paixu[j]){temp=paixu[i];paixu[i]=paixu[j];paixu[j]=temp;} }
min=paixu[1]; //min 为单前这次检测到的最低值 xp =xp
if(0xC9
if(0x0F
/******************避崖程序*********************************/ void biya(void )
if(!(*P_IOB_Data & 0x8000)) //q1 1000 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0x4000)) //q2 0100 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0xc000)) //q12 1100 {
stop();
backward(20,20); turn_left(21); }
if(!(*P_IOB_Data & 0x2000)) //h1 0010 {
stop();
forward(15,15); turn_left(10); }
if(!(*P_IOB_Data & 0x1000)) //h2 0001 {
stop();
forward(15,15); turn_left(10); }
if(!(*P_IOB_Data & 0x3000)) //h1 2 0011 {
stop();
forward(15,15); turn_left(10); }
else; }
/******************避障程序******************************/ void bizhan(void ) {
if(Get_IOA_Data(12)==0 && Get_IOA_Data(11) ==1 ) //zuobing {
backward(15,15);
while(Get_IOA_Data(12)==0) {
turn_right(30); forward(20,20); turn_left(21); } }
if(Get_IOA_Data(11)==0 && Get_IOA_Data(12) ==1 ) //youbing {
backward(15,15);
while(Get_IOA_Data(11)==0) {
turn_left(21); forward(20,20); turn_right(30); } }
if(Get_IOA_Data(11)==0 && Get_IOA_Data(12) ==0) {
backward(15,15); turn_left(21); forward(20,20); turn_right(30); } }
/******************延时子程序******************************/ void delay_s(unsigned int t ) // s级延时程序 {
unsigned int i; for(i=0;i
delay_ms(1000); }
void delay_ms(unsigned int t) // ms级延时程序 {
Delaynumber=0;
while(Delaynumber
附录2 FIQ.asm
.DEFINE P_INT_Ctrl 0x7010 // Control port for interrupt source .DEFINE P_INT_Clear 0x7011 // Clear interrupt source .DEFINE C_FIQ_TMB 0x0800 // Timer B FIQ .DEFINE C_FIQ_TMA 0x2000 // Timer A FIQ .DEFINE C_FIQ_PWM 0x8000 // PWM FIQ .external _left,_right,_Delaynumber
.PUBLIC _IRQ0,_IRQ1,_IRQ2,_IRQ3,_IRQ6,_IRQ7,_BREAK .TEXT
.PUBLIC _FIQ _FIQ:
push r1,r5 to [sp] r1 = C_FIQ_TMA
test r1,[P_INT_Ctrl] jnz L_FIQ_TimerA r1 = C_FIQ_TMB
test r1,[P_INT_Ctrl] jnz L_FIQ_TimerB L_FIQ_PWM:
r1 = C_FIQ_PWM [P_INT_Clear] = r1 pop r1,r5 from [sp] reti
L_FIQ_TimerA:
[P_INT_Clear] = r1 pop r1,r5 from [sp] reti
L_FIQ_TimerB:
[P_INT_Clear] = r1 r2=[_left] r2 +=1 [_left]=r2
r3=[_right] r3 +=1
[_right]=r3
r4=[_Delaynumber] r4 +=1
[_Delaynumber]=r4
pop r1,r5 from [sp] reti
_IRQ0: reti _IRQ1: reti _IRQ2: reti _IRQ3: reti _IRQ6: reti _IRQ7: reti _BREAK: reti
附录3 wei.h
#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOB_Data (volatile unsigned int *)0x7005 #ifndef __WEI_h__ #define __WEI_h__
// write your header here #define bit0 0x0001 #define bit1 0x0002 #define bit2 0x0004 #define bit3 0x0008 #define bit4 0x0010 #define bit5 0x0020 #define bit6 0x0040 #define bit7 0x0080 #define bit8 0x0100 #define bit9 0x0200 #define bit10 0x0400 #define bit11 0x0800 #define bit12 0x1000 #define bit13 0x2000 #define bit14 0x4000 #define bit15 0x8000
//**********单独设置I/O的Data 信息***********
void Set_IOA_Data(unsigned int x,unsigned int y) {
switch(x) {
case 0: if(y==1) *P_IOA_Data |= 0x0001; if(y==0) *P_IOA_Data &= 0xfffe; break;
case 1: if(y==1) *P_IOA_Data |= 0x0002; if(y==0) *P_IOA_Data &= 0xfffd; break;
case 2: if(y==1) *P_IOA_Data |= 0x0004; if(y==0) *P_IOA_Data &= 0xfffb; break;
case 3: if(y==1) *P_IOA_Data |= 0x0008; if(y==0) *P_IOA_Data &= 0xfff7; break;
case 4: if(y==1) *P_IOA_Data |= 0x0010; if(y==0) *P_IOA_Data &= 0xffef; break;
case 5: if(y==1) *P_IOA_Data |= 0x0020;
} void {
}
if(y==0) break; case 6: if(y==1) if(y==0) break; case 7: if(y==1) if(y==0) break; case 8: if(y==1) if(y==0) break; case 9: if(y==1) if(y==0) break; case 10:if(y==1) if(y==0) break; case 11:if(y==1) if(y==0) break; case 12:if(y==1) if(y==0) break; case 13:if(y==1) if(y==0) break; case 14:if(y==1) if(y==0) break; case 15:if(y==1) if(y==0) break;
*P_IOA_Data &= 0xffdf; *P_IOA_Data |= 0x0040; *P_IOA_Data &= 0xffbf; *P_IOA_Data |= 0x0080; *P_IOA_Data &= 0xff7f; *P_IOA_Data |= 0x0100; *P_IOA_Data &= 0xfeff; *P_IOA_Data |= 0x0200; *P_IOA_Data &= 0xfdff; *P_IOA_Data |= 0x0400; *P_IOA_Data &= 0xfbff; *P_IOA_Data |= 0x0800; *P_IOA_Data &= 0xf7ff; *P_IOA_Data |= 0x1000; *P_IOA_Data &= 0xefff; *P_IOA_Data |= 0x2000; *P_IOA_Data &= 0xdfff; *P_IOA_Data |= 0x4000; *P_IOA_Data &= 0xbfff; *P_IOA_Data |= 0x8000; *P_IOA_Data &= 0x7fff;
Set_IOB_Data(unsigned int x,unsigned int y) switch(x) {
case 0: if(y==1) if(y==0) break; case 1: if(y==1) if(y==0) break; case 2: if(y==1)
*P_IOB_Data |= 0x0001; *P_IOB_Data &= 0xfffe; *P_IOB_Data |= 0x0002; *P_IOB_Data &= 0xfffd; *P_IOB_Data |= 0x0004;
if(y==0) *P_IOB_Data &= break;
case 3: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 4: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 5: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= 0xfffb; 0x0008; 0xfff7; 0x0010; 0xffef; 0x0020; 0xffdf; break;
case 6: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 7: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 8: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 9: if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 10:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 11:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 12:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 13:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 14:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break;
case 15:if(y==1) *P_IOB_Data |= if(y==0) *P_IOB_Data &= break; } }
//**********单独获取I/O的Data 信息*********** unsigned int Get_IOA_Data(unsigned int x)
0x0040; 0xffbf; 0x0080; 0xff7f; 0x0100; 0xfeff; 0x0200; 0xfdff; 0x0400; 0xfbff; 0x0800; 0xf7ff; 0x1000; 0xefff; 0x2000; 0xdfff; 0x4000; 0xbfff; 0x8000; 0x7fff;
{
unsigned int a; switch(x) {
case 0: a=*P_IOA_Data&0x0001; if(a==0) return a; else return 1; case 1: a=*P_IOA_Data&0x0002; if(a==0) return a; else return 1; case 2: a=*P_IOA_Data&0x0004; if(a==0) return a; else return 1; case 3: a=*P_IOA_Data&0x0008; if(a==0) return a; else return 1; case 4: a=*P_IOA_Data&0x0010; if(a==0) return a; else return 1; case 5: a=*P_IOA_Data&0x0020; if(a==0) return a; else return 1; case 6: a=*P_IOA_Data&0x0040; if(a==0) return a; else return 1; case 7: a=*P_IOA_Data&0x0080; if(a==0) return a; else return 1; case 8: a=*P_IOA_Data&0x0100; if(a==0) return a; else return 1; case 9: a=*P_IOA_Data&0x0200; if(a==0) return a; else return 1; case 10:a=*P_IOA_Data&0x0400; if(a==0) return a; else return 1; case 11:a=*P_IOA_Data&0x0800; if(a==0) return a; else return 1; case 12:a=*P_IOA_Data&0x1000; if(a==0) return a; else return 1; case 13:a=*P_IOA_Data&0x2000; if(a==0) return a; else return 1;
case 14:a=*P_IOA_Data&0x4000; if(a==0) return a; else return 1; case 15:a=*P_IOA_Data&0x8000; if(a==0) return a; else return 1; default: return a; } }
unsigned int Get_IOB_Data(unsigned int x) {
unsigned int a; switch(x) {
case 0: a=*P_IOB_Data&0x0001; if(a==0) return a; else return 1; case 1: a=*P_IOB_Data&0x0002; if(a==0) return a; else return 1; case 2: a=*P_IOB_Data&0x0004; if(a==0) return a; else return 1; case 3: a=*P_IOB_Data&0x0008; if(a==0) return a; else return 1; case 4: a=*P_IOB_Data&0x0010; if(a==0) return a; else return 1; case 5: a=*P_IOB_Data&0x0020; if(a==0) return a; else return 1; case 6: a=*P_IOB_Data&0x0040; if(a==0) return a; else return 1; case 7: a=*P_IOB_Data&0x0080; if(a==0) return a; else return 1; case 8: a=*P_IOB_Data&0x0100; if(a==0) return a; else return 1; case 9: a=*P_IOB_Data&0x0200; if(a==0) return a; else return 1; case 10:a=*P_IOB_Data&0x0400;
if(a==0) return a; else return 1; case 11:a=*P_IOB_Data&0x0800; if(a==0) return a; else return 1; case 12:a=*P_IOB_Data&0x1000; if(a==0) return a; else return 1; case 13:a=*P_IOB_Data&0x2000; if(a==0) return a; }
}
#endif
else return 1; case 14:a=*P_IOB_Data&0x4000; if(a==0) return a; else return 1; case 15:a=*P_IOB_Data&0x8000; if(a==0) return a; else return 1; default: return a;
附录4 ds18b20.c
//晶振12m ,P0口为数据口,P2.0~P2.3为扫描端口,共阳LED 数码管,P1.0为数据输入口 #include
void delay(unsigned int i);
void display(unsigned int number);
ReadTemperature(void);
void delayMs(unsigned int a);
Init_DS18B20(void);
ReadOneChar(void);
WriteOneChar(unsigned char dat);
unsigned int temp;
sbit DQ =P1^0; //定义通信端口
sbit BEEP=P1^1; //喇叭输出脚
sbit KEY=P1^7;
unsigned int outseg[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; //0123456789. 段控
unsigned int outbit[4] ={0xfe,0xfd,0xfb,0xf7}; //位控
unsigned int ledbuf[4];
unsigned int xs;
void bi(unsigned int t) ;
void main(void)
{
KEY=1;
while(1) //主循环
{
ReadTemperature();
display(1000);
if(temp>45)bi(800);//报警
if(KEY==0)
{
bi(800);//嘀一阵
}
else;
}
}
void bi(unsigned int t)
{
unsigned int c;
for(c=0;c
{
display(1); //延时
BEEP=~BEEP; //取反输出到喇叭的信号
}
ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
unsigned int k;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
a=a>>4;
t=b
temp=t|a;
k=a &(0x0f);
xs=k*(0.625);
}
void display(unsigned int number) //主程序温度显示函数 {
unsigned int i,j;
ledbuf[0] =xs;//小数位
ledbuf[1] =10;// 小数点
ledbuf[2] =temp%10;// 个位数
ledbuf[3] =temp/10;// 十位数
for(i=0;i
for(j=0;j
{
P2=outbit[j];
P0=outseg[ledbuf[j]];
delayMs(1);
P2 |=0xf0;
}
}
//延时 a * 1ms
void delayMs(unsigned int a)
{
unsigned int i, j;
for(i = a; i > 0; i--)
for(j =5; j > 0; j--);
}
void delay(unsigned int count)
unsigned int i;
for(i=0;i
}
Init_DS18B20(void) //初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ 拉低
delay(60); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(6);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}