为什么生成的hex文件只能使电机转动?

2019-07-18 11:40发布

本帖最后由 我就要自己学 于 2015-12-8 21:29 编辑

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define unchar unsigned char
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit BEEP=P1^5;
sbit FM=P3^0;
sbit FMQ=P2^3;
#define Data P0  //数据端口
char data tadle[]="level:";
char data table[]="speed:";
/********************/
/*    函数声明      */
/********************/
/********************/
/*   微秒延时函数   */
/********************/
void DelayUs(unsigned char us)
{
unsigned char uscnt;
uscnt=us>>1;  //12MHz
while(-uscnt);
}
void warning()
{
BEEP=~BEEP;
}
/********************/
/*   毫秒函数声明   */
/********************/
void DelayMs(unsigned char ms)
{
while(--ms)
{
  DelayUs(250);
  DelayUs(250);
  DelayUs(250);
  DelayUs(250);
}
}
/********************/
/*  写入命令函数    */
void Writecommand(unsigned char c)
{
DelayMs(5);  //操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/********************/
/*   写入数据函数     */
/********************/
void WriteData(unsigned char c)
{
DelayMs(5);  //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*******************/
/*  初始化函数     */
/*******************/
void InitLcd()
{
DelayMs(15);
Writecommand(0x38);//display mode
Writecommand(0x38);//display mode
Writecommand(0x38);//displau mode
Writecommand(0x06);  //显示光标移动位置
Writecommand(0x0c);  //显示开及光标位置
Writecommand(0x01);  //显示清屏
}
sbit TRING=P2^0;   //输出触发控制10usTT1电平
sbit ECH0=P2^1;    //回响信号输出
uchar ;flag,flag1,i;


void cheak_distanceinit()  //HY-SRF05初始化
{
TMOD=0x11;
TH0=0;
TL0=0;
TH1=(65536-15)/256;
TL1=(65536-15)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
flag=0;
ECH0=0;
TRING=0;
}
void start()      //HY-SRF05测距开始触发
{
TH1=(65536-15)/15;
TL1=(65536-15)%256;
TR1=1;
TRING=1;
while(flag==1);
TR1=0;
TRING=0;
flag=0;
flag1=0;
}
unit;cheak_recievetime()  //接收回响信号
{
TH0=0;
TL0=0;
while(flag1==0);
{
  TR0=1;
  while(ECH0==1)flag=1;
  ECH0=0;
  TR0=0;
}
return TH0*256+TL0;
}
float count_distance(uint x)
{
float date;
date=(float)x*340/2/10000;
return date;
}
/********************/
/*    主函数        */
/********************/
main()
{
float dis_date=0;
uint time,date1=0,date2=0,baifen,shifen,ge,i,teep;
InitLcd();
cheak_distanceinit();
Writecommand(0x80);
for(i=0;i<6;i++)
{
  WriteData(table);
  DelayMs(10);
}
Writecommand(0x80+0x40);
for(i=0;i<6;i++)
{
  WriteData(table);
  DelayMs(10);
}
while(1)
{
  start();
  time=cheak_recievetime();
  dis_date=count_distance(time);
  date1=dis_date;
  teep=dis_date;
   if(teep>500)
    warning();
   else
    BEEP=1;
   ge=date1/100;
   shifen=date1/10%10;
   baifen=date1%10;
   Writecommand(0x80+0x07);
   WriteData(ge+0x30);
   DelayMs(10);
   WriteData('.');
   WriteData(shifen+0x30);
   DelayMs(10);
   WriteData(baifen+0x30);
   DelayMs(10);
}
}
void start_timer0() interrupt 1
{
TH1=(65536-12)/256;
TL1=(65536-12)%256;
flag=1;
}
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit EOC=P2^0;  //ADC0808控制引脚设定
sbit OE=P2^1;
sbit START=P2^2;
sbit CLK=P2^3;
sbit DP=P1^7;


sbit beep=P2^4;  //蜂鸣器报警引脚
sbit red=P2^5;    //点滴流速上限红 {MOD}灯报警引脚
sbit yellow=P2^6; //点滴流速下限黄 {MOD}灯报警引脚
sbit moto=P2^7;   //电机控制引脚
sbit xuan1=P3^5;  //点滴流速上限140滴/分钟 下限10滴/分钟
sbit xuan2=P3^6;  //点滴流速上限130滴/分钟 下限20滴/分钟
sbit xuan3=P3^7;  //点滴流速上限120滴/分钟 下限30滴/分钟
Uint;DATA;
uchar code_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管编码
uchar adc_data[]={0,0,0,0}; //存放4位电压值
/********************
函数名称:init()
功能:系统初始化 定时器中断设置
参数:无
返回值:无
********************/
void init()
{
TMOD=1;
TH0=0xff;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
}
/********************
函数名称tim0() interrupt 1
功能:定时器中断为ADC0808提供转换需要的时钟信号
参数:无
返回值:无
********************/
void tim0() interrupt 1
{
TH0=0xff;
TL0=0x38;
CLK=!CLK;
}
/*******************
函数名称:delay()
功能:延时函数 大约0.1ms
参数:无
返回值:无
******************/
void delay(uint i)
{
uchar j;
for(;i>0;i--);
for(j=200;j>0;j--);
}
/******************
函数名称:display()
功能:数码管显示函数 将电压值显示出来
参数:无
返回值:无
******************/
void display()
{
uchar s,f=0xf7;
adc_data[0]=DATA/1000;
adc_data[1]=DATA%1000/100;
adc_data[2]=DATA%1000%100/10;
adc_data[3]=0;
for(s=0;s<4;s++)
{
  P1=table[adc_data];
  P3=f;
  if(s==2)
   DP=1;
  delay(10);
  P1=0;
  f=_cror_(f,1);
}
}
/*****************
函数名称:upper_limit(uchar i)
功能:水位上限报警 子程序
返回值:无
******************/
void upper_limit(uchar i)
{
for(;i>0;i--);
{
  red=1;  //红灯开
  beep=1; //蜂鸣器开
  yellow=0;//黄灯关
  moto=1; //电机关
  delay(1);
  red=0;   //红灯关
  beep=0;
  yellow=0;
  moto=1;
  delay(1);
}
}
/*****************
函数名称:lower_limit(uchar i)
功能:水位下限报警 子程序
参数:i用来表示 闪烁数字
返回值:无
******************/
void lower_limit(uchar i)
{
for(;i>0;i--)
{
  red=0;  //红灯关
  beep=1; //蜂鸣器开
  yellow=1;//黄灯开
  moto=0; //电机开
  delay(1);
  red=0;
  beep=0;
  yellow=0; //黄灯关
  moto=0;
  delay(1);
}
}
/*****************
函数名称:main()
功能:
参数:
返回值:无
******************/
void mai()
{
uchar s,i;
red=0;  //初始化为 红灯关 黄灯关 蜂鸣器关 电机关
yellow=0;
beep=0;
moto=1;
xuan1=1;
xuan2=1;
xuan3=1;
init();   //定时器初始化
while(1)
{
  for(i=2;i>0;i--);
  {
   START=1;  //开始电压转换
   OE=0;
   START=0;
   while(EOC==0);
   OE=1;
   s=P0;  //16进制数据 读取ADC0808压力传感器电压值
   DATA=s*1.0/255*1500; //将电压值转化为点滴流速的数据
  }
  display();  //点滴流速显示
  if(xuan1==0)  //点滴流速上限140滴/分钟 下限10滴/分钟
  {
   if(DATA<200)
   {
    lower_limit(100);
   }
   if(DATA>1400)
   {
    upper_limit(100);
   }
  }
  if(xuan2==0)  //点滴流速上限130滴/分钟 下限20滴/分钟
  {
   if(DATA<200)
   {
    lower_limit(100);
   }
   if(DATA>1300)
   {
    upper_limit(100);
   }
  }
  if(xuan3==0)   //点滴流速上限120滴/分钟 下限30滴/分钟
  {
   if(DATA<300)
   {
    lower_limit(100);
   }
   if(DATA>1200)
   {
    upper_limit(100);
   }
  }

}
}

)生成hex文件0error,2warning,怎么修改?为什么用hex文件仿真只能使电机转动?

QQ截图20151204095156.png
QQ截图20151204095328.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
我就要自己学
2019-07-19 01:16
我就要自己学 发表于 2015-12-7 18:33
嗯,的确有点长。我想问一下为什么程序也没有错误,可是电机能转,led却不亮呢?是这个仿真不能实现吗?

您给我发的那个文件,我的proteus版本太低了,打不开啊.

一周热门 更多>