【小项目】①基于C8051F020/②基于STM8串口屏 的简易自动喷洒系统

2024-01-05 07:10

本文主要是介绍【小项目】①基于C8051F020/②基于STM8串口屏 的简易自动喷洒系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录:

  • (一)方案一:总体性设计
    • 1.基础电路设计【硬件】
      • 1)整体原理图
      • 2)PCB电路
      • 3)3D_PCB
    • 2.程序设计【软件】
      • 1)主程序设计
      • 2)I2C读写PCF8563
      • 3)五项按键设定浇水时间段
    • 3.效果展示
      • 1)整体效果图
  • (二)方案二总体性设计
    • 1.基础电路设计【硬件】
      • 1)子单元原理图
      • 2)测试手工PCB电路
    • 2.程序设计【软件】
      • 1).子单元WIFI模块配置
      • 2)WIFI连接校验 以及 与串口屏通信
      • 3)OLED字符库 & 3G图标[14] & WIFI图标[15]
    • 3.效果展示
      • 1).整体效果图
  • Github项目地址、设计下载

注:仅用于学习分享,分享自己在使用C8051F020单片机中的所做的一个小方案【DIY】。
最后附有下载链接
方案一 用到的主要工具材料

  • Keil 4
  • C8051F020 微控制器
  • 主要功能芯片:PCF8563

(一)方案一:总体性设计

方案简易示意图:
在这里插入图片描述

1.基础电路设计【硬件】

电路硬件:
[MCU] C8051F020
[稳压电源]【LM2596-5.0V】12.0V稳压5.0V 【TPS7333】5.0V稳压3.3V
[外围电路] 1.7寸12864液晶屏、串口屏、功能按键、PCF8563实时时钟电路

1)整体原理图

在这里插入图片描述

2)PCB电路

在这里插入图片描述

3)3D_PCB

  • TOP层
    在这里插入图片描述

  • BOTTOM层
    在这里插入图片描述

2.程序设计【软件】

1)主程序设计

#include "c8051f020.h"
#include "delay.h"
#include "lcd.h"
#include "I2C.h"
#include "keydown.h"typedef unsigned int u16;
typedef unsigned char u8;
int Clock[16]; //读寄存器pecf8563  buffersbit LED = P1^6;//下载程序指示灯extern u8 KeyValue;
extern u8 code num[],kong[],kong1[],rain[];
extern int flag_move,flag_set,Time_Count_flag;struct Time //结构体全局变量
{unsigned char second;unsigned char minite;unsigned char hour;unsigned char day;unsigned char week;unsigned char month;unsigned char year;
};
struct Reg
{unsigned char reg1;unsigned char reg2;unsigned char clk;unsigned char count1;unsigned char count2;
};
struct Alarm
{unsigned char minite;unsigned char hour;unsigned char day;unsigned char week;
};
/*----------------函数定义声明-------------------------*/
void PORT_Init();//交叉开关使能
void SYSCLK_Init();
void Disable_Wdog();  //禁止看门狗定时器
void Clock_Setting();
void Init();             //初始化void PORT_Init()//交叉开关使能
{XBR0    = 0x07;   // Enable UART0(TXD0-P0.0  RXD-P0.1)  SPI_SCK-P0.2  SPI_MISO-P0.3// SPI_MOSI-P0.4  SPI_NSS-P0.5   (SDA-P0.6   SCL-P0.7)XBR1    = 0x10;		// INT1使能P1.2XBR2    = 0x44;		// TXD1-P1.0  RXD1-P1.1P3MDOUT = 0xff;	P1MDOUT = 0xff;	P2MDOUT = 0xff;	
}
/*void Timer0_Init() {     TMOD      = 0x02; //方式2 定时,自动重装载  TL0       = 0x06;     TH0       = 0x06; }*/
void SYSCLK_Init()
{   unsigned int i;OSCXCN=0X67;           //0X67=0110,0111for(i=0;i<256;i++);    //等待>1mswhile(!(OSCXCN&0X80)); //等待XTLVLD变为1OSCICN=0X88;           //时钟失效监测器,选择外部时钟源作为系统时钟
}void Disable_Wdog()   //禁止看门狗定时器
{  WDTCN=0xDE;  WDTCN=0xAD; 
}void Clock_Setting()
{struct Time TIME={0x10,0x49,0x09,0x15,0x00,0x03,0x18};//设置时间: 秒/分/时/日/星期/月/年struct Reg REG={0x00,0x00,0x83,0x82,0x00};//设置寄存器struct Alarm ALARM={0x00,0x00,0x00,0x00};//设置报时控制寄存器unsigned char Set[16];//写寄存器bufferSet[0]=REG.reg1;	Set[1]=REG.reg2;Set[2]=TIME.second;Set[3]=TIME.minite;Set[4]=TIME.hour;Set[5]=TIME.day;Set[6]=TIME.week;Set[7]=TIME.month;Set[8]=TIME.year;Set[9]=ALARM.minite;Set[10]=ALARM.hour;Set[11]=ALARM.day;Set[12]=ALARM.week;Set[13]=REG.clk;		//CLKOUT输出寄存器	 0DHSet[14]=REG.count1;	//定时器控制寄存器	 0EHSet[15]=REG.count2; //定时器倒计数寄存器 0FH//WritePcf(Set,0,16);//设置时钟
}void Init()
{Disable_Wdog();PORT_Init();SYSCLK_Init();Initial_Lcd();//LCD初始化clear_screen();//清屏SMBusInit();//SMBus初始化 设置I2C
}
void main()
{	u8 i=0;LED=0;//下载程序成功指示灯Init();EA=1;//打开中断Clock_Setting();//Timer0_Init();//定时器0中断//IE = 0x82;//中断初始化//TR0=1;Delay_ms(200);while(1){//Clock_Setting();//需设置时间时使用ReadPcf(Clock,0,16);//实时时钟显读取//display_graphic_8x16(1,(0+8*0),&num[KeyValue*16]);//按键值标志Key_setting();Time_Watch();}
}

