自己做自动喂鱼食和开灯 程序 想加入串口控制 请帮改下

moleboy moleboy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是程序 在别的基础上改的 ,初学单片机所以不懂请帮助
1。本机实现自动定时开灯喂食功能
现在我想通过串口来控制 例如 串口发送 0x20 BEEP=0 喂食 发送 0x21 停止喂食
发送0x30开灯 发送0x31关灯 我自己加入代码 发送没有反应
2.可以将温度数值 通过串口发送回PC
一下程序:
#include <REG51.H>
#include <intrins.h>
//#include "LCD1602.h"
//#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^7; //实时时钟复位线引脚
sbit wireless_1 = P3^0;
sbit wireless_2 = P3^1;
sbit wireless_3 = P3^2;
sbit wireless_4 = P3^3;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
sbit Set = P2^0; //模式切换键
sbit Up = P2^1; //加法按钮
sbit Down = P2^2; //减法按钮
sbit out = P2^4; //立刻跳出调整模式按钮
/////////////////////////////
sbit B1 = P2^3;
sbit B2 = P2^1;
sbit B3 = P2^2;
sbit B4 = P2^4;

sbit BEEP = P1^3;
sbit DENG = P1^4;
sbit BEIDENG=P3^6; //2^3
sbit DENGSHI=P3^7; //
void weishi(); //定时喂食 //
void kaideng(); //定时开灯 //
/////////////////////////////

sbit DQ = P3^7; //温度传送数据IO口
char done,count,temp,flag,up_flag,down_flag,TMP,TMP1,TMP2;
uchar temp_value; //温度值
uchar TempBuffer[5],week_value[2];







void show_time(); //液晶显示程序
/***********1602液晶显示部分子程序****************/


//Port Definitions**********************************************************
sbit LcdRs = P1^0;
sbit LcdRw = P1^1;
sbit LcdEn = P1^2;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();

LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}

//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}

//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}

//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}

//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}






/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
SYSTEMTIME CurrentTime;


#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C

void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}

unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}



void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}

void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
{
Time->DateString[0] = '2';
Time->DateString[1] = '0';
Time->DateString[2] = Time->Year/10 + '0';
Time->DateString[3] = Time->Year%10 + '0';
}
else
{
Time->DateString[0] = ' ';
Time->DateString[1] = ' ';
Time->DateString[2] = ' ';
Time->DateString[3] = ' ';
}
Time->DateString[4] = '-';
if(hide_month<2)
{
Time->DateString[5] = Time->Month/10 + '0';
Time->DateString[6] = Time->Month%10 + '0';
}
else
{
Time->DateString[5] = ' ';
Time->DateString[6] = ' ';
}
Time->DateString[7] = '-';
if(hide_day<2)
{
Time->DateString[8] = Time->Day/10 + '0';
Time->DateString[9] = Time->Day%10 + '0';
}
else
{
Time->DateString[8] = ' ';
Time->DateString[9] = ' ';
}
if(hide_week<2)
{
week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
}
else
{
week_value[0] = ' ';
}
week_value[1] = '\0';

Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}

void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{ if(hide_hour<2)
{
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
}
else
{
Time->TimeString[0] = ' ';
Time->TimeString[1] = ' ';
}
Time->TimeString[2] = ':';
if(hide_min<2)
{
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
}
else
{
Time->TimeString[3] = ' ';
Time->TimeString[4] = ' ';
}
Time->TimeString[5] = ':';
if(hide_sec<2)
{
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
}
else
{
Time->TimeString[6] = ' ';
Time->TimeString[7] = ' ';
}
Time->DateString[8] = '\0';
}


...全文

相关推荐

这批数据覆盖A股分钟线、ETF、可转债及指数四大类 分钟线以每分钟记录,字段含时间、开盘价、最高价、最低价、收盘价、成交量、成交额 ETF提供日频行情,包含代码、名称、日期、前收盘、开盘、最高、最低、

这批数据覆盖A股分钟线、ETF、可转债及指数四大类。分钟线以每分钟记录,字段含时间、开盘价、最高价、最低价、收盘价、成交量、成交额。ETF提供日频行情,包含代码、名称、日期、前收盘、开盘、最高、最低、收盘、成交量、成交额。可转债除日度行情外,还有转股溢价率、纯债价值、正股价格等指标。指数数据为日度点位与成交量,涵盖规模、行业等常见分类。 数据源:CMES金融数据库

