我做一个根据液体压力值进行电机相应的实验。
当压力小于8MPa时电机启动,启动3秒后压力没有上升就报警。
当压力大于12MPa时电机停止。
暂时用一个指示灯来模拟电机。用可调电阻模拟压力输入。
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit CLK=P1^3;
sbit ST=P1^2;
sbit EOC=P1^1;
sbit OE=P1^0;
sbit LED=P1^7; //指示灯
sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
sbit LED2=P2^7;
void DelayMS(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
/******************显示采集的电压**********************************/
void Display_Result(uint d)
{
L1=0;L2=1;L3=1;L4=1; //P2=0xf7; //1111 0111最右边的数码管显示
P0=DSY_CODE[d%10];
DelayMS(5);
L1=1;L2=0;L3=1;L4=1; //P2=0xfb; //左边第三个数码管 1111 1011
P0=DSY_CODE[d%100/10];
DelayMS(5);
L1=1;L2=1;L3=0;L4=1; //P2=0xfd; //左边第二个数码管 1111 1101
P0=DSY_CODE[d%1000/100]|0x80; //加小数点显示
DelayMS(5);
L1=1;L2=1;L3=1;L4=0; //P2=0xfe; //左边第一个数码管 1111 1110
P0=DSY_CODE[d/1000];
DelayMS(5);
/* if(d>=600 && d<=1000)
{ LED2=0;DelayMS(5);}
else
LED2=1;
*/
}
void main()
{
uint temp;
TMOD=0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
P1=0xbf; //通道选择 ABC=110表示选IN3为输入端 1011 1111 其中0对应的是C
while(1)
{
ST=0;ST=1;ST=0; //ADC启动
while(EOC==0); //空循环;转换结束信号,没结束时EOC一直为0,转换结束为高电平
OE=1; //输出使能
temp=P3*1.0/255*500; //ADC0808输出和输入之间的关系,P3是输出值,temp是输入值0-5V
temp=3.4*temp; //转换为压力显示,有可能是4位数
Display_Result(temp);
//如果压力小于8M,启动电机,启动后3秒,如果压力没有上升,就报警。如果压力大于12MPa,电机停止。
if(temp<=800)
{ LED=0;
//保存启动时的压力值
//保存启动时的时间
}
if(temp>=1200)
LED=1;
OE=0; //IF判断必须加在“使能”的中间,否则P3没有值了
}
}
void Timer0_INT() interrupt 1
{
CLK=~CLK;
}
现在的问题是:
1、指示灯接在P1.7可以正常实现效果。但是接在P2.7就不正常,只闪一下或者不停的闪烁。我想应该是在数码管位选时给的值导致的,如P2=0xfb 实际上把P1.7给置1(熄灭)了。
然后我把位选改成了只给定位选的4个端口,其它不赋值,但是P1.7还是不常亮,即使我在主程序开始给P2.7=0都不行,为什么?
2、启动3秒后,如果压力没有上升就报警。 怎么实现?是不是要用到定时器?(定时器我还不是很理解)
首先要保存电机启动时的压力和时间,然后计时3秒,再比较当前压力和保存的压力。但是这个计时不能再用delay来实现了吧,delay好像是整个进程都停止的吧?
如果P2剩下的端口我不能用,好像没有端口用来报警了?
|