導航:首頁 > 操作系統 > 單片機感測器編程

單片機感測器編程

發布時間:2024-07-26 15:53:29

Ⅰ 求51單片機控制 傾角感測器SCA60的匯編語言,用來做蹺蹺板小車的。相近能提供參考也行!!

附件一:
總程序源程序

;**************說明***************************************************
;** P1.1為左邊感測器輸入; P1.0為右邊感測器輸入 **
;** P1.6檢測車身前傾; P1.7檢測車身後傾 **
;** 秒錶埠定義: **
;** A(P2.1):啟動/停止計時; B(P2.3):各段記錄時間回放; **
;** C(P2.3):分段計時標志/清零(停止狀態下) **
;*********************************************************************

ORG 0000H
;************主程序***************************************************
JBGN:
LCALL TC ;停車
LCALL CSZT ;設置初始狀態
;*************車身平衡檢查******************
CGQ:
LCALL QJ ;前進3S,第一次不檢查A端黑線
LCALL QL ;秒錶置零
LCALL QDJS ;啟動秒錶
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL TC ;停車
LCALL DELAY30 ;消除擺動
JXPD:JNB P1.6,MBXS ;如果前傾(到達C點附近),轉秒錶顯示AC段行車時間
LCALL QJ ;前進
LCALL DELAY
LCALL TC
LCALL DELAY30 ;消除擺動
LJMP JXPD ;繼續判斷是否到達C點附近
MBXS:
LCALL QDJS
LCALL CDSL5 ;停車5S,讀取AC段行車時間
LCALL QL ;秒錶清零
LCALL QDJS ;啟動計時,記錄平衡調整時間
CGQJC:
JNB P1.6,JBZHT ;如果前傾,轉慢速後退
JNB P1.7, JBWW ;如果後仰,轉慢速前進
LCALL DELAY1S ;延時判斷是否真正平衡
LCALL DELAY1S
LCALL DELAY1S
JNB P1.6,CGQJC ;如果前傾,轉繼續調整平衡
JNB P1.7,CGQJC ;如果後仰,轉繼續調整平衡
LCALL TC ;停車
LCALL QDJS ;停止計時,顯示平衡調整所用時間
CLR P2.5 ;蜂鳴器鳴叫
CLR P2.4 ;七彩燈亮
LCALL CDSL5 ;轉到車燈閃亮5次,表示5S時間
LCALL CSZT
LJMP CDB ;轉C到B程序前進
;***********轉長跳***********
JBZHT:
LJMP JBTPH
JBWW:
LJMP JBWWW
;***********調整平衡*********
JBTPH:
LCALL DELAY30 ;消除感測器擺動
JBTP: LCALL HT
lcall delay
LCALL TC
LCALL DELAYTC ;消除感測器擺動
JNB P1.6,JBTP
LJMP CGQJC
JBWWW:
LCALL DELAY30
JBWG:LCALL QJ
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除感測器擺動
JNB P1.7,JBWG
LJMP CGQJC
;*********從C點到B端程序**********
CDB:
LCALL QL ;秒錶置零
LCALL QDJS
LCALL QJ
DT: JB P1.0, DT ;如果右邊遇到黑線,則檢查左邊(順序執行),否則繼續檢查左邊
JB P1.1, DT
LCALL TC
LCALL QDJS ;停止計時,顯示從C到B的時間
LCALL CDSL5 ;延時5S
LCALL HT ;停車5S時間到,轉後退返回
LCALL QL
LCALL QDJS
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
DDTT:JB P1.0, DDTT ;如果右邊遇到黑線,則檢查左邊(順序執行),否則繼續檢查左邊
JB P1.1, DDTT
; INC A
; CJNE A,#2H,DDTT ;從B端返回A端時,不用檢測B端黑線
LCALL TC ;已經返回A端,停車
LCALL QDJS ;停止計時,顯示從B返回A所用時間
;************************基本功能與發揮部分的程序介面*************************************
LCALL CDSL5 ;延時5S,等待進入發揮部分程序
LCALL CSZT
CLR P2.4 ;狀態燈亮5S
LCALL DELAY1S
LCALL DELAY1S
CLR P2.5 ;蜂鳴器叫3S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL CSZT ;關狀態燈,進入發揮部分程序
;**********************發揮部分主程序*********************************************
FHBF:
LCALL QJ
QJXHX:
JNB P1.1,JX1 ;若P1.1為0(黑線),則繼續查詢P1.0 (左邊遇到黑線,則檢查右邊的狀態)
JNB P1.0,JX2 ;若P1.0為0(黑線),則繼續查詢P1.1 (右邊遇到黑線,則檢查左邊的狀態)
LJMP QJXHX
JX1:
JNB P1.0,PHCL
LJMP CZZW ;若P1.0也為黑線,則平衡處理,否則左轉彎
JX2:
JNB P1.1,PHCL
LJMP CYZW
CZZW:
LCALL ZZW
LCALL ZWSJ ;轉彎時間
LCALL TC
LCALL DELAY30
LCALL QJ
LJMP QJXHX
CYZW:
LCALL YZW
LCALL ZWSJ ;轉彎時間
LCALL TC
LCALL DELAY30
LCALL QJ
LJMP QJXHX
;*****************平衡調整*******************
PHCL:
LCALL QJ ;前進3S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL TC
LCALL DELAY30 ;消除感測器擺動
FHPHTZ:
JNB P1.6,FHZHT ;如果前傾,轉慢速後退
JNB P1.7,FHZQJ ;如果後仰,轉慢速前進
LCALL DELAY1S ;延時判斷是否真正平衡
LCALL DELAY1S
LCALL DELAY1S
JNB P1.6,FHPHTZ ;如果前傾,轉繼續調整平衡
JNB P1.7,FHPHTZ ;如果後仰,轉繼續調整平衡
LCALL TC ;停車
LCALL QDJS ;停止計時,顯示平衡調整所用時間
CLR P2.5 ;蜂鳴器鳴叫
CLR P2.4 ;七彩燈亮
LCALL CDSL5 ;轉到車燈閃亮5次,表示5S時間
LJMP FHPHTZ ;轉平衡調整
;***********轉長跳***********
FHZQJ:
LCALL CSZT ;初始狀態關報警
LJMP FHWWW
FHZHT:
LCALL CSZT ;初始狀態關報警
LJMP FHTPH
;***********調整平衡*********
FHTPH:
LCALL DELAY30 ;消除感測器擺動
TP: LCALL HT
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除感測器擺動
JNB P1.6,TP
LJMP FHPHTZ
FHWWW:
LCALL DELAY30 ;消除感測器擺動
DH: LCALL QJ
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除感測器擺動
JNB P1.7,DH
LJMP FHPHTZ

