本帖最后由 我就要自己学 于 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文件仿真只能使电机转动?
-
-
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
嗯,的确有点长。我想问一下为什么程序也没有错误,可是电机能转,led却不亮呢?是这个仿真不能实现吗?
您给我发的那个文件,我的proteus版本太低了,打不开啊.
光偶需要看看电压,
数码管,肯定不亮,在while下面了。
一周热门 更多>