智能灭火机器人设计第程序

附录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);

}


相关文章

  • 智能机器人教育装备
  • 上海寰益--智能机器人教育培训系统产品信息上海寰益智能仪器科技有限公司Shanghai Huanyi Intelligent Equipment Technology CO.,Ltd.上海市漕河泾高新技术开发区 宜山路 705 号科技大厦 ...查看


  • 青岛版初中信息技术九年级上册教案
  • 第1单元 感测技术 单元教学目标 知识目标 1.了解感测技术的概念: 2.了解感测技术的地位和作用: 3.掌握传感器的基本原理: 4.了解感测技术在机器人方面的应用: 5.了解感测技术在现实生活中的应用. 技能目标 1.能够识别身边的感测技 ...查看


  • AUTOMAN-1智能机器人应用介绍(3)
  • AUTOMAN-1智能机器人应用介绍(3) 本章介绍一种机器人灭火实例. 一.场地布置(见图1). (图1) 图1中赛道用普通黑色电工胶布粘贴而成,其尺寸按需要自行确定.地面用白色.A.B.C障碍物用黑色,其二分之一长度应大于机器人自身长度 ...查看


  • 省创新项目结题
  • 项目编号 __07423___ 福建省大学生创新性实验计划 项目结题表 项 目 名 称: 项 目 负 责 人: 所在学院.年级: 联 系 电 话: 电 子 邮 件: 指 导 教 师: 项 目 起 止 时 间: 填 表 日 期: 基于 MCU ...查看


  • 消防机器人设计报告
  • 基于ATmega2560单片机的智能避障灭火小车 一. 设计方案: 1.控制系统: Arduino Mega2560是采用USB接口的核心电路板,具有54路数字输入输出,适合需要大量IO接口的设计.处理器核心是ATmega2560, 同时具 ...查看


  • 康威电缆隧道智能巡检机器人系统介绍
  • 康威电缆隧道智能巡检机器人系统 系统组成结构 统可实现不间断地对电缆通道(综合管廊)进行反复巡检,并实现对电缆通道(综合管廊)状态的连续.动态采集,补充了固定式.离散式在线监测系统不能实现对隧道内情况的完全覆盖,当发生紧急情况时无法将现场情 ...查看


  • 信息的智能化加工案例
  • 信息的智能化加工 一.教学内容分析 信息的智能化加工作为信息加工的一种类型,是本章内容重要组成部分.信息的智能化主要特点是让计算机更加自主地加工,减少人的参与,进一步提高信息加工的效率和人性化程度. 本节内容对应课程内容标准:通过部分智能信 ...查看


  • 测控技术与系统课程设计论文
  • 目 录 摘要.................................................................................................................. ...查看


  • 江苏省青少年科技创新大赛实施办法
  • 附件4 江苏省青少年科技创新大赛 实施办法 江苏省青少年科技创新大赛由省科协.省教育厅.省知识产权局.省青少年科技基金会主办. 这项活动每年进行一次全省性比赛,江苏省青少年科技创新大赛组织委员会由主办单位组成,负责大赛的领导工作,组委会下设 ...查看


热门内容