;******************子程序****************************************************
;*******設置初始狀態*************
CSZT:
SETB P2.6 ;關燈
SETB P2.7
SETB P2.4
SETB P2.5 ;關蜂鳴器
RET

;***********停轉*******************
TC:
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
RET

;***********前進********************
QJ:
CLR P1.2
SETB P1.3
CLR P1.4
SETB P1.5
RET

;**********後退********************
HT:
SETB P1.2
CLR P1.3
SETB P1.4
CLR P1.5
RET

;*********左轉彎******************
ZZW:
CLR P1.2
CLR P1.3
CLR P1.4
SETB P1.5
RET
;*********右轉彎******************
YZW:
CLR P1.2
SETB P1.3
CLR P1.4
CLR P1.5
RET

;**********秒錶控制************************
;*******啟動/停止計時**********
QDJS:
CLR P2.1
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
SETB P2.1
RET

;************顯示清零*************
QL:
CLR P2.3
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
SETB P2.3
RET

;************延時程序*********************
;*****延時1秒****
DELAY1S:
MOV R3,#02H
DEL1: MOV R2,#0FAH
DEL2: MOV R1,#0FAH
DEL3: DJNZ R1,DEL3
NOP
DJNZ R2,DEL2
DJNZ R3,DEL1
RET

;*****延時10毫秒*****
DELAY10:
MOV R2,#20
DB1:MOV R1,#248
DB2:DJNZ R1,DB2
DJNZ R2,DB1
RET