2)I2C读写PCF8563

unsigned char Command;//命令缓存
int *I2CDataBuff;//待法发数据、接收数据指针
unsigned char ByteNumber;  //发送字节数
unsigned char ByteReadBytes;//读字节数
int *ByteReadAddress;//读缓冲区指针
unsigned char ChipChoice;//芯片选择,0选择RTC、1选择24C256							bit BusBusy;//总线忙
bit NoStop;//发送完一组数据后不发送停止位/***********************************************************************************
* 函数名称:ReadPcf;
*
* 函数功能描述:读PCF8563;
*              
* 输入参数:unsigned char类型指针BytesAddress,读出数据存储的头地址;
*	    unsigned char 类型RomAddress,片内地址;
*	    unsigned char 类型Count,读数据个数;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/void ReadPcf( int *BytesAddress,int RomAddress,unsigned char Count)//读PCF8563
{ChipChoice=0;ByteReadAddress=BytesAddress;ByteReadBytes=Count;    while (BusBusy);I2CDataBuff=&RomAddress;//存储空间地址BusBusy=1;AA=1;NoStop=0;ByteNumber=1;Command=I2CPcfAddressW;//设备写地址STA=1;while (BusBusy);
}
/***********************************************************************************
* 函数名称:WritePcf;
*
* 函数功能描述:写PCF8563;
*              
* 输入参数:unsigned char类型指针BytesAddress,写入数据的头地址;
*	    unsigned char 类型RomAddress,片内地址;
*	    unsigned char 类型Count,写数据个数;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/void WritePcf(unsigned char *BytesAddress,unsigned char RomAddress,unsigned char Count)//写PCF8563
{int xdata TempBuff[17],n;ChipChoice=0;TempBuff[0]=RomAddress;for(n=1;n<(Count+1);n++){TempBuff[n]=*BytesAddress++;}while (BusBusy);NoStop=1;I2CDataBuff=&TempBuff[0];BusBusy=1;AA=1;ByteNumber=Count+1;Command=I2CPcfAddressW;STA=1;while (BusBusy);
}

3)五项按键设定浇水时间段

#include "c8051f020.h"
#include "keydown.h"
#include "delay.h"
#include "lcd.h"typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit up     = P2^0;
sbit down   = P2^1;
sbit left   = P2^2;
sbit right  = P2^3;
sbit centre = P2^4;
u8 KeyValue=0;
int Set_Begin[16]={0,0,0,0,8},Set_End[16]={0,0,0,0,9};
int flag_page=0,flag_move=0;
extern int Clock[];
extern char code begin_time[],end_time[];//汉字
extern char code num[],heng[],maohao[],kong[];//字符
extern int bcd_dec(uchar bat);	//BCD码转十进制void Key_Move(int page[16])//初始or结束 页面设定
{int i,j;if(right == 0)//右移 修改时间{Dela

这篇关于【小项目】①基于C8051F020/②基于STM8串口屏 的简易自动喷洒系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572062

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高