c_hn_007

单相两级式并网光伏发电系统建模与仿真研究(Simululink仿真实现)

内容概要:本文系统解读了一套完整的多机器人路径规划(MAPF)MATLAB代码库,聚焦于优先级规划算法的实现与工程优化。框架采用四层架构设计:几何层负责地图解析与栅格化处理;拓扑层构建四邻域图与Petri网模型;调度层结合优先级启发式与动态边权膨胀策略进行路径生成,并通过节点预留历史和几何惩罚机制提升冲突消解效率;呈现层实现轨迹动画与视频输出。核心思想是将空间规划与时间同步解耦,先允许路径重叠并以惩罚引导避让,再通过时间维度的等待动作消解冲突。文章深入剖析了多种同步策略的权衡、交换冲突的处理难点、框架复杂度及可扩展性,旨在为MAPF领域的研究与教学提供一份可复现、可验证且具备工程深度的技术参考。; 适合人群:具备一定算法基础与MATLAB编程能力,从事路径规划、机器人调度、智能交通、自动化仓储等相关方向的科研人员及研究生。; 使用场景及目标:① 学习并复现多机器人路径规划中优先级规划算法的完整实现流程;② 深入理解动态边权膨胀、节点预留历史、几何惩罚等关键技术如何提升算法效率与鲁棒性;③ 掌握从问题建模、算法设计、冲突消解到可视化验证的完整科研闭环。; 阅读建议:建议结合代码逐模块阅读,重点关注各层之间的接口设计与数据流转逻辑,动手调试不同地图规模与智能体数量下的运行效果,并尝试改进冲突消解策略或引入回溯机制以提升算法完备性与性能。

@橘柑橙柠桔柚

膝关节MRI严重度校准软标签v2数据集4407研究LLM标注

医疗影像数据标注数据集:RSNA膝关节MRI竞赛的严重度校准软训练标签第二版,每行对应一例训练研究共4407行。标签构建流程:先由Qwen2.5-7B-Instruct离线模型对4349例仅有报告的研究按11类发现进行有序严重度状态标注(如关节积液的未提及、无、少量、中量、大量五级,保留显式否定与沉默的区别),再在58例专家金标准研究上按发现与状态对经验阳性率收缩校准并沿严重度阶梯单调化,模糊提及向发现基准率拉近30%。校准后状态在金标准集上宏AUC达0.831,较二值报告标签0.764提升0.066。专用于公共R6 ConvNeXt-small影像模型的暖启动微调,附完整列说明与训练脚本接口。适合医学影像竞赛选手与弱监督学习研究者使用。

licy__

第三阶段案例实战的数据部分

第三阶段案例实战的数据部分

BlackStar_L

基于直流母线电压稳定的飞轮储能并网系统双变流器协调控制研究(Simulink仿真实现)

内容概要:本文针对飞轮储能并网系统中直流母线电压波动的问题,深入研究了机侧与网侧双变流器的协调控制策略,旨在提升系统的稳定性与能量转换效率。通过Simulink搭建完整的系统仿真模型,采用以直流母线电压为外环、电流为内环的双闭环控制结构,实现对功率流动的精确调控。研究涵盖了控制系统的整体架构设计、双变流器间的协同工作机制、动态响应特性分析以及并网运行条件下的稳定性验证,提出了基于电压外环反馈调节的协调控制方法,有效抑制了因负载突变或能量回馈引起的母线电压冲击,确保系统在不同工况下可靠运行。; 适合人群:具备电力电子技术、自动控制理论及新能源系统基础知识的研究生、科研人员以及从事储能系统、微电网等相关领域开发的工程技术人员。; 使用场景及目标:①深入理解飞轮储能系统中双变流器的工作原理与协同控制机制;②掌握基于Simulink的电力电子系统建模与仿真技术;③学习并实现直流母线电压稳定的控制策略,提升复杂电力系统仿真与实际控制算法的设计与验证能力。; 阅读建议:建议结合文中所述Simulink仿真模型进行动手实践,重点关注控制器参数整定对系统动态性能的影响,并对照相关文献进一步深化对飞轮储能能量管理与并网控制策略的理解。

稷下科研社
评论 7
收藏 已收藏
分享
返回顶部
moleboy
单片机/工控 27,522 成员 28,796 内容