;*********前進或後退時間**********
DELAY:
MOV R2,#30
DD1:MOV R1,#200
DD2:DJNZ R1,DD2
DJNZ R2,DD1
RET

;***********停車時間****************
DELAYTC:
MOV R2,#100
D11:MOV R1,#200
D22:DJNZ R1,D22
DJNZ R2,D11
RET

;*********延時程序****************
;*********延時0.5秒****
DELAY30:
MOV R2,#250
DL2: MOV R1,#250
DL1: DJNZ R1,DL1
DJNZ R2,DL2
RET

;*********轉彎時間32MS**********
ZWSJ:
MOV R2,#50
D1:MOV R1,#100
D2:DJNZ R1,D2
DJNZ R2,D1
RET

;****延時約250毫秒(12M晶振)****
DELAY250:
MOV R3,#2
L3: MOV R2,#250
L1: MOV R1,#250
L2: DJNZ R1,L2
DJNZ R2,L1
DJNZ R3,L3
RET

;*****用狀態燈顯示終點停車5S時間(亮5次)*****
CDSL5:
MOV R5,#5H
PY: SETB P2.6
SETB P2.7
LCALL DELAY250
LCALL DELAY250
CLR P2.6
CLR P2.7
LCALL DELAY250
LCALL DELAY250
DJNZ R5,PY
RET
END

Ⅱ 求單片機程序關於溫濕度。感測器採用DHT11,按鍵四個可以設置溫濕度的上下限,顯示用lcd1602,超限報警

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定義數組
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//溫濕度感測器DHT11數據接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}

void sendwd()
{
//send wen
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}

void sendsd()
{
//send shi
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延時
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/

/*********************************************************************************/
// 毫秒級延時子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/

/*********************************************************************************/
//5us級延時程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/

/********************************************************************************/
// 測試LCD忙碌狀態
//lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/

/*******************************************************************************/
// 寫入指令數據到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/

/*****************************************************************************/
//寫顯示數據到LCD
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/

/****************************************************************************/
//LCD初始化設定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //顯示開,關游標
delay_ms(5);
lcd_wcmd(0x06); //移動游標
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的顯示內容,如果屏幕過暗,可將這倆句刪除
//delay_ms(5);
}
/****************************************************************************/

/****************************************************************************/
//設定LCD顯示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //數據指針=80+地址變數
}
/****************************************************************************/

/****************************************************************************/
//收發信號檢測,數據讀取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/

