|
下面程序是别人写的,我想在此基础上实现的是,
如按此顺序: 当电压约 1V 以下时, UP LED 亮; 电压约 4V以上时, DN LED 亮, UP LED 灭; 电压再回到约 1V 以下时,
UP LED / DN LED 灭, OK LED亮
如按此顺序: 当 电压约 3V以上时, DN LED 亮; 当电压约 1V 以下时, UP LED 亮, DN LED 灭; 电压约 4V以上时, DN LED 亮, UP LED 灭;
电压再回到约 1V 以下时, UP LED / DN LED 灭, OK LED亮
按以上我在程序上加了这个,
void motor()
{
uchar a;
a = TQADC();
if (a <= 50)
{
Delay(10);
if (a <= 50)
{
dn = 1;
up = 0;
while (a < 200)
TQADC();
up = 1;
dn = 0;
while (a > 50)
TQADC();
dn = 1;
ok = 0;
}
}
}
目前 UP LED 亮后,再电压怎么变化也不动作了。 我把程序和仿真传上来,大侠们帮看看,谢谢
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
//引脚定义
sbit du = P2^6;
sbit we = P2^7;
sbit up = P2^0;
sbit dn = P2^1;
sbit ok = P2^2;
sbit ng = P2^3;
sbit CS_0804 = P3^5;
sbit WR_0804 = P3^6;
sbit INT_0804 = P3^0;
sbit RD_0804 = P3^7;
#define ADC_Data P1 //AD 数据端口
#define SMG_DData P0 //数码管段码端口
#define SMG_WData P0 //数码管位码端口
unsigned char code SMG_Dcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //段码表 共阴
unsigned char code SMG_Wcode[]={0xfe,0xfd,0xfb,0xf7}; //位码表 共阴
void Delay(uint x) // 1ms @12Mhz
{
uchar a,b,c;
for(c=x;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
uchar TQADC()
{
uchar DiaoYa = 0;
WR_0804 = 1;//先使其为高电平
CS_0804 = 0;//芯片选通使能
WR_0804 = 0;
WR_0804 = 1;//相当于给了一个低电平脉冲启动转换
nop();nop();nop();nop();
while(INT_0804 == 1);//等待转换结束
RD_0804 = 0;//读数据
INT_0804 = 1;
DiaoYa = ADC_Data;//返回电压寄存器中的值(注意,此时未转换成具体电压)
RD_0804 = 1;
return DiaoYa;//返回电压寄存器中的值
}
void DYXS(uchar V_0804)
{
double Voltage = (double)V_0804;
uchar Ge = 0;//用于存取个位数值
uchar Xiao1 = 0;//用于存取小数点后第一位数值
uchar Xiao2 = 0;//用于存取小数点后第二位数值
uchar Xiao3 = 0;//用于存取小数点后第三位数值
Voltage = (5*(Voltage/255))*1000;//电压值已经转换并且*1000用于提取小数点后三位
//提取每一位的数值
Ge = ((uint)Voltage)/1000%10;
Xiao1 = ((uint)Voltage)/100%10;
Xiao2 = ((uint)Voltage)/10%10;
Xiao3 = ((uint)Voltage)%10;
//显示
we=1;
SMG_WData = 0xff;//消隐
we=0;
du=1;
SMG_DData = SMG_Dcode[Ge] | 0x80;
du=0;
we=1;
SMG_WData = SMG_Wcode[0];
we=0;
Delay(11);
we=1;
SMG_WData = 0xff;//消隐
we=0;
du=1;
SMG_DData = SMG_Dcode[Xiao1];
du=0;
we=1;
SMG_WData = SMG_Wcode[1];
we=0;
Delay(11);
we=1;
SMG_WData = 0xff;//消隐
we=0;
du=1;
SMG_DData = SMG_Dcode[Xiao2];
du=0;
we=1;
SMG_WData = SMG_Wcode[2];
we=0;
Delay(11);
we=1;
SMG_WData = 0xff;//消隐
we=0;
du=1;
SMG_DData = SMG_Dcode[Xiao3];
du=0;
we=1;
SMG_WData = SMG_Wcode[3];
we=0;
Delay(11);
we=1;
SMG_WData = 0xff;
we=0;
}
void motor()
{
uchar a;
a = TQADC();
if (a <= 50)
{
Delay(10);
if (a <= 50)
{
dn = 1;
up = 0;
while (a < 200)
TQADC();
up = 1;
dn = 0;
while (a > 50)
TQADC();
dn = 1;
ok = 0;
}
}
}
void main()
{
while(1)
{
DYXS(TQADC());
motor();
}
}
|
|