本文主要是介绍【小项目】①基于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串口屏 的简易自动喷洒系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!