设为首页
收藏本站
开启辅助访问
登录
注册
只需一步,快速开始
首页
BBS
在线充值
搜索
工控币获得方法
联系方式
搜索
搜索
本版
帖子
用户
工控论坛
»
首页
›
电子技术
›
EDA设计仿真
›
51单片机Proteus仿真自动浇花器+源程序
返回列表
发新帖
51单片机Proteus仿真自动浇花器+源程序
[复制链接]
0
|
0
|
2020-1-22 23:28:42
|
显示全部楼层
|
阅读模式
基于51单片机自动浇花器.zip
(1.97 MB, 售价: 1 工控币)
2020-1-22 23:23 上传
点击文件名下载附件
单片机源程序如下:
//程序头函数
#include <reg52.h>
#include <intrins.h> //包含头文件
//显示函数
#include <display.h>
#include "eeprom52.h"
//宏定义
#define uint unsigned int
#define uchar unsigned char
//管脚声明
sbit LED_R= P2^2; //红色指示灯
sbit LED_G= P2^0; //绿色指示灯
sbit FENG = P2^5; //蜂鸣器
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3; //ADC0832引脚
sbit san=P3^4; //继电器
//按键
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
/*******************************定义全局变量********************************/
unsigned char dat = 0; //AD值
unsigned char CH=0; //通道变量
unsigned int sum=0; //平均值计算时的总数
unsigned char m=0;
bit bdata flag; //定义位变量
uchar set; //设置变量
uchar moisture;
uchar full_range=153;
//函数声明
extern void Key();
/*
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
*/
//酒精含量变量
uint temp=0;
//指示灯变量
char MH=80,ML=20; //上下限变量
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, MH);
byte_write(0x2001, ML);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
MH = byte_read(0x2000);
ML = byte_read(0x2001);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
MH = 80;
ML = 20;
a_a = 1;
write_eeprom(); //保存数据
}
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void init() //定时器初始化函数
{
TMOD=0x01; //定时器工作方式
TL0=0xb0;
TH0=0x3c; //赋初值50ms
EA=1; //打开中断总开关
ET0=1; //打开定时器0中断允许开关
TR0=1; //打开定时器0定时开关
}
void main() //主函数
{
Init1602(); //初始化液晶函数
init(); //初始化定时器
init_eeprom(); //开始初始化保存的数据
while(1) //进入循环
{
for(m=0;m<50;m++) //读50次AD值
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
temp=sum/50; //跳出上面的for循环后,将累加的总数除以50得到平均值temp
sum=0; //平均值计算完成后,将总数清零
if(temp<=full_range)
temp=(temp*100)/full_range;
else
temp=100;
if(set==0) //set为0,说明现在不是设置状态
Display_1602(temp,MH,ML); //显示AD数值和报警值
if(temp<ML&&set==0) //AD数值小于报警值
{
flag=1; //打开报警
san=0;
LED_G=1; //绿灯熄灭
LED_R=0; //红灯点亮
}
else if(temp>MH&&set==0)//AD值大于报警值
{
flag=0; //关闭报警
san=1;
LED_G=0; //绿灯点亮
LED_R=1; //红灯熄灭
}
else
{
flag=0;
LED_G=0; //绿灯点亮
LED_R=1; //红灯熄灭
}
Key(); //调用按键函数
}
}
void Key() //按键函数
{
if(Key1==0) //设置键按下
{
while(Key1==0); //按键松开
FENG=0; //蜂鸣器响
set++; //设置变量加
flag=0; //关闭报警
TR0=0; //关闭定时器
}
if(set==1) //设置报警值时
{
write_com(0x80+0x40+4);//位置
write_com(0x0f);//打开显示 无光标 光标闪烁
FENG=1; //关闭蜂鸣器
}
if(set==2) //设置报警值时
{
write_com(0x80+0x40+14);//位置
write_com(0x0f);//打开显示 无光标 光标闪烁
FENG=1; //关闭蜂鸣器
}
else if(set>=3) //设置完成时
{
set=0; //变量清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
FENG=1; //关闭蜂鸣器
flag=1; //打开报警
TR0=1; //打开定时器
}
if(Key2==0&&set!=0) //设置报警值时加键按下
{
while(Key2==0); //按键松开
FENG=0; //打开蜂鸣器
if(set==1)
{
MH++; //报警值加
if(MH>99) //最大加到255
MH=ML+1; //清零
write_com(0x80+0x40+3); //选中液晶屏上的第二行第十一列
write_data('0'+MH/10);
write_data('0'+MH%10);
write_com(0x80+0x40+4);//位置
FENG=1; //关闭蜂鸣器
}
if(set==2)
{
ML++; //报警值加
if(ML>=MH&&MH<99) //最大加到255
MH=ML+1;
if(ML>98)
ML=0;
write_com(0x80+0x40+3); //选中液晶屏上的第二行第十一列
write_data('0'+MH/10);
write_data('0'+MH%10);
write_com(0x80+0x40+13); //选中液晶屏上的第二行第十一列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+14);//位置
FENG=1; //关闭蜂鸣器
}
write_eeprom(); //保存数据
}
if(Key3==0&&set!=0) //注释同加按键
{
while(Key3==0);
FENG=0;
if(set==1)
{
MH--; //报警值加
if(MH<=ML&&ML>0) //最大加到255
ML=MH-1;
if(MH<1)
MH=99;
write_com(0x80+0x40+3); //选中液晶屏上的第二行第十一列
write_data('0'+MH/10);
write_data('0'+MH%10);
write_com(0x80+0x40+13); //选中液晶屏上的第二行第十一列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+4);//位置
FENG=1; //关闭蜂鸣器
}
if(set==2)
{
ML--; //报警值加
if(ML<0) //最大加到255
ML=MH-1; //清零
write_com(0x80+0x40+13); //选中液晶屏上的第二行第十一列
write_data('0'+ML/10);
write_data('0'+ML%10);
write_com(0x80+0x40+14);//位置
FENG=1; //关闭蜂鸣器
}
write_eeprom(); //保存数据
}
}
void time1_int(void) interrupt 1 //定时器工作函数
{
uchar count; //定义计时变量
TL0=0xb0;
TH0=0x3c; //重新赋初值50ms
count++; //变量加一次就是50ms
if(count==10) //加到10次就是500ms
{
if(flag==0) //flag=0时,也就是不开启报警
FENG=1; //关闭蜂鸣器
if(flag==1) //flag为1时,也就是打开报警
FENG=0; //打开蜂鸣器
}
if(count==20) //计数20次,就是1s
{ //在1s时,红绿灯都是熄灭状态,蜂鸣器也是关闭状态,装可以达到闪烁的目的
count=0; //变量清零
if(flag==0) //不是报警状态时
FENG=1;
if(flag==1) //报警状态时
FENG=1;
}
}
复制代码
浇花器
,
protues
,
51单片机
相关帖子
•
51单片机采集温度通过串口发送到labview上位机采集曲线显示
•
LabVIEW读取和显示温度曲线 51单片机做下位机
•
远程果蔬工厂监控系统设计 LabVIEW+51单片机程序
•
VB上位机设置时间 51单片机DS1302时钟的proteus仿真程序
•
C#上位机源程和51单片机实现控制电机加速减速正反转
•
8051单片机彻底研究 全套
•
51单片机原理及应用:基于KeilC与Proteus
•
51单片机pwm控制直流电机,内含程序源码及Proteus仿真电路图
•
用vb上位机控制51单片机测距的源码
•
51单片机ADC0832+DAC0808电压检测设计(含VB上位机)+源程序
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
山海致远
5963
主题
6929
帖子
102
积分
初级会员
初级会员, 积分 102, 距离下一级还需 398 积分
初级会员, 积分 102, 距离下一级还需 398 积分
工控币
102
加好友
发消息
回复楼主
返回列表
电子技术综合讨论
单片机嵌入式
EDA设计仿真
STM32/8
51单片机
上位机开发及系统管理
Labview
Multisim仿真
图文推荐
用Fanuc Karel语言实现三点建坐标系
2021-01-04
用CH341A做的USB转SPI_232_485_TTL转换器 PCB+SCH文件 烧写器源
2020-12-14
51单片机采集温度通过串口发送到labview上位机采集曲线显示
2020-12-13
基于组态王的占空比PID算法温度控制系统设计 含源码和文档
2020-12-13
基于LabVIEW的电动车速度监测和控制系统上位机程序设计
2020-12-08
热门排行
1
交通信号灯电子线路实验Multisim仿真电路图
2
Multisim14仿真PIC16f84单片机驱动led
3
基于labview的电子秤
4
哪位大佬能看看logix5571以太网通信故障这
5
WINCC 7.5+SP1+UPD3
6
基于LabVIEW的猜数字游戏
7
安装Com Profibus失败,有没有大神能帮忙看
8
山武温控器SDC35/36使用说明书 中文
9
TIA 博途 V16 专业版+ 模拟器 亲测可用
10
软件安装不成功