/****************************************************************************/
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗 8位 == CK_data
//調用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主機拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA匯流排由上拉電阻拉高 主機延時20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主機設為輸入 判斷從機響應信號
TRH=1;
//判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!TRH)
{
respond=2;
//判斷DHT11發出 80us 的低電平響應信號是否結束
while((!TRH)&& respond++);
respond=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while(TRH && respond++);
//數據接收狀態
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//數據校驗
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//濕度整數部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小數點
//濕度小數部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//溫度整數部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小數點
//溫度小數部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天適宜溫濕度 夏天適宜溫濕度
//濕度:30%--80% 30%--60%
//溫度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//報警函數
{
if(RH_data>=80) //濕度上限80%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(RH_data<=30) //濕度下限30%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data>=25) //溫度上限25℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data<=18) //溫度下限18℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else
{
buz=1;
}
}

/****************************************************************************/
//主函數
//TH,TL,RH,RL分別代表溫濕度的整數和小數部分
/****************************************************************************/
void main()
{

lcd_init();
initcom();
delay_us();

while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//寫字元
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //顯示字元
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //顯示字元
lcd_wdata(dis2[i]);
}
//寫濕度數據
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//寫溫度數據
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延時
delay_ms(500);
baoj();//報警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}

Ⅲ 51單片機溫度感測器ds18b20、lcd1602液晶C程序

/*
必要操作:連接感測器DS18B20到U6
*/
#pragma db code
#include<AT89X52.H>
#include "INTRINS.H"
#define BUSY1 (DQ1==0) //定義busy信號
sbit LED_0=P1^0; //定義數碼管控制腳為P1口的0-3腳
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;
sbit DQ1=P3^5; //定義18B20單匯流排引腳

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//聲明顯示函數
void ds_reset_1(void); //聲明18B20復位函數
void wr_ds18_1(char dat); //聲明18B20寫入函數
void time_delay(unsigned char time);//聲明延時函數
int get_temp_1(void); //聲明18B20讀入溫度函數
void delay(unsigned int x); //聲明延時函數
void read_ROM(void); //聲明18B20讀ROM函數
int get_temp_d(void); //聲明獲取溫度函數
void ds_init(void); //聲明18B20初始化函數
void ds_getT(void); //聲明18B20獲得溫度顯示值函數
/*定義數碼管段碼=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共陽極數碼管的段碼0 1 2 3 4 5 6 7 8 9 A B C D E F
/****************以下定義各種變數********************/
unsigned char ResultSignal;
int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH;
unsigned char ROM[8];
unsigned char idata TMP;
unsigned char idata TMP_d;
unsigned char f;
unsigned char rd_ds18_1();
unsigned int TemH,TemL; //溫度的整數部分和小數部分
unsigned int count; //定義小數計算部分
void main()
{

ds_init(); //18B20初始化
while(1)
{
ds_getT(); //使用該函數獲得溫度,整數部分存儲到TemH,小數部分存儲到count的低8位
display((TemH/10)%10,TemH%10,((count/10)%10),(count%10));
//溫度發送到數碼管顯示
}
}
/***************18B20初始化函數***********************/
void ds_init(void)
{
unsigned int k=0;
ds_reset_1();
ds_reset_1(); //reset
wr_ds18_1(0xcc); //skip rom
_nop_();
wr_ds18_1(0x7f);
ds_reset_1();
wr_ds18_1(0xcc);
_nop_();
wr_ds18_1(0x44);
for(k=0;k<11000;k++)
time_delay(255);
ds_reset_1();
}
void ds_getT(void)
{
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);
TemH=get_temp_1();
TemL=get_temp_d();
TemH&=0x00ff;
TemL&=0x00ff;
count=(TemH*256+TemL)*6.25;
}
/***************延時程序,單位us,大於10us*************/
void time_delay(unsigned char time)
{

time=time-10;
time=time/6;
while(time!=0)time--;
}

/*****************************************************/
/* reset ds18b20 */
/*****************************************************/
void ds_reset_1(void)
{
unsigned char idata count=0;
DQ1=0;
time_delay(240);
time_delay(240);
DQ1=1;
return;
}

void check_pre_1(void)
{
while(DQ1);
while(~DQ1);

time_delay(30);
}

void read_ROM(void)
{
int n;
ds_reset_1();
check_pre_1();
wr_ds18_1(0x33);
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
}

/*****************************************************/
/* Read a bit from 1820 位讀取 */
/*****************************************************/
bit tmrbit_1(void)
{
idata char i=0;
bit dat;

DQ1=0;_nop_();

DQ1=1;

_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

dat = DQ1;

time_delay(50);

return dat;
}

/*****************************************************/
/* read a bety from ds18b20 位元組讀取 */
/*****************************************************/
unsigned char rd_ds18_1()
{
unsigned char idata i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit_1();
dat=(j<<(i-1))|dat;
}
return dat;
}

/*****************************************************/
/* write a bety from ds18b20 寫位元組 */
/****************************************************/
void wr_ds18_1(char dat)
{
signed char idata i=0;
unsigned char idata j;
bit testb;

for(j=1;j<=8;j++)
{
testb=dat & 0x01;
dat = dat>>1;
if(testb)
{
DQ1=0;
_nop_();
_nop_();
DQ1=1;
time_delay(60);
}

else
{
DQ1=0;
time_delay(50);

DQ1=1;
_nop_();
_nop_();
}
}
}

