Ⅰ 求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 '让单片机的这个端口置高 控制别的东西,或者起到指示反馈的作用
。。。。。后面要根据你要实现的功能来编程。