int get_temp_1(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i;
EA=0;

ds_reset_1();
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b為1則為負溫 */
i=(i>>4);
if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
if (a>8)
{
TMP=(TMP+1);
}
}
else
{
f=1;
a=a>>4;
b=b<<4;

TMP=(a|b);

TMP=~TMP;
TMP=(TMP+1);
}
EA=1;
return(TMP);
}

int get_temp_d(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i,m;
EA=0;

ds_reset_1();//復位
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b為1則為負溫 */
i=(i>>4);

if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
TMP_d=a;
}
else
{
f=1;
a=~a;
a=(a+1);
b=~b;
b=(b+1);

m=a;
a=a>>4;
b=b<<4;

TMP=(a|b);
m=(m&0x0f);
TMP_d=m;
}

EA=1;
return(TMP_d);
}void delay(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++);
}
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
P0=a[d1];
LED_0=0;
delay(100);
LED_0=1;

P0=a[d2] & 0x7f;
LED_1=0;
delay(100);
LED_1=1;

P0=a[d3];
LED_2=0;
delay(100);
LED_2=1;

P0=a[d4];
LED_3=0;
delay(100);
LED_3=1;
}

Ⅳ 就機電大神指導單片機 如果用一個感測器當一個控制電路的開關,怎麼給單片機編程,這個電路如何設計

其實這個電路應該很簡單,無非就是一個輸入 控制一個輸出的問題,中間由單片機進行判斷和控制輸出動作。
首先前面的感測器信號,可能是微弱的變化信號,這個不管了,如廳燃果信號微弱可以通過放大電路整形後最終是一個開關信號,即你說的肌肉收縮到一定程度這個開信號,這個信號直接需要控制電壓大小,滿足單片機大含識別即可,如:肌肉伸開時電壓低於1V,收縮時高於3V但小於5V(一般情況,還要根據單片機類型,比如工作電壓時3.3V的要另外討論了。) 單片機識別到這個變化信扮仿虛號(0V-->3V,或者3V-->0v )輸出一路信號,這個信號算個執行或者說是反饋信號吧。比如肌肉收縮單片機控制燈亮,肌肉伸開燈滅。
如 51單片機 匯編指令
org 00h
sjmp 30H

ORG 30H
mov r1=#200
wait: setB p1.0 『 假如這個信號接在P1.0上
jnb p1.0,wait '一直等待信號變高
djnz r1,wait '防抖動,去干擾 延時檢測
setb p3.0 '讓單片機的這個埠置高 控制別的東西,或者起到指示反饋的作用
。。。。。後面要根據你要實現的功能來編程。

閱讀全文

與單片機感測器編程相關的資料

熱點內容
胸椎壓縮性骨折傷殘 瀏覽:952
mt怎麼解壓文件 瀏覽:39
達芬奇項目伺服器有什麼用 瀏覽:852
自製怎麼捏都可以復原的解壓球 瀏覽:613
qq軟體管理怎麼加密 瀏覽:738
手機使用代碼編程器 瀏覽:937
單片機四位99秒錶製作流程圖 瀏覽:615
壓縮包軟體如何安裝 瀏覽:765
我的世界伺服器1122地址 瀏覽:3
蘋果如何與安卓系統連接伺服器 瀏覽:932
農業銀行app學生繳費怎麼切換 瀏覽:468
福建在哪個app上有安康碼 瀏覽:545
用友商貿寶t1登錄找不到加密狗 瀏覽:555
區間測速演算法不正確 瀏覽:331
appstore轉到哪個國家比較好 瀏覽:924
程序員為什麼被公司埋炸彈 瀏覽:941
linuxds18b20驅動 瀏覽:137
集群大數據編譯命令 瀏覽:536
什麼狼人殺app好 瀏覽:303
hadoop壓縮命令 瀏覽:655