首次提交

This commit is contained in:
张开科 2022-04-11 17:50:21 +08:00
parent e11e90b8a2
commit 63462de23e
32 changed files with 6618 additions and 1 deletions

6
.gitignore vendored
View File

@ -52,3 +52,9 @@ Module.symvers
Mkfile.old
dkms.conf
.vscode/
Listings/
Objects/
CreatBotAirHeating-V3.0-HC89S003AF4.uvgui.User
CreatBotAirHeating-V3.0-HC89S003AF4.hcf
STARTUP.A51

View File

@ -0,0 +1,514 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
<SchemaVersion>1.0</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Extensions>
<cExt>*.c</cExt>
<aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj</oExt>
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp</CppX>
<nMigrate>0</nMigrate>
</Extensions>
<DaveTm>
<dwLowDateTime>0</dwLowDateTime>
<dwHighDateTime>0</dwHighDateTime>
</DaveTm>
<Target>
<TargetName>Target 1</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<TargetOption>
<CLK51>32000000</CLK51>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>1</RunSim>
<RunTarget>0</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>0</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>120</PageWidth>
<PageLength>65</PageLength>
<TabStop>8</TabStop>
<ListingPath>.\Listings\</ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>0</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<nTsel>11</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon>Holychip\BIN\HC-LINK.dll</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>HC-LINK</Key>
<Name>-S5 -B115200 -O15</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>0</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>0</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<Lin2Executable></Lin2Executable>
<Lin2ConfigFile></Lin2ConfigFile>
<bLin2Auto>0</bLin2Auto>
</TargetOption>
</Target>
<Group>
<GroupName>Source Group</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Main.c</PathWithFileName>
<FilenameWithoutPath>Main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Sys_init.c</PathWithFileName>
<FilenameWithoutPath>Sys_init.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Hc89s_Config.c</PathWithFileName>
<FilenameWithoutPath>Hc89s_Config.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\IIC.c</PathWithFileName>
<FilenameWithoutPath>IIC.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\TM1650.c</PathWithFileName>
<FilenameWithoutPath>TM1650.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Public.c</PathWithFileName>
<FilenameWithoutPath>Public.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\PWM.c</PathWithFileName>
<FilenameWithoutPath>PWM.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\ADC.c</PathWithFileName>
<FilenameWithoutPath>ADC.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\UART1.c</PathWithFileName>
<FilenameWithoutPath>UART1.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Protocol.c</PathWithFileName>
<FilenameWithoutPath>Protocol.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Timer0.c</PathWithFileName>
<FilenameWithoutPath>Timer0.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Timer3.c</PathWithFileName>
<FilenameWithoutPath>Timer3.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\IAP.c</PathWithFileName>
<FilenameWithoutPath>IAP.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\PID.c</PathWithFileName>
<FilenameWithoutPath>PID.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Header Group</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Main.h</PathWithFileName>
<FilenameWithoutPath>Main.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Sys_init.h</PathWithFileName>
<FilenameWithoutPath>Sys_init.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>17</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Hc89s_Config.h</PathWithFileName>
<FilenameWithoutPath>Hc89s_Config.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>18</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\TM1650.h</PathWithFileName>
<FilenameWithoutPath>TM1650.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>19</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\IIC.h</PathWithFileName>
<FilenameWithoutPath>IIC.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>20</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Public.h</PathWithFileName>
<FilenameWithoutPath>Public.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>21</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\PWM.h</PathWithFileName>
<FilenameWithoutPath>PWM.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\ADC.h</PathWithFileName>
<FilenameWithoutPath>ADC.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\UART.h</PathWithFileName>
<FilenameWithoutPath>UART.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Protocol.h</PathWithFileName>
<FilenameWithoutPath>Protocol.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Timer0.h</PathWithFileName>
<FilenameWithoutPath>Timer0.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\Timer3.h</PathWithFileName>
<FilenameWithoutPath>Timer3.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\IAP.h</PathWithFileName>
<FilenameWithoutPath>IAP.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\app\PID.h</PathWithFileName>
<FilenameWithoutPath>PID.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
</ProjectOpt>

View File

@ -0,0 +1,517 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
<SchemaVersion>1.1</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Targets>
<Target>
<TargetName>Target 1</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<TargetOption>
<TargetCommonOption>
<Device>HC89S003AF4</Device>
<Vendor>HC89S Series</Vendor>
<Cpu>IRAM(0-0xFF) XRAM(0-0x2FF) IROM(0-0x3FFF) CLOCK(32000000) </Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile>"LIB\STARTUP.A51" ("Standard 8051 Startup Code")</StartupFile>
<FlashDriverDll></FlashDriverDll>
<DeviceId>0</DeviceId>
<RegisterFile>HC_DEFINE.H</RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
<Linker></Linker>
<OHString></OHString>
<InfinionOptionDll></InfinionOptionDll>
<SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile></SFDFile>
<bCustSvd>0</bCustSvd>
<UseEnv>0</UseEnv>
<BinPath></BinPath>
<IncludePath></IncludePath>
<LibPath></LibPath>
<RegisterFilePath>Holychip\</RegisterFilePath>
<DBRegisterFilePath>Holychip\</DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>.\Objects\</OutputDirectory>
<OutputName>CreatBotAirHeating-V3.0-HC89S003AF4</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
<DebugInformation>1</DebugInformation>
<BrowseInformation>1</BrowseInformation>
<ListingPath>.\Listings\</ListingPath>
<HexFormatSelection>0</HexFormatSelection>
<Merge32K>0</Merge32K>
<CreateBatchFile>0</CreateBatchFile>
<BeforeCompile>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopU1X>0</nStopU1X>
<nStopU2X>0</nStopU2X>
</BeforeCompile>
<BeforeMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopB1X>0</nStopB1X>
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopA1X>0</nStopA1X>
<nStopA2X>0</nStopA2X>
</AfterMake>
<SelectedForBatchBuild>0</SelectedForBatchBuild>
<SVCSIdString></SVCSIdString>
</TargetCommonOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<GenerateAssemblyFile>0</GenerateAssemblyFile>
<AssembleAssemblyFile>0</AssembleAssemblyFile>
<PublicsOnly>0</PublicsOnly>
<StopOnExitCode>3</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
<BankNo>65535</BankNo>
</CommonProperty>
<DllOption>
<SimDllName>S8051.DLL</SimDllName>
<SimDllArguments></SimDllArguments>
<SimDlgDll>DP51.DLL</SimDlgDll>
<SimDlgDllArguments>-p51</SimDlgDllArguments>
<TargetDllName>S8051.DLL</TargetDllName>
<TargetDllArguments></TargetDllArguments>
<TargetDlgDll>TP51.DLL</TargetDlgDll>
<TargetDlgDllArguments>-p51</TargetDlgDllArguments>
</DllOption>
<DebugOption>
<OPTHX>
<HexSelection>0</HexSelection>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
<Simulator>
<UseSimulator>0</UseSimulator>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>1</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
<RestoreSysVw>1</RestoreSysVw>
</Simulator>
<Target>
<UseTarget>1</UseTarget>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>0</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<RestoreTracepoints>1</RestoreTracepoints>
<RestoreSysVw>1</RestoreSysVw>
</Target>
<RunDebugAfterBuild>0</RunDebugAfterBuild>
<TargetSelection>11</TargetSelection>
<SimDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
</SimDlls>
<TargetDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
<Driver>Holychip\BIN\HC-LINK.dll</Driver>
</TargetDlls>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>1</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
<DriverSelection>4102</DriverSelection>
</Flash1>
<bUseTDR>0</bUseTDR>
<Flash2>Holychip\BIN\HC-LINK.dll</Flash2>
<Flash3></Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
<pFcArmRoot></pFcArmRoot>
<FcArmLst>0</FcArmLst>
</Utilities>
<Target51>
<Target51Misc>
<MemoryModel>0</MemoryModel>
<RTOS>0</RTOS>
<RomSize>2</RomSize>
<DataHold>0</DataHold>
<XDataHold>0</XDataHold>
<UseOnchipRom>0</UseOnchipRom>
<UseOnchipArithmetic>0</UseOnchipArithmetic>
<UseMultipleDPTR>0</UseMultipleDPTR>
<UseOnchipXram>0</UseOnchipXram>
<HadIRAM>1</HadIRAM>
<HadXRAM>1</HadXRAM>
<HadIROM>1</HadIROM>
<Moda2>0</Moda2>
<Moddp2>0</Moddp2>
<Modp2>0</Modp2>
<Mod517dp>0</Mod517dp>
<Mod517au>0</Mod517au>
<Mode2>0</Mode2>
<useCB>0</useCB>
<useXB>0</useXB>
<useL251>0</useL251>
<useA251>0</useA251>
<Mx51>0</Mx51>
<ModC812>0</ModC812>
<ModCont>0</ModCont>
<Lp51>0</Lp51>
<useXBS>0</useXBS>
<ModDA>0</ModDA>
<ModAB2>0</ModAB2>
<Mx51P>0</Mx51P>
<hadXRAM2>0</hadXRAM2>
<uocXram2>0</uocXram2>
<ModC2>0</ModC2>
<ModH2>0</ModH2>
<Mdu_R515>0</Mdu_R515>
<Mdu_F120>0</Mdu_F120>
<Psoc>0</Psoc>
<hadIROM2>0</hadIROM2>
<ModSmx2>0</ModSmx2>
<cBanks>0</cBanks>
<xBanks>0</xBanks>
<OnChipMemories>
<RCB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0xffff</Size>
</RCB>
<RXB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</RXB>
<Ocm1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm1>
<Ocm2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm2>
<Ocm3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm3>
<Ocr1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr1>
<Ocr2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr2>
<Ocr3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr3>
<IRO>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x4000</Size>
</IRO>
<IRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x100</Size>
</IRA>
<XRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x300</Size>
</XRA>
<XRA512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA512>
<IROM512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM512>
</OnChipMemories>
</Target51Misc>
<C51>
<RegisterColoring>0</RegisterColoring>
<VariablesInOrder>0</VariablesInOrder>
<IntegerPromotion>1</IntegerPromotion>
<uAregs>0</uAregs>
<UseInterruptVector>1</UseInterruptVector>
<Fuzzy>3</Fuzzy>
<Optimize>8</Optimize>
<WarningLevel>2</WarningLevel>
<SizeSpeed>1</SizeSpeed>
<ObjectExtend>1</ObjectExtend>
<ACallAJmp>0</ACallAJmp>
<InterruptVectorAddress>0</InterruptVectorAddress>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath>.\app</IncludePath>
</VariousControls>
</C51>
<Ax51>
<UseMpl>0</UseMpl>
<UseStandard>1</UseStandard>
<UseCase>0</UseCase>
<UseMod51>0</UseMod51>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Ax51>
<Lx51>
<useFile>0</useFile>
<linkonly>0</linkonly>
<UseMemoryFromTarget>1</UseMemoryFromTarget>
<CaseSensitiveSymbols>0</CaseSensitiveSymbols>
<WarningLevel>2</WarningLevel>
<DataOverlaying>1</DataOverlaying>
<OverlayString></OverlayString>
<MiscControls></MiscControls>
<DisableWarningNumbers></DisableWarningNumbers>
<LinkerCmdFile></LinkerCmdFile>
<Assign></Assign>
<ReserveString></ReserveString>
<CClasses></CClasses>
<UserClasses></UserClasses>
<CSection></CSection>
<UserSection></UserSection>
<CodeBaseAddress></CodeBaseAddress>
<XDataBaseAddress></XDataBaseAddress>
<PDataBaseAddress></PDataBaseAddress>
<BitBaseAddress></BitBaseAddress>
<DataBaseAddress></DataBaseAddress>
<IDataBaseAddress></IDataBaseAddress>
<Precede></Precede>
<Stack></Stack>
<CodeSegmentName></CodeSegmentName>
<XDataSegmentName></XDataSegmentName>
<BitSegmentName></BitSegmentName>
<DataSegmentName></DataSegmentName>
<IDataSegmentName></IDataSegmentName>
</Lx51>
</Target51>
</TargetOption>
<Groups>
<Group>
<GroupName>Source Group</GroupName>
<Files>
<File>
<FileName>Main.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Main.c</FilePath>
</File>
<File>
<FileName>Sys_init.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Sys_init.c</FilePath>
</File>
<File>
<FileName>Hc89s_Config.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Hc89s_Config.c</FilePath>
</File>
<File>
<FileName>IIC.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\IIC.c</FilePath>
</File>
<File>
<FileName>TM1650.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\TM1650.c</FilePath>
</File>
<File>
<FileName>Public.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Public.c</FilePath>
</File>
<File>
<FileName>PWM.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\PWM.c</FilePath>
</File>
<File>
<FileName>ADC.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\ADC.c</FilePath>
</File>
<File>
<FileName>UART1.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\UART1.c</FilePath>
</File>
<File>
<FileName>Protocol.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Protocol.c</FilePath>
</File>
<File>
<FileName>Timer0.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Timer0.c</FilePath>
</File>
<File>
<FileName>Timer3.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\Timer3.c</FilePath>
</File>
<File>
<FileName>IAP.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\IAP.c</FilePath>
</File>
<File>
<FileName>PID.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\PID.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>Header Group</GroupName>
<Files>
<File>
<FileName>Main.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Main.h</FilePath>
</File>
<File>
<FileName>Sys_init.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Sys_init.h</FilePath>
</File>
<File>
<FileName>Hc89s_Config.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Hc89s_Config.h</FilePath>
</File>
<File>
<FileName>TM1650.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\TM1650.h</FilePath>
</File>
<File>
<FileName>IIC.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\IIC.h</FilePath>
</File>
<File>
<FileName>Public.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Public.h</FilePath>
</File>
<File>
<FileName>PWM.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\PWM.h</FilePath>
</File>
<File>
<FileName>ADC.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\ADC.h</FilePath>
</File>
<File>
<FileName>UART.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\UART.h</FilePath>
</File>
<File>
<FileName>Protocol.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Protocol.h</FilePath>
</File>
<File>
<FileName>Timer0.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Timer0.h</FilePath>
</File>
<File>
<FileName>Timer3.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\Timer3.h</FilePath>
</File>
<File>
<FileName>IAP.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\IAP.h</FilePath>
</File>
<File>
<FileName>PID.h</FileName>
<FileType>5</FileType>
<FilePath>.\app\PID.h</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
</Project>

View File

@ -1,3 +1,3 @@
# CreatBotAirHeatingV2
PEEK300风嘴加热核心控制板V2(更换主控芯片)
PEEK300风嘴加热核心控制板V2(更换主控芯片) 主控芯片HC89S003ASF4

123
app/ADC.c Normal file
View File

@ -0,0 +1,123 @@
/*
* ADC.c
*
* Created on: 2022322
* Author: User
*/
#include <Main.h>
uint16_t volatile Channel = 0; // ADC通道位
uint16_t xdata Temp_Array[2][10] = {0}; //两个通道的10次缓存值
uint8_t count = 0; //转换次数计数
uint16_t Display1_Array[5] = {0};
uint16_t Display2_Array[5] = {0};
static void ADC_Init(void); //初始化函数
static void Get_ADCData(void); //把读到的AD值转成温度
void Delay_2us(uint16_t fui_i);
ADC_t ADC = {
0,
0,
0,
0,
ADC_Init, // ADC初始化
Get_ADCData, //转换读到的值
};
/*
* @name ADC_Init
* @brief ADC初始化函数
* @param None
* @retval None
*/
static void ADC_Init(void)
{
// P0M1 = P0M1 & 0x0F | 0x30;
// ADCC0 = 0x81; //打开ADC电源 选择内部基准电压VREF 选择内部4V基准电压
ADCC0 = 0x84; //打开ADC电源 选择外部基准电压VREF
Delay_2us(10); // 延时20微秒等待稳定
ADCC1 = 0x0D; //打开外部通道3
ADCC2 = 0x6D; // ADC转换结果12位 数据右对其 16分频
IE1 |= 0x20; //打开ADC中断
EA = 1; //打开总中断
ADCC0 &= ~0x20; //清除转换完成标志位
Channel = Temp1_CHANNEL;
ADCC1 = (ADCC1 & (~0x07)) | Channel; //切换通道通道
ADCC0 |= 0x40; //启动ADC转换
}
static void Get_ADCData(void) //转换读出的AD值
{
static uint16_t Temp1 = 0, Temp2 = 0;
static uint8_t count = 0;
Temp1 = Temp_Array[0][0] + Temp_Array[0][1] + Temp_Array[0][2] + Temp_Array[0][3] + Temp_Array[0][4] + Temp_Array[0][5] + Temp_Array[0][6] + Temp_Array[0][7] + Temp_Array[0][8] + Temp_Array[0][9];
Temp1 = Temp1 / 10; //求10次平均值
ADC.Temp1_Result = (Temp1 * 5 / 4.095 + 5) / 10; //四舍五入转换为温度 内部4V基准电压 采集为分压后电压的一半
Temp1 = 0;
Temp2 = Temp_Array[1][0] + Temp_Array[1][1] + Temp_Array[1][2] + Temp_Array[1][3] + Temp_Array[1][4] + Temp_Array[1][5] + Temp_Array[1][6] + Temp_Array[1][7] + Temp_Array[1][8] + Temp_Array[1][9];
Temp2 = Temp2 / 10; //求10次平均值
ADC.Temp2_Result = (Temp2 * 5 / 4.095 + 5) / 10; //四舍五入转换为温度 内部4V基准电压 采集为分压后电压的一半
Temp2 = 0;
if (Timer0.ADC_Timer >= TIMER0_80mS)
{
Timer0.ADC_Timer = 0;
Display1_Array[count] = ADC.Temp1_Result;
Display2_Array[count] = ADC.Temp2_Result;
count++;
}
if (count >= 5)
{
count = 0;
Temp1 = Display1_Array[0] + Display1_Array[1] + Display1_Array[2] + Display1_Array[3] + Display1_Array[4];
ADC.Display_Temp1_Value = (float)Temp1 / 5 + 0.5;
Temp2 = Display2_Array[0] + Display2_Array[1] + Display2_Array[2] + Display2_Array[3] + Display2_Array[4];
ADC.Display_Temp2_Value = (float)Temp2 / 5 + 0.5;
Temp1 = 0;
Temp2 = 0;
}
}
/*
* @name ADC_Rpt
* @brief ADC中断函数
* @param None
* @retval None
*/
void ADC_Rpt() interrupt ADC_VECTOR
{
ADCC0 &= ~0x20; //清除ADC中断标志位
if (Channel == Temp1_CHANNEL) //通道13
{
Temp_Array[0][count] = ADCR;
Channel = Temp2_CHANNEL; //切换通道
}
else if (Channel == Temp2_CHANNEL) //通道12
{
Temp_Array[1][count] = ADCR;
Channel = Temp1_CHANNEL; //切换通道
count++;
}
if (count >= 10) //循环读10次
count = 0;
ADCC1 = (ADCC1 & (~0x07)) | Channel; //切换通道通道
Delay_2us(10); //切换通道后建议延时20us
ADCC0 |= 0x40; //启动下一次转换
}
/*
* @name Delay_2us
* @brief 2us函数
* @param fui_i
* @retval None
*/
void Delay_2us(uint16_t fui_i)
{
while (fui_i--)
;
}
/////////////////////////////////////////////////////////////////////////////////

27
app/ADC.h Normal file
View File

@ -0,0 +1,27 @@
/*
* adc.h
*
* Created on: 2022322
* Author: User
*/
#ifndef _ADC_H_
#define _ADC_H_
#define Temp1_CHANNEL 0x0D //通道13
#define Temp2_CHANNEL 0x0C //通道12
typedef struct
{
uint16_t volatile Temp1_Result; //温度1转换结果
uint16_t volatile Temp2_Result; //温度2adc转换结果
uint16_t volatile Display_Temp1_Value;
uint16_t volatile Display_Temp2_Value;
void (*Init)(void); //初始化
void (*Get_ADCData)(void); //转换ad的值变成温度
} ADC_t;
extern ADC_t ADC;
#endif

691
app/Hc89s_Config.c Normal file
View File

@ -0,0 +1,691 @@
#include "Hc89s_Config.h"
/*
*********************************************************************************************************
*
*********************************************************************************************************
*/
static void SystemClock_Init(void);
#if GPIO_INIT_ENABLE
static void GPIO_Init(void);
#endif
#if RESET_INIT_ENABLE
static void Reset_Init(void);
#endif
#if WDT_INIT_ENABLE
static void WDT_Init(void);
#endif
#if SYSTEM_EA_INIT_ENABLE
static void SystemEA_Init(void);
#endif
/*
*********************************************************************************************************
* : SystemClock_Init
* :
*
* :
*********************************************************************************************************
*/
static void SystemClock_Init(void)
{
/*************************************** 内部高频 配置 ************************************************/
#if CLOCK_IN_HIGH_ENABLE
CLKSWR = CLOCK_IN_HIGH_CLKSWR_INIT;
CLKDIV = CLOCK_IN_HIGH_CLKDIV_INIT;
/*************************************** 内部低频 配置 ************************************************/
#elif CLOCK_IN_LOW_ENABLE
while((CLKCON&0x10)!=0x10);
CLKSWR &=~ 0x30;
while((CLKSWR&0xC0)!=0x00);
CLKCON &=~ 0x02;
CLKDIV = CLOCK_IN_LOW_CLKDIV_INIT;
/*************************************** 外部高频 配置 ************************************************/
#elif CLOCK_OUT_HIGH_ENABLE
CLKCON |= 0x04;
XTALCFG |= 0x01+CLOCK_OUT_HIGH_HXTAL_MODE_SEL_INIT+CLOCK_OUT_HIGH_HXTAL_CFG_INIT;
while((CLKCON&0x80)!=0x80);
CLKSWR = 0xF0;
while((CLKSWR&0xC0)!=0xC0);
CLKCON &=~ 0x02;
CLKDIV = CLOCK_OUT_HIGH_CLKDIV_INIT;
/*************************************** 外部低频 配置 ************************************************/
#elif CLOCK_OUT_LOW_ENABLE
CLKCON |= 0x04;
XTALCFG |= CLOCK_OUT_HIGH_LXTAL_CFG_INIT;
while((CLKCON&0x40)!=0x40);
CLKSWR = 0xF0;
while((CLKSWR&0x80)!=0x80);
CLKCON &=~ 0x02;
CLKDIV = CLOCK_OUT_HIGH_CLKDIV_INIT;
#endif
#if CLOCK_OUTPUT_ENABLE
CLKOUT = CLOCK_CLK_OUT_SEL_INIT + 0x10;
CLKO_MAP = CLOCK_CLOCKMAP_INIT ;
#endif
#if CLOCK_FREQ_CLK_ENABLE
FREQ_CLK = CLOCK_FREQ_CLK_INIT;
#endif
#if CLOCK_RC_EN_PD_INIT
XTALCFG = CLOCK_RC_EN_PD_INIT;
#endif
}
/*
*********************************************************************************************************
* : GPIO_Init
* :
*
* :
*********************************************************************************************************
*/
#if GPIO_INIT_ENABLE
static void GPIO_Init(void)
{
P0M0=GPIO_MODE_P0M0;
P0M1=GPIO_MODE_P0M1;
P0M2=GPIO_MODE_P0M2;
P0M3=GPIO_MODE_P0M3;
P1M0=GPIO_MODE_P1M0;
P2M0=GPIO_MODE_P2M0;
P2M1=GPIO_MODE_P2M1;
P2M2=GPIO_MODE_P2M2;
P2M3=GPIO_MODE_P2M3;
#if GPIO_INIT_PULLRES_ENABLE
P0LPU = GPIO_PULLRESVALUE_P02;
#endif
#if GPIO_INIT_DBC_P00_ENABLE
P00DBC = GPIO_DBC_INIT_P00;
#endif
#if GPIO_INIT_DBC_P01_ENABLE
P01DBC = GPIO_DBC_INIT_P01;
#endif
#if GPIO_INIT_DBC_P02_ENABLE
P02DBC = GPIO_DBC_INIT_P02;
#endif
}
#endif
/*
*********************************************************************************************************
* : Reset_Init
* :
*
* :
*********************************************************************************************************
*/
#if RESET_INIT_ENABLE
static void Reset_Init(void)
{
#if RESET_INIT_ENABLE
BORC = RESET_BORVS_INIT;
BORDBC = RESET_BORDBC_INIT;
#endif
#if RESET_RSTDBC_INIT_ENABLE
RSTDBC = RESET_RSTDBC_INIT;
#endif
#if RESET_SPOV_INIT_ENABLE
SPOV_RSTEN = RESET_SPOV_INIT;
#endif
}
#endif
/*
*********************************************************************************************************
* : WDTInit
* :
*
* :
*********************************************************************************************************
*/
#if WDT_INIT_ENABLE
static void WDT_Init(void)
{
WDTC=WDT_WDTC_INIT;
WDTCCR=WDT_WDTCCR_INIT;
}
#endif
/*
*********************************************************************************************************
* : LVD_Init
* :
*
* :
*********************************************************************************************************
*/
#if LVD_INIT_ENABLE
static void LVD_Init(void)
{
LVDC=LVD_LVDC_INIT;
#if LVD_LVDDBC_INIT_ENABLE
LVDDBC=LVD_LVDDBC_INIT;
#endif
}
#endif
/*
*********************************************************************************************************
* : TIMER3_Init
* : TIMER3初始化
*
* :
*********************************************************************************************************
*/
#if TIMER3_INIT_ENABLE
static void TIMER3_Init(void)
{
#if TIMER3_T3MAP_ENABLE
T3_MAP = TIMER3_T3MAP_INIT;
#endif
T3CON = TIMER3_TCON_INIT;
TH3 = TIMER3_TH3_INIT;
TL3 = TIMER3_TL3_INIT;
}
#endif
/*
*********************************************************************************************************
* : TIMER4_Init
* : 4
*
* :
*********************************************************************************************************
*/
#if TIMER4_INIT_ENABLE
static void TIMER4_Init(void)
{
#if TIMER4_T4MAP_ENABLE
T4_MAP = TIMER4_T4MAP_INIT;
#endif
T4CON = TIMER4_TCON_INIT;
TH4 = TIMER4_TH4_INIT;
TL4 = TIMER4_TL4_INIT;
}
#endif
/*
*********************************************************************************************************
* : TIMER5_Init
* : 5
*
* :
*********************************************************************************************************
*/
#if TIMER5_INIT_ENABLE
static void TIMER5_Init(void)
{
#if TIMER5_T5MAP_ENABLE
T5_MAP = TIMER5_T5MAP_INIT;
#endif
T5CON = TIMER5_TCON_INIT;
T5CON1 = TIMER5_TCON1_INIT;
TH5 = TIMER5_TH5_INIT;
TL5 = TIMER5_TL5_INIT;
}
#endif
/*
*********************************************************************************************************
* : PWM0_Init
* : PWM0初始化
*
* :
*********************************************************************************************************
*/
#if PWM0_INIT_ENABLE
static void PWM0_Init(void)
{
#if PWM0OUT_INIT_ENABLE
PWM0_MAP = PWM0_PWM0MAP_INIT;
#endif
#if PWM01OUT_INIT_ENABLE
PWM01_MAP = PWM0_PWM01MAP_INIT;
#endif
PWM0C = PWM0_PWM0C_INIT;
PWM0PH = PWM0PH_INIT;
PWM0PL = PWM0PL_INIT;
#if PWM0OUT_INIT_ENABLE
PWM0DH = PWM0DH_INIT;
PWM0DL = PWM0DL_INIT;
#endif
#if PWM0_DTHL_ENABLE
PWM0DTH = PWM0DTH_INIT;
PWM0DTL = PWM0DTL_INIT;
#elif PWM01OUT_INIT_ENABLE
PWM0DTH = PWM01DH_INIT;
PWM0DTL = PWM01DL_INIT;
#endif
PWM0EN = PWM0_PWM0EN_INIT;
}
#endif
/*
*********************************************************************************************************
* : PWM1_Init
* : PWM1初始化
*
* :
*********************************************************************************************************
*/
#if PWM1_INIT_ENABLE
static void PWM1_Init(void)
{
#if PWM1OUT_INIT_ENABLE
PWM1_MAP = PWM1_PWM1MAP_INIT;
#endif
#if PWM11OUT_INIT_ENABLE
PWM11_MAP = PWM1_PWM11MAP_INIT;
#endif
PWM1C = PWM1_PWM1C_INIT;
PWM1PH = PWM1PH_INIT;
PWM1PL = PWM1PL_INIT;
#if PWM1OUT_INIT_ENABLE
PWM1DH = PWM1DH_INIT;
PWM1DL = PWM1DL_INIT;
#endif
#if PWM1_DTHL_ENABLE
PWM1DTH = PWM1DTH_INIT;
PWM1DTL = PWM1DTL_INIT;
#elif PWM11OUT_INIT_ENABLE
PWM1DTH = PWM11DH_INIT;
PWM1DTL = PWM11DL_INIT;
#endif
PWM1EN = PWM1_PWM1EN_INIT;
}
#endif
/*
*********************************************************************************************************
* : PWM2_Init
* : PWM2初始化
*
* :
*********************************************************************************************************
*/
#if PWM2_INIT_ENABLE
static void PWM2_Init(void)
{
#if PWM2OUT_INIT_ENABLE
PWM2_MAP = PWM2_PWM2MAP_INIT;
#endif
#if PWM21OUT_INIT_ENABLE
PWM21_MAP = PWM2_PWM21MAP_INIT;
#endif
PWM2C = PWM2_PWM2C_INIT;
PWM2PH = PWM2PH_INIT;
PWM2PL = PWM2PL_INIT;
#if PWM2OUT_INIT_ENABLE
PWM2DH = PWM2DH_INIT;
PWM2DL = PWM2DL_INIT;
#endif
#if PWM2_DTHL_ENABLE
PWM2DTH = PWM2DTH_INIT;
PWM2DTL = PWM2DTL_INIT;
#elif PWM21OUT_INIT_ENABLE
PWM2DTH = PWM21DH_INIT;
PWM2DTL = PWM21DL_INIT;
#endif
PWM2EN = PWM2_PWM2EN_INIT;
}
#endif
/*
*********************************************************************************************************
* : PWM3_Init
* : PWM3初始化
*
* :
*********************************************************************************************************
*/
#if PWM3_INIT_ENABLE
static void PWM3_Init(void)
{
PWM3_MAP = PWM3_PWM3MAP_INIT;
PWM3C = PWM3_PWM3C_INIT;
PWM3P = PWM3P_INIT;
PWM3D = PWM3D_INIT;
}
#endif
/*
*********************************************************************************************************
* : ADC_Init
* : ADC初始化
*
* :
*********************************************************************************************************
*/
#if ADC_INIT_ENABLE
static void ADC_Init(void)
{
ADCC0= ADC_ADCC0_INIT ;
ADCC1= ADC_ADCC1_INIT ;
ADCC2= ADC_ADCC2_INIT ;
#if ADC_ADCWC_INIT
ADCWC= ADC_ADCWC_INIT ;
#endif
}
#endif
/*
*********************************************************************************************************
* : UART1_Init
* : ADC初始化
*
* :
*********************************************************************************************************
*/
#if UART1_INIT_ENABLE
static void UART1_Init(void)
{
TXD_MAP = UART1_TXDMAP_INIT;
RXD_MAP = UART1_RXDMAP_INIT;
SCON = UART1_SCON_INIT;
#if UART1_MODEL0_ENABLE
SCON2=UART1_MODEL0_SCON2_INIT ;
#elif UART1_MODEL1_ENABLE
SCON2=UART1_MODEL1_SCON2_INIT ;
#elif UART1_MODEL2_ENABLE
SCON2=UART1_MODEL2_SCON2_INIT ;
#if UART1_MODEL2_SM2_INIT
SADDR = UART1_MODEL2_SADDR_INIT;
SADEN = UART1_MODEL2_SADEN_INIT;
#endif
#elif UART1_MODEL3_ENABLE
SCON2=UART1_MODEL3_SCON2_INIT ;
#if UART1_MODEL3_SM2_INIT
SADDR = UART1_MODEL3_SADDR_INIT;
SADEN = UART1_MODEL3_SADEN_INIT;
#endif
#endif
}
#endif
/*
*********************************************************************************************************
* : UART2_Init
* : UART2初始化
*
* :
*********************************************************************************************************
*/
#if UART2_INIT_ENABLE
static void UART2_Init(void)
{
TXD2_MAP = UART2_TXD2MAP_INIT;
RXD2_MAP = UART2_RXD2MAP_INIT;
S2CON = UART2_REN_INIT;
S2CON2 = UART2_S2CON2_INIT;
}
#endif
/*
*********************************************************************************************************
* : SPI_Init
* : SPI初始化
*
* :
*********************************************************************************************************
*/
#if SPI_INIT_ENABLE
static void SPI_Init(void)
{
SS_MAP = SPI_SSMAP_INIT;
SCK_MAP = SPI_SCKMAP_INIT;
MOSI_MAP = SPI_MOSIMAP_INIT;
MISO_MAP = SPI_MISOMAP_INIT;
SPCTL = SPI_SPCTL_INIT;
}
#endif
/*
*********************************************************************************************************
* : EXTI_Init
* :
*
* :
*********************************************************************************************************
*/
#if EXIT_INIT_ENABLE
static void EXTI_Init(void)
{
/**************************************** 配置外部中断0-1管脚 *****************************************/
#if ( EXIT0_INIT_ENABLE || EXIT1_INIT_ENABLE )
INT01_PINS = EXIT_INT01_PINS_INIT ;
#endif
/**************************************** 配置外部中断0-3电平 *****************************************/
#if ( EXIT0_INIT_ENABLE || EXIT1_INIT_ENABLE || EXIT2_INIT_ENABLE || EXIT3_INIT_ENABLE )
PITS0 = EXIT_PITS0_INIT;
#endif
/**************************************** 配置外部中断4-7电平 *****************************************/
#if ( EXIT4_INIT_ENABLE || EXIT5_INIT_ENABLE || EXIT6_INIT_ENABLE || EXIT7_INIT_ENABLE )
PITS1 = EXIT_PITS1_INIT;
#endif
/**************************************** 配置外部中断8-11电平 *****************************************/
#if ( EXIT8_INIT_ENABLE || EXIT9_INIT_ENABLE || EXIT10_INIT_ENABLE || EXIT11_INIT_ENABLE )
PITS2 = EXIT_PITS2_INIT;
#endif
/**************************************** 配置外部中断12-15电平 *****************************************/
#if ( EXIT12_INIT_ENABLE || EXIT13_INIT_ENABLE || EXIT14_INIT_ENABLE || EXIT15_INIT_ENABLE )
PITS3 = EXIT_PITS3_INIT;
#endif
/**************************************** 配置外部中断2-07使能 *****************************************/
#if ( EXIT2_INIT_ENABLE || EXIT3_INIT_ENABLE || EXIT4_INIT_ENABLE ||\
EXIT5_INIT_ENABLE || EXIT6_INIT_ENABLE || EXIT7_INIT_ENABLE)
PINTE0 = EXIT_PINTE0_INIT;
#endif
/**************************************** 配置外部中断12-15使能 *****************************************/
#if ( EXIT8_INIT_ENABLE || EXIT9_INIT_ENABLE || EXIT10_INIT_ENABLE || EXIT11_INIT_ENABLE ||\
EXIT12_INIT_ENABLE || EXIT13_INIT_ENABLE || EXIT14_INIT_ENABLE || EXIT15_INIT_ENABLE )
PINTE1 = EXIT_PINTE1_INIT;
#endif
}
#endif
/*
*********************************************************************************************************
* : TIMER0Init
* :
*
* :
*********************************************************************************************************
*/
#if ( TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE )
static void TIMER01_Init(void)
{
#if (TIMER0_T0OUT_INIT || TIMER0_CT0_INIT)
T0_MAP==TIMER0_T0MAP_INIT;
#endif
#if (TIMER1_T1OUT_INIT || TIMER1_CT1_INIT)
T1_MAP==TIMER1_T1MAP_INIT;
#endif
TMOD=TIMER01_TMOD_INIT;
TCON1=TIMER01_TCON1_INIT;
TCON=TIMER01_TCON_INIT;
#if TIMER0_INIT_ENABLE
TH0=TIMER0_TH0_INIT;
TL0=TIMER0_TL0_INIT;
#endif
#if TIMER1_INIT_ENABLE
TH1=TIMER1_TH1_INIT;
TL1=TIMER1_TL1_INIT;
#endif
}
#endif
/*
*********************************************************************************************************
* : INT_Init
* :
*
* :
*********************************************************************************************************
*/
#if (EXIT_INIT_ENABLE || WDT_INT_ENABLE || TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE \
|| TIMER3_INIT_ENABLE || TIMER4_INIT_ENABLE || TIMER5_INIT_ENABLE || PWM_INIT_ENABLE || ADC_INT_ENABLE)
static void INT_Init(void)
{
/**************************************** 配置IE使能 *****************************************/
#if (WDT_INT_ENABLE || EXIT0_INIT_ENABLE || EXIT1_INIT_ENABLE || TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE \
|| UART1_INT_ENABLE || UART2_INT_ENABLE)
IE=INT_IE_INIT;
#endif
/**************************************** 配置IE1使能 *****************************************/
#if (EXIT2_7_INIT_ENABLE || EXIT8_15_INIT_ENABLE || TIMER3_INIT_ENABLE \
|| TIMER4_INIT_ENABLE || TIMER5_INIT_ENABLE || ADC_INT_ENABLE || SPI_INT_ENABLE)
IE1=INT_IE1_INIT;
#endif
/**************************************** 配置IP0(优先级) *****************************************/
#if (EXIT0_INIT_ENABLE || EXIT1_INIT_ENABLE || TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE)
IP0=INT_IP0_INIT;
#endif
/**************************************** 配置IP1(优先级) *****************************************/
#if (WDT_INT_ENABLE || UART1_INT_ENABLE || UART2_INT_ENABLE || LVD_LVDIE_INIT)
IP1=INT_IP1_INIT;
#endif
/**************************************** 配置IP2(优先级) *****************************************/
#if (TIMER3_INIT_ENABLE || TIMER4_INIT_ENABLE || PWM_INIT_ENABLE || SPI_INT_ENABLE)
IP2=INT_IP2_INIT;
#endif
/**************************************** 配置IP3(优先级) *****************************************/
#if (EXIT8_15_INIT_ENABLE || EXIT2_7_INIT_ENABLE || TIMER5_INIT_ENABLE || ADC_INT_ENABLE)
IP3=INT_IP3_INIT;
#endif
/**************************************** 配置总中断 *****************************************/
#if (SYSTEM_EA_INIT_ENABLE)
EA=SYSTEM_EA_INIT;
#endif
}
#endif
/*
*********************************************************************************************************
* : System_Init
* :
*
* :
*********************************************************************************************************
*/
void System_Init(void)
{
SystemClock_Init();
#if GPIO_INIT_ENABLE
GPIO_Init();
#endif
#if RESET_INIT_ENABLE
Reset_Init();
#endif
#if WDT_INIT_ENABLE
WDT_Init();
#endif
#if EXIT_INIT_ENABLE
EXTI_Init();
#endif
#if ( TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE )
TIMER01_Init();
#endif
#if TIMER3_INIT_ENABLE
TIMER3_Init();
#endif
#if TIMER4_INIT_ENABLE
TIMER4_Init();
#endif
#if TIMER5_INIT_ENABLE
TIMER5_Init();
#endif
#if PWM0_INIT_ENABLE
PWM0_Init();
#endif
#if PWM1_INIT_ENABLE
PWM1_Init();
#endif
#if PWM2_INIT_ENABLE
PWM2_Init();
#endif
#if PWM3_INIT_ENABLE
PWM3_Init();
#endif
#if ADC_INIT_ENABLE
ADC_Init();
#endif
#if UART1_INIT_ENABLE
UART1_Init();
#endif
#if UART2_INIT_ENABLE
UART2_Init();
#endif
#if SPI_INIT_ENABLE
SPI_Init();
#endif
#if (EXIT_INIT_ENABLE || WDT_INIT_ENABLE || TIMER0_INIT_ENABLE || TIMER1_INIT_ENABLE \
|| TIMER3_INIT_ENABLE || TIMER4_INIT_ENABLE || TIMER5_INIT_ENABLE || PWM_INIT_ENABLE || ADC_INT_ENABLE \
|| UART1_INT_ENABLE || UART1_INT_ENABLE || SPI_INT_ENABLE)
INT_Init();
#endif
}

2952
app/Hc89s_Config.h Normal file

File diff suppressed because it is too large Load Diff

133
app/IAP.c Normal file
View File

@ -0,0 +1,133 @@
/*
* IAP.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
uint8_t EEPROM_Array[4] = {0}; //保存温度的数组
uint16_t Save_Value1;
uint16_t Save_Value2;
static uint8_t Flash_ReadData(uint16_t); //读一字节
static void FLASH_WriteData(uint8_t, uint16_t); //写一字节(写之前需要先擦除)
static void Flash_EraseBlock(uint16_t); //扇区擦除
static void Get_TempValue(void); //恢复储存的温度
static void Save_TempValue(void);
static void Flash_ReadArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr);
static void Flash_WriteArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr);
/* Public variables-----------------------------------------------------------*/
IAP_t xdata IAP =
{
EEPROM_Array,
Save_TempValue,
Get_TempValue};
/*
* @name Get_TempValue
* @brief
* @param None
* @retval None
*/
static void Get_TempValue(void)
{
Flash_ReadArr(EEPROM_Array_ADDR, 4, EEPROM_Array);
Public.Setting_Temp1 = EEPROM_Array[0];
Public.Setting_Temp1 <<= 8;
Public.Setting_Temp1 |= EEPROM_Array[1];
Public.Setting_Temp2 = EEPROM_Array[2];
Public.Setting_Temp2 <<= 8;
Public.Setting_Temp2 |= EEPROM_Array[3];
Save_Value1 = Public.Setting_Temp1;
Save_Value2 = Public.Setting_Temp2;
}
/*
* @name Save_TempValue
* @brief
* @param None
* @retval None
*/
static void Save_TempValue(void)
{
if ((Save_Value1 != Public.Setting_Temp1) || (Save_Value2 != Public.Setting_Temp2))
{
IAP.EEPROM_Array[0] = (Public.Setting_Temp1 >> 8) & 0xFF;
IAP.EEPROM_Array[1] = Public.Setting_Temp1 & 0xFF;
IAP.EEPROM_Array[2] = (Public.Setting_Temp2 >> 8) & 0xFF;
IAP.EEPROM_Array[3] = Public.Setting_Temp2 & 0xFF;
Flash_EraseBlock(EEPROM_Array_ADDR);
Flash_WriteArr(EEPROM_Array_ADDR, 4, EEPROM_Array);
}
}
/*
* @name FLASH_WriteData
* @brief ()
* @param None
* @retval None
*/
static void FLASH_WriteData(uint8_t dat, uint16_t addr)
{
EA = 0; //关闭总中断
INSCON = 0x80; //设置操作区域为EEPROM
IAP_DATA = dat;
IAP_CMD = 0xF00F; // Flash解锁
IAP_ADDR = addr;
IAP_CMD = 0xB44B; //字节编程
IAP_CMD = 0xE11E; //触发一次操作 触发后自动锁定
INSCON = 0x00; //关闭写EEPROM操作
EA = 1;
}
/*
* @name Flash_EraseBlock
* @brief (32)
* @param None
* @retval None
*/
static void Flash_EraseBlock(uint16_t addr)
{
EA = 0; //关闭总中断
INSCON = 0x80; //设置操作区域为EEPROM
IAP_CMD = 0xF00F; // Flash解锁
IAP_ADDR = addr; //写入擦除地址
IAP_CMD = 0xD22D; //选择操作方式,扇区擦除
IAP_CMD = 0xE11E; //触发后IAP_ADDRL&IAP_ADDRH指向0xFF,同时自动锁定
INSCON = 0x00; //关闭EEPROM操作
EA = 1;
}
/*
* @name Flash_WriteArr
* @brief
* @param address len savearray
* @retval None
*/
static void Flash_WriteArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr)
{
unsigned char fui_i = 0;
EA = 0;
for (fui_i = 0; fui_i < fuc_Length; fui_i++)
{
FLASH_WriteData(*(fucp_SaveArr++), fui_Address++);
}
EA = 1;
}
/*
* @name Flash_ReadArr
* @brief
* @param address len savearray
* @retval None
*/
static void Flash_ReadArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr)
{
INSCON = 0x80;
while (fuc_Length--)
*(fucp_SaveArr++) = *((unsigned char code *)(fui_Address++)); //读取数据
}
/********************************************************
End Of File
********************************************************/

33
app/IAP.h Normal file
View File

@ -0,0 +1,33 @@
/*
* IAP.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __IAP_H__
#define __IAP_H__
/* define ------------------------------------------------------------------*/
#define EEPROM_Array_ADDR (uint16_t)0x0000 //设置通道1温度值储存地址
#define IAP_CNT (uint8_t)10
//定义枚举类型
//定义结构体类型
typedef struct
{
uint8_t *EEPROM_Array; //储存的数组
void (*Save_TempValue)(void); //储存温度的值
void (*Get_TempValue)(void); //读取储存的温度
} IAP_t;
/* extern variables-----------------------------------------------------------*/
extern IAP_t xdata IAP;
#endif
/********************************************************
End Of File
********************************************************/

109
app/IIC.c Normal file
View File

@ -0,0 +1,109 @@
/*
* IIC.c
*
* Created on: 20220312
* Author: User
*/
#include <Main.h>
static void Start1(void);
static void Write1(uint8_t Data);
static void ACK1(void);
static void Stop1(void);
static void Delay2us(uint8_t); //@16.000MHz 2us
IIC_t IIC_1 = {
Start1,
Write1,
ACK1,
Stop1};
/*
* @name Start1
* @brief IIC1启动命令
* @param None
* @retval None
*/
static void Start1(void)
{
SCL_1 = HIGH;
SDA_1 = HIGH;
Delay2us(1); //@16.000MHz // 2微秒延时
SDA_1 = LOW; //时钟线高电平 拉低数据线以为传输开始
}
/*
* @name Write1
* @brief IIC1写命令
* @param Data
* @retval None
*/
static void Write1(uint8_t Data)
{
uint8_t i = 0;
SCL_1 = LOW; //拉低时钟线 数据可以变化
Delay2us(1); // 1微秒延时
for (i = 0; i < 8; i++)
{
if (Data & 0x80)
SDA_1 = HIGH;
else
SDA_1 = LOW;
Delay2us(1); // 1微秒延时
SCL_1 = LOW;
Delay2us(1); // 1微秒延时
SCL_1 = HIGH;
Delay2us(1); // 1微秒延时
SCL_1 = LOW;
Data <<= 1;
}
}
/*
* @name ACK1
* @brief IIC1应答命令
* @param None
* @retval None
*/
static void ACK1(void)
{
static uint8_t timeout = 1;
SCL_1 = 1;
Delay2us(1);
SCL_1 = 0;
Delay2us(1);
while ((SDA_1) && (timeout <= 200))
{
timeout++;
}
SCL_1 = 0;
}
/*
* @name Stop1
* @brief IIC1停止命令
* @param None
* @retval None
*/
static void Stop1(void)
{
SCL_1 = 1;
SDA_1 = 0;
Delay2us(1);
SDA_1 = 1; //时钟线高电平时 拉高数据线为停止信号
}
/*
* @name Delay2us
* @brief 2uS
* @param None
* @retval None
*/
static void Delay2us(uint8_t fui_i) //@16.000MHz 2us
{
// uint8_t fui_i =1;
while(fui_i--);
}

29
app/IIC.h Normal file
View File

@ -0,0 +1,29 @@
/*
* IIC.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __IIC_H
#define __IIC_H
#include <Public.h>
#define SCL_1 P0_2
#define SDA_1 P0_1
#define HIGH 1
#define LOW 0
typedef struct // IIC 结构体
{
void (*start)(void); //开启命令
void (*write)(uint8_t); //写数据命令
void (*ACK)(void); //应答命令
void (*stop)(void); //停止命令
} IIC_t;
extern IIC_t IIC_1;
#endif

79
app/Main.c Normal file
View File

@ -0,0 +1,79 @@
#define ALLOCATE_EXTERN
#include <Main.h>
uint8_t Channel1_Error_Flag = 0;
uint8_t Channel2_Error_Flag = 0;
void main()
{
Sys.Init();
while (1)
{
UART1.Protocol_Analy(); //协议解析
if (Public.Channel1_StatusFlag == FALSE) //判断通道1是否关闭
{
PWM.PWM1_HeatingSetting(0); //关闭加热通道1
Timer0.Error1_Timer = 0; //硬件错误检测计时清除 开始计时
}
else
{
if ((ADC.Display_Temp1_Value == 0) && (Timer0.Error1_Timer >= 2)) //如果加热打开两秒后 温度还是零 认为温度传感器1故障
{
Channel1_Error_Flag = System_Fault; //通道1温度传感器故障
// PWM.Heating_Flag1 = System_Fault;
}
else
{
Channel1_Error_Flag = FALSE;
}
}
if (Public.Channel2_StatusFlag == FALSE) //判断通道2是否关闭
{
PWM.PWM2_HeatingSetting(0); //关闭加热通道2
Timer0.Error2_Timer = 0; //硬件错误检测计时清除 开始计时
}
else
{
if ((Timer0.Error2_Timer >= 2) && (ADC.Display_Temp2_Value == 0)) //如果加热打开两秒后 温度还是零 认为温度传感器2故障
{
Channel2_Error_Flag = System_Fault; //通道2温度传感器故障
// PWM.Heating_Flag2 = System_Fault;
}
else
{
Channel2_Error_Flag = FALSE;
}
}
if ((Public.Channel1_StatusFlag == FALSE) && (Public.Channel2_StatusFlag == FALSE)) //判断两个加热是否都关闭
{
FAN_PIN = LOW; //关闭风机
}
else
{
FAN_PIN = HIGH; //打开风机
}
ADC.Get_ADCData(); //读取AD值转化成温度值
if (Timer0.TM1650_Flag == 0)
{
TM1650_Display(&IIC_1, Public.Setting_Temp1, 1); //显示通道1
}
else
{
TM1650_Display(&IIC_1, Public.Setting_Temp2, 2); //显示通道2
}
WDTC |= 0x10; //喂看门狗
// }
}
}

43
app/Main.h Normal file
View File

@ -0,0 +1,43 @@
/*
* main.h
*
* Created on: 2022Äê03ÔÂ12ÈÕ
* Author: User
*/
#ifndef __MAIN_H_
#define __MAIN_H_
#include "HC89S003AF4.h"
#include <stdio.h>
#include <intrins.h>
#include <Sys_init.h>
#include <TM1650.h>
#include <UART.h>
#include <IIC.h>
#include <Public.h>
#include <Timer0.h>
#include <Timer3.h>
#include <Protocol.h>
#include <ADC.h>
#include <PWM.h>
#include <IAP.h>
#include <PID.h>
#define FAN_PIN P2_6
extern uint8_t Channel1_Error_Flag;
extern uint8_t Channel2_Error_Flag;
#endif

80
app/PID.c Normal file
View File

@ -0,0 +1,80 @@
/*
* PID.c
*
* Created on: 20220322
* Author: User
*/
#include <Main.h>
#define kp 13.2 //比例
#define ki 0.067 //积分
#define kd 35 //微分
//#define pidtime 6 // pid周期= pidtime * 50ms至少300ms否则6675无法工作
#define iloss 30 //积分分离阈值,双极性
sint16_t xdata ek1[2]; // ek0当前误差ek1上次误差
sint16_t xdata uk1; // pid计算输出值规格化[0100]
sint16_t xdata iek1; //误差积分,分离式
sint16_t xdata ek2[2]; // ek0当前误差ek1上次误差
sint16_t xdata uk2; // pid计算输出值规格化[0100]
sint16_t xdata iek2; //误差积分,分离式
static void Init(void);
static uint8_t Realize(uint8_t CHANNEL, uint16_t temp_val);
PID_t xdata PID_Func = {
Init,
Realize};
static void Init(void)
{
ek1[0] = 0;
ek1[1] = 0;
uk1 = 0;
iek1 = 0;
ek2[0] = 0;
ek2[1] = 0;
uk2 = 0;
iek2 = 0;
}
/**
* @brief PID算法实现
* @param CHANNEL Temp_Setting
* @note
* @retval PID计算后的输出
*/
static uint8_t Realize(uint8_t CHANNEL, uint16_t Temp_Setting)
{
if (CHANNEL == Temp1_CHANNEL)
{
ek1[1] = ek1[0];
ek1[0] = Temp_Setting - ADC.Temp1_Result; //计算本次偏差
if (ek1[0] > (-iloss) && ek1[0] < iloss) //积分分离
iek1 += ek1[0];
uk1 = ek1[0] * kp + iek1 * ki + (ek1[0] - ek1[1]) * kd; // PID运算
if (uk1 <= 0)
uk1 = 0;
if (uk1 >= 100)
uk1 = 100;
return uk1;
}
else if (CHANNEL == Temp2_CHANNEL) //通道2计算
{
ek2[1] = ek2[0];
ek2[0] = Temp_Setting - ADC.Temp2_Result; //计算本次偏差
if (ek2[0] > (-iloss) && ek2[0] < iloss) //积分分离
iek2 += ek2[0];
uk2 = ek2[0] * kp + iek2 * ki + (ek2[0] - ek2[1]) * kd; // PID运算
if (uk2 <= 0)
uk2 = 0;
if (uk2 >= 100)
uk2 = 100;
return uk2;
}
return FALSE;
}

41
app/PID.h Normal file
View File

@ -0,0 +1,41 @@
/*
* PID.h
*
* Created on: 20220322
* Author: User
*/
typedef struct
{
void (*Init)(void);
uint8_t(*Realize)(uint8_t,uint16_t);
} PID_t;
// typedef struct
// {
// int target_val; //目标值
// int actual_val; //实际值
// int err; //定义当前偏差值
// int err_next; //定义下一个偏差值
// int err_last; //定义最后一个偏差值
// uint8_t kp,ki,kd; //定义比例,积分,微分系数
// }_pid;
extern PID_t xdata PID_Func;

147
app/PWM.c Normal file
View File

@ -0,0 +1,147 @@
/*
* PWM.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
#define CCP_S1 BIT5
#define CCP_S0 BIT4
#define EPC0H BIT1
#define EPC0L BIT0
/* Private variables----------------------------------------------------------*/
/* Private function prototypes------------------------------------------------*/
static void PWM_Init(void); // PWM初始化
static void PWM1_HeatingSetting(uint8_t Percent); //通道1设置加热
static void PWM2_HeatingSetting(uint8_t Percent); //通道2设置加热
/* Public variables-----------------------------------------------------------*/
PWM_t PWM =
{0,
0,
PWM_Init,
PWM1_HeatingSetting,
PWM2_HeatingSetting};
/*
* @name PWM_Init
* @brief PWM初始化
* @param None
* @retval None
*/
static void PWM_Init()
{
PWM0_MAP = 0x22; // PWM0通道映射P22
PWM01_MAP = 0x23; // PWM01通道映射P23
PWM0C = 0x01; // PWM0高有效 PWM01高有效 时钟8分频
//独立模式下PWM0和PWM01共用一个周期寄存器
// PWM0的占空比调节使用 PWM0组的占空比寄存器
// PWM01的占空比调节使用 PWM0组的死区寄存器
//周期计算 = 0x03ff / (Fosc / PWM分频系数)
// = 0x03ff / (16000000 / 8)
// = 1023 /2000000
// = 511.5us 约1.955kHz
PWM0PH = 0x03; //周期高4位设置为0x03
PWM0PL = 0xE7; //周期低8位设置为0xFF
//占空比计算= 0x0155 / (Fosc / PWM分频系数) Fosc见系统时钟配置的部分
// = 0x0155 / (16000000 / 8)
// = 341 / 2000000
// = 170.5us 占空比为 170.5/511.5 = 33.3%
PWM0DH = 0x00; // PWM0高4位占空比
PWM0DL = 0x00; // PWM0低4位占空比
PWM0DTH = 0x00; // PWM01高4位占空比
PWM0DTL = 0x00; // PWM01低8位占空比
PWM0EN = 0x0F; //使能PWM0 工作于独立模式
}
/*
* @name PWM1_HeatingSetting
* @brief
* @param None
* @retval None
*/
static void PWM1_HeatingSetting(uint8_t Percent)
{
uint16_t Temp_Value = 0;
Temp_Value = Percent * 10;
if (Public.Channel1_StatusFlag != FALSE)
{
if (Channel1_Error_Flag != System_Fault) //判断是否故障
{
if (Percent == 0)
{
PWM.Heating_Flag1 = System_Complete;//加热温度已经到达
}
else
{
PWM.Heating_Flag1 = TRUE; //正在加热
}
}
else
{
PWM.Heating_Flag1 = System_Fault;
}
}
else
{
PWM.Heating_Flag1 = FALSE;
}
PWM0DTH = (Temp_Value >> 8) & 0xFF;
PWM0DTL = (Temp_Value & 0xFF);
}
/*
* @name PWM2_HeatingSetting
* @brief
* @param None
* @retval None
*/
static void PWM2_HeatingSetting(uint8_t Percent)
{
uint16_t Temp_Value = 0;
Temp_Value = Percent * 10;
if (Public.Channel2_StatusFlag != FALSE)
{
if (Channel2_Error_Flag != System_Fault) //判断是否故障
{
if (Percent == 0)
{
PWM.Heating_Flag2 = System_Complete; //加热温度已经到达
}
else
{
PWM.Heating_Flag2 = TRUE; //正在加热
}
}
else
{
PWM.Heating_Flag2 = System_Fault;
}
}
else
{
PWM.Heating_Flag2 = FALSE;
}
PWM0DH = (Temp_Value >> 8) & 0xFF;
PWM0DL = (Temp_Value & 0xFF);
}
/********************************************************
End Of File
********************************************************/

37
app/PWM.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef __PWM_H__
#define __PWM_H__
/*
* PWM.h
*
* Created on: 20220312
* Author: User
*/
//定义枚举类型
typedef enum
{
Duty_0 = (uint8_t)0,
Duty_20 = (uint8_t)20,
Duty_40 = (uint8_t)40,
Duty_60 = (uint8_t)60,
Duty_80 = (uint8_t)80,
Duty_100 = (uint8_t)100,
}PWM_Value_t;
//定义结构体类型
typedef struct
{
uint8_t Heating_Flag1;
uint8_t Heating_Flag2;
void (*PWM_Init)(void); //PWM初始化
void (*PWM1_HeatingSetting)(uint8_t Percent); //设置加热百分比 范围 0~100
void (*PWM2_HeatingSetting)(uint8_t Percent); //设置加热百分比 范围 0~100
} PWM_t;
/* extern variables-----------------------------------------------------------*/
extern PWM_t PWM;
#endif
/********************************************************
End Of File
********************************************************/

129
app/Protocol.c Normal file
View File

@ -0,0 +1,129 @@
/*
* Protocol.c
*
* Created on: 20220312
* Author: User
*/
#include <Main.h>
void Analysis(UART_t *UART); //协议处理
void Send(uint8_t func); //数据发送
uint8_t Sum_Check(uint8_t *arr, uint8_t Len); //求和校验
Protocol_t xdata Protocol = {
Analysis,
Send};
/* 协议长度为10 头帧 0A 第二帧 功能位 第三帧 有效数据长度位 中间6位为有效数据位 尾帧为和校验位
01 02
1 0x00 0x01 0x02
2
0A 01 06 00 00 00 00 00 00 66
*/
/*
* @name Analysis
* @brief
* @param UART_t
* @retval None
*/
void Analysis(UART_t *UART)
{
UART_t *const com = UART;
uint8_t sum_check = 0, Data_Len = 0;
if (UART1.ucRec_Flag == TRUE) //证明接收到数据
{
sum_check = Sum_Check(UART1.pucRec_Buffer, Protocol_Len); //求和校验的值
Data_Len = UART1.pucRec_Buffer[2]; //获取数据长度
if ((UART1.pucRec_Buffer[0] == 0x0A) && (UART1.pucRec_Buffer[Data_Len + 3] == sum_check)) //校验协议
{
if (UART1.pucRec_Buffer[1] == Register_Read) //读寄存器返回值
{
Send(Register_Read); //发送返回数据
}
else if (UART1.pucRec_Buffer[1] == Register_Write) //写寄存器的返回值
{
Public.Channel1_StatusFlag = UART1.pucRec_Buffer[3]; //提取通道1设置状态
PWM.Heating_Flag1 = Public.Channel1_StatusFlag;
Public.Setting_Temp1 = UART1.pucRec_Buffer[4]; //提取通道1设置温度
Public.Setting_Temp1 = Public.Setting_Temp1 << 8;
Public.Setting_Temp1 |= UART1.pucRec_Buffer[5]; //提取通道1设置温度
Public.Channel2_StatusFlag = UART1.pucRec_Buffer[6]; //提取通道2设置状态
PWM.Heating_Flag2 = Public.Channel2_StatusFlag;
Public.Setting_Temp2 = UART1.pucRec_Buffer[7]; //提取通道2设置温度
Public.Setting_Temp2 = Public.Setting_Temp2 << 8;
Public.Setting_Temp2 |= UART1.pucRec_Buffer[8]; //提取通道2设置温度
IAP.Save_TempValue(); //将温度保存到EEPROM内
Send(Register_Write); //发送返回数据
}
else if (UART1.pucRec_Buffer[1] == Setting_Reg_Read) //读取保存的设置温度值
{
Send(Setting_Reg_Read);
}
}
Public.Memory_Clr(UART1.pucRec_Buffer, Protocol_Len); //清除缓存
UART1.ucRec_Flag = FALSE; //关闭串口接收完成标志位
}
}
/*
* @name Send
* @brief
* @param func
* @retval None
*/
void Send(uint8_t func)
{
UART1.pucSend_Buffer[0] = 0x0A; //头帧
UART1.pucSend_Buffer[1] = func; //功能位
UART1.pucSend_Buffer[2] = 0x06; //有效数据位长度
if (func == Register_Read)
{
UART1.pucSend_Buffer[3] = PWM.Heating_Flag1; //通道1的标识
UART1.pucSend_Buffer[4] = (ADC.Display_Temp1_Value >> 8) & 0xFF; //返回通道1实时的温度
UART1.pucSend_Buffer[5] = ADC.Display_Temp1_Value & 0xFF;
UART1.pucSend_Buffer[6] = PWM.Heating_Flag2; //通道2的状态
UART1.pucSend_Buffer[7] = (ADC.Display_Temp2_Value >> 8) & 0xFF; //返回通道2实时的温度
UART1.pucSend_Buffer[8] = ADC.Display_Temp2_Value & 0xFF;
}
else
{
UART1.pucSend_Buffer[3] = Public.Channel1_StatusFlag;; //通道1的标识
UART1.pucSend_Buffer[4] = (Public.Setting_Temp1 >> 8) & 0xFF; //返回通道1实时的温度
UART1.pucSend_Buffer[5] = Public.Setting_Temp1 & 0xFF;
UART1.pucSend_Buffer[6] = Public.Channel2_StatusFlag; //通道2的状态
UART1.pucSend_Buffer[7] = (Public.Setting_Temp2 >> 8) & 0xFF; //返回通道2实时的温度
UART1.pucSend_Buffer[8] = Public.Setting_Temp2 & 0xFF;
}
UART1.pucSend_Buffer[9] = Sum_Check(UART1.pucSend_Buffer, Protocol_Len); //求前9位和检验的值
UART1.UART_SendArray(UART1.pucSend_Buffer, Protocol_Len); //发送返回值
}
/*
* @name Sum_Check
* @brief
* @param *arr Len
* @retval None
* checksum校验算法
* 便88
* FF255
*/
uint8_t Sum_Check(uint8_t *arr, uint8_t Len) //求和校验函数
{
uint8_t i = 0;
uint16_t Sum = 0;
for (i = 0; i < (Len - 1); i++)
{
Sum += *(arr + i);
}
if (Sum > 0xFF) //超过255 求补码
{
Sum = (~(Sum & 0xFF)) + 1;
}
return Sum & 0xFF;
}

39
app/Protocol.h Normal file
View File

@ -0,0 +1,39 @@
/*
* Protocol.h
*
* Created on: 20220312
* Author: User
*/
#include<Main.h>
#define Register_Read 0x01 //读寄存器
#define Register_Write 0x02 //写寄存器
#define Setting_Reg_Read 0x03 //读保存设置寄存器寄存器
#define Protocol_Len 0x0A //协议数据长度
typedef struct
{
void (*Analysis)(UART_t *);
void (*Send)(uint8_t);
}Protocol_t;
extern Protocol_t xdata Protocol;

110
app/Public.c Normal file
View File

@ -0,0 +1,110 @@
/*
* Public.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
static void Delay_us(uint16_t); // us延时函数
static void Delay_ms(uint16_t); // ms延时函数
static void Memory_Clr(uint8_t *, uint16_t); //内存清除函数
static void Error_Handler(void); //错误处理函数
static void Sys_Soft_Reset(void); //系统软件复位
/* Public variables-----------------------------------------------------------*/
Public_t idata Public =
{
0,
0,
0,
0,
Delay_us,
Delay_ms,
Memory_Clr,
Error_Handler,
Sys_Soft_Reset};
/* Private function prototypes------------------------------------------------*/
/*
* @name Delay_ms
* @brief
* @param ms ->
* @retval None
*/
static void Delay_ms(uint16_t fui_i) //@16MHz
{
uint16_t fui_j;
for (; fui_i > 0; fui_i--)
for (fui_j = 1596; fui_j > 0; fui_j--)
;
}
/*
* @name Delay_us
* @brief
* @param us ->
* @retval None
*/
static void Delay_us(uint16_t us) //@22.1184MHz
{
uint8_t i;
while (us--)
{
i = 3;
while (--i)
;
}
}
/*
* @name Memory_Set
* @brief
* @param pucBuffer ->
LEN ->
* @retval None
*/
static void Memory_Clr(uint8_t *pucBuffer, uint16_t LEN)
{
uint16_t i;
for (i = 0; i < LEN; i++)
{
*(pucBuffer + i) = (uint8_t)0;
}
}
/*
* @name Error_Handler
* @brief
* @param None
* @retval None
*/
static void Error_Handler()
{
}
/*
* @name Sys_Soft_Reset
* @brief
* @param None
* @retval None
*/
static void Sys_Soft_Reset(void)
{
// #ifdef Monitor_Run_Code
// printf("System soft reset!\r\n\r\n");
// #endif
// IAP_CONTR = 0x20;
}
/********************************************************
End Of File
********************************************************/

74
app/Public.h Normal file
View File

@ -0,0 +1,74 @@
/*
* Public.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __PUBLIC_H_
#define __PUBLIC_H_
#define FALSE 0
#define TRUE 1
#define HIGH 1
#define LOW 0
//数据类型重定义
typedef signed char sint8_t;
typedef signed short int sint16_t;
typedef signed long int sint32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned long int uint32_t;
//定义枚举类型 -> BIT位
typedef enum
{
BIT0 = (uint8_t)(0x01 << 0),
BIT1 = (uint8_t)(0x01 << 1),
BIT2 = (uint8_t)(0x01 << 2),
BIT3 = (uint8_t)(0x01 << 3),
BIT4 = (uint8_t)(0x01 << 4),
BIT5 = (uint8_t)(0x01 << 5),
BIT6 = (uint8_t)(0x01 << 6),
BIT7 = (uint8_t)(0x01 << 7),
}BIT_t;
//定义枚举类型 系统的状态
typedef enum
{
System_Stop = (uint8_t)0, //系统停止加热
System_Heating = (uint8_t)1, //加热中
System_Complete = (uint8_t)2, //加热温度达到
System_Fault = (uint8_t)3, //系统故障
} Sys_Status_t;
//定义结构体类型
typedef struct
{
uint8_t Channel1_StatusFlag;
uint8_t Channel2_StatusFlag;
uint16_t Setting_Temp1;
uint16_t Setting_Temp2;
void (*Delau_us)(uint16_t); //us延时函数
void (*Delay_ms)(uint16_t); //ms延时函数
void (*Memory_Clr)(uint8_t*,uint16_t); //内存清除函数
void (*Error_Handler)(void); //错误处理函数
void (*Sys_Soft_Reset)(void); //系统软件复位
} Public_t;
/* extern variables-----------------------------------------------------------*/
extern Public_t idata Public;
/*******预编译宏定义*******/
#define Monitor_Run_Code //代码运行监控器
//#define Hardware_TEST //硬件测试
#endif
/********************************************************
End Of File
********************************************************/

35
app/Sys_init.c Normal file
View File

@ -0,0 +1,35 @@
/*
* Sys_init.c
*
* Created on: 20220312
* Author: User
*/
#include <Main.h>
extern System_Init(); //引用外部函数声明
static void Init(void); //初始化函数
Sys_init_t Sys = {
Init};
/*
* @name Init
* @brief
* @param None
* @retval None
*/
static void Init(void)
{
// WDTCCR = 0x00; //关闭看门狗
System_Init(); //时钟以及引脚初始化 采用配置文件完成
Timer0.Timer0_Init(); //定时器0初始化
Timer3.Timer3_Init(); //定时器3初始化
PWM.PWM_Init(); // PWM初始化
ADC.Init(); // ADC初始化
UART1.UART_Init(); //串口1初始化
TM1650.Init(); // 1650初始化
PID_Func.Init(); // pid初始化
IAP.Get_TempValue(); //读取存储的温度值
FAN_PIN = LOW; //上电默认关闭风机
}

24
app/Sys_init.h Normal file
View File

@ -0,0 +1,24 @@
/*
* Sys_init.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __SYS_INIT_H
#define __SYS_INIT_H
typedef struct
{
void(*Init)(void); //系统初始化函数
}Sys_init_t;
extern Sys_init_t Sys;
#endif

148
app/TM1650.c Normal file
View File

@ -0,0 +1,148 @@
/*
* TM1650.c
*
* Created on: 20220312
* Author: User
*/
#include <Main.h>
// 数码管显示数组
static xdata uint8_t tab[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x40, // 10 = -
0x79, // 11 = E
0x50, // 12 = r
0x00, // 13 = Null
0x09, // 14
0x58, // 15 = 下c
0x1c, // 16 = u
0x63, // 17 = 上o
0x39, // 18 = C
0x5C, // 19 = 下o
0x0f, // 20 = 大反C
0x61, // 21 = 上c
0x71, // 22 = F
0x37, // 23 = N
0x77, // 24 = A
0x10, // 25 下|
0x14 // 26 下|下|
};
static void Init(void); // tm1650初始化
static void TM1650_Set(IIC_t *Channel, uint8_t Add, uint8_t Value); //设置tm1650寄存器的值
static void Display_OFF(IIC_t *Channel); //显示OFF 字符
static void Display_Close(IIC_t *Channel); //显示暂时关闭
void TM1650_Display(IIC_t *Channel, uint16_t Value, uint8_t dot); //显示使能
TM1650_t TM1650 = {
1,
Init,
Display_OFF,
Display_Close};
/*
* @name Init
* @brief 1650
* @param None
* @retval None
*/
static void Init(void)
{
TM1650_Set(&IIC_1, 0x48, 0x31); //打开通道1 设置亮度3级 开显示
}
/*
* @name TM1650_Set
* @brief 1650
* @param Channel Add Value
* @retval None
*/
static void TM1650_Set(IIC_t *Channel, uint8_t Add, uint8_t Value)
{
IIC_t *const COM = Channel;
EA = 0;
COM->start(); // iic开始
COM->write(Add); // iic写功能或者地址
COM->ACK(); //等待应答信号
COM->write(Value); // iic写设置数据或显示数据
COM->ACK(); //等待应答信号
COM->stop(); // iic停止
EA = 1;
}
/*
* @name TM1650_Set
* @brief 1650
* @param Channel Value CHANNEL
* @retval None
*/
void TM1650_Display(IIC_t *Channel, uint16_t Value, uint8_t CHANNEL)
{
IIC_t *const IIC = Channel;
if (CHANNEL == 1) //判断显示通道
{
TM1650_Set(IIC, DIG1, tab[25]); //显示|
}
else
{
TM1650_Set(IIC, DIG1, tab[26]); //显示||
}
if (Value < 100)
{
TM1650_Set(IIC, DIG2, tab[13]); //如果温度不到100 关闭最高位数码管
}
else
{
TM1650_Set(IIC, DIG2, tab[Value % 1000 / 100]);
}
TM1650_Set(IIC, DIG3, tab[Value % 100 / 10]);
TM1650_Set(IIC, DIG4, tab[Value % 10 / 1]);
// TM1650_Set(IIC, DIG1, tab[Value / 1000]);
// TM1650_Set(IIC, DIG2, tab[Value / 100 % 10]);
// TM1650_Set(IIC, DIG3, tab[Value / 10 % 10]);
// TM1650_Set(IIC, DIG4, tab[Value / 1 % 10]);
}
/*
* @name Display_OFF
* @brief TM1650显示OFF
* @param Channel
* @retval None
*/
static void Display_OFF(IIC_t *Channel)
{
IIC_t *const IIC = Channel;
TM1650_Set(IIC, DIG1, tab[0]); //第一位显示O
TM1650_Set(IIC, DIG2, tab[22]); //第二位显示F
TM1650_Set(IIC, DIG3, tab[22]); //第三位显示F
TM1650_Set(IIC, DIG4, tab[13]); //第四位显示关闭
}
/*
* @name Display_Close
* @brief 1650
* @param Channel
* @retval None
*/
static void Display_Close(IIC_t *Channel)
{
IIC_t *const IIC = Channel;
TM1650_Set(IIC, DIG1, tab[13]); //关闭显示
TM1650_Set(IIC, DIG2, tab[13]); //关闭显示
TM1650_Set(IIC, DIG3, tab[13]); //关闭显示
TM1650_Set(IIC, DIG4, tab[13]); //关闭显示
}

37
app/TM1650.h Normal file
View File

@ -0,0 +1,37 @@
/*
* TM1650.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __TM1650_H
#define __TM1650_H
#include <IIC.h>
#define DIG1 0x68
#define DIG2 0x6A
#define DIG3 0x6C
#define DIG4 0x6E
typedef struct
{
uint8_t Flicker_Flag; //TM1650闪烁的标志位
void (*Init)(void); //初始化函数
void (*Display_OFF)(IIC_t*); //显示off命令
void (*Display_Close)(IIC_t*); //显示关闭命令
}TM1650_t;
extern void TM1650_Display(IIC_t *Channel, uint16_t Value,uint8_t CHANNEL); //显示使能
extern TM1650_t TM1650;
#endif

75
app/Timer0.c Normal file
View File

@ -0,0 +1,75 @@
/*
* Timer0.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
/* Private function prototypes------------------------------------------------*/
static void Timer0_Init(void); //定时器0初始化
/* Public variables-----------------------------------------------------------*/
Timer0_t Timer0 =
{0, //通道1错误检测计时
0,//通道2错误检测计时
0, //数码管切换显示标志
0, //串口发送超时计数
0, //串口接收超时计数
0, //定时器中断计数
Timer0_Init};
/*
* @name Timer0_Init
* @brief 0
* @param None
* @retval None
*/
static void Timer0_Init() // //1毫秒@16MHz
{
TCON1 = 0x00; // Tx0定时器时钟为Fosc
TMOD = 0x00; // 16位重装载定时器/计数器
// // Tim0计算时间 = (65536 - 0xFACB) * (1 / (Fosc /Timer分频系数))
// // = 1333 / (16000000 / 12)
// // = 1 ms
// //定时1ms
// //反推初值 = 65536 - ((1/1000) / (1/(Fosc / Timer分频系数)))
// // = 65536 - ((1/1000) / (1/(16000000 / 12)))
// // = 65536 - 1333
// // = 0xFACB
TH0 = 0xFA;
TL0 = 0xCB; // T0定时时间1ms
IE |= 0x02; //打开T0中断
TCON |= 0x10; //使能T0
EA = 1; //打开总中断
}
/*
* @name Timer0_isr()
* @brief 0(1ms中断一次)
* @param None
* @retval None
*/
/***********定时器0中断函数***********/
void Timer0_isr() interrupt TIMER0_VECTOR
{
if (++Timer0.usMCU_Run_Timer >= TIMER0_1000mS)
{
Timer0.usMCU_Run_Timer = 0;
Timer0.TM1650_Flag = ~Timer0.TM1650_Flag;
Timer0.Error1_Timer++;
Timer0.Error2_Timer++;
}
Timer0.msDelay_Timer++; //串口接收超时计数
Timer0.ADC_Timer++;
}
/********************************************************
End Of File
********************************************************/

42
app/Timer0.h Normal file
View File

@ -0,0 +1,42 @@
/*
* Timer0.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __Timer0_H__
#define __Timer0_H__
//定义枚举类型
typedef enum
{
TIMER0_10mS = (uint16_t)10,
TIMER0_50mS = (uint16_t)50,
TIMER0_80mS = (uint16_t)80,
TIMER0_100mS = (uint16_t)100,
TIMER0_200mS = (uint16_t)200,
TIMER0_500mS = (uint16_t)500,
TIMER0_1000mS = (uint16_t)1000,
TIMER0_2000mS = (uint16_t)2000,
} TIMER0_Value_t;
//定义结构体类型
typedef struct
{
uint8_t volatile Error1_Timer; //系统错误监测计时
uint8_t volatile Error2_Timer; //系统错误监测计时
uint16_t volatile TM1650_Flag; //数码管切换显示标志
uint16_t volatile msDelay_Timer; // mS计时
uint16_t volatile ADC_Timer; // 采样计时
uint16_t volatile usMCU_Run_Timer; //计数
void (*Timer0_Init)(void); //定时器0初始化
} Timer0_t;
/* extern variables-----------------------------------------------------------*/
extern Timer0_t Timer0;
#endif
/********************************************************
End Of File
********************************************************/

62
app/Timer3.c Normal file
View File

@ -0,0 +1,62 @@
/*
* Timer2.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private function prototypes------------------------------------------------*/
static void Timer3_Init(void); //定时器0初始化
/* Public variables-----------------------------------------------------------*/
Timer3_t xdata Timer3 =
{
0, //定时器计数标志位
Timer3_Init};
/*
* @name Timer0_Init
* @brief 0
* @param None
* @retval None
*/
static void Timer3_Init() // 10毫秒@16.000MHz
{
T3CON = 0x20; // Timer3 使用时钟 Fosc/64 分频
TH3 = 0xF6;
TL3 = 0x3C;
ET3 = 1; //打开定时器3中断
EA = 1; //打开总中断
T3CON |= 0x04; //启动定时器3
}
/*
* @name Timer0_isr()
* @brief 3(10ms中断一次)
* @param None
* @retval None
*/
/***********定时器3中断函数***********/
void Timer3_isr() interrupt T3_VECTOR
{
if (++Timer3.mSDelay_Timer >= TIMER3_300mS) //数码管闪烁
{
Timer3.mSDelay_Timer = 0;
if (Public.Channel1_StatusFlag != FALSE)
{
PWM.PWM1_HeatingSetting(PID_Func.Realize(Temp1_CHANNEL, Public.Setting_Temp1));
}
if (Public.Channel2_StatusFlag != FALSE)
{
PWM.PWM2_HeatingSetting(PID_Func.Realize(Temp2_CHANNEL, Public.Setting_Temp2));
}
}
}
/********************************************************
End Of File
********************************************************/

39
app/Timer3.h Normal file
View File

@ -0,0 +1,39 @@
/*
* Timer2.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __Timer3_H__
#define __Timer3_H__
//定义枚举类型
typedef enum
{
TIMER3_10mS = (uint16_t)1,
TIMER3_50mS = (uint16_t)5,
TIMER3_100mS = (uint16_t)10,
TIMER3_200mS = (uint16_t)20,
TIMER3_300mS = (uint16_t)30,
TIMER3_500mS = (uint16_t)50,
TIMER3_1S = (uint16_t)100,
TIMER3_2S = (uint16_t)200,
} TIMER3_Value_t;
//定义结构体类型
typedef struct
{
uint16_t volatile mSDelay_Timer; //定时器计数位
void (*Timer3_Init)(void); //定时器0初始化
} Timer3_t;
/* extern variables-----------------------------------------------------------*/
extern Timer3_t xdata Timer3;
#endif
/********************************************************
End Of File
********************************************************/

47
app/UART.h Normal file
View File

@ -0,0 +1,47 @@
/*
* UART.h
*
* Created on: 20220312
* Author: User
*/
#ifndef __UART_H_
#define __UART_H_
#include <Public.h>
//定义异步串口结构体类型
typedef struct
{
uint8_t volatile ucTX_Busy_Flag; //发送忙碌标志
uint8_t volatile ucRec_Flag; //接收标志位
uint8_t volatile ucRec_Cnt; //接收计数
uint8_t* pucSend_Buffer; //发送缓存指针
uint8_t* pucRec_Buffer; //接收缓存指针
void (*UART_Init)(void); //串口初始化
void (*UART_SendData)(uint8_t); //串口发送字符
void (*UART_SendArray)(uint8_t*,uint16_t); //串口发送数组
void (*UART_SendString)(uint8_t*); //串口发送字符串
void (*Protocol_Analy)(void); //接口协议
} UART_t;
/* extern variables-----------------------------------------------------------*/
extern UART_t idata UART1;
/* extern function prototypes-------------------------------------------------*/
#endif
/********************************************************
End Of File
********************************************************/

195
app/UART1.c Normal file
View File

@ -0,0 +1,195 @@
/*
* UART1.c
*
* Created on: 20220312
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <Main.h>
//#include <Timer0.h>
/* Private define-------------------------------------------------------------*/
#define UART1_Send_LENGTH 10
#define UART1_Rec_LENGTH 10
/* Private variables----------------------------------------------------------*/
static uint8_t xdata ucSend_Buffer[UART1_Send_LENGTH] = {0x00};
static uint8_t xdata ucRec_Buffer[UART1_Rec_LENGTH] = {0x00};
/* Private function prototypes------------------------------------------------*/
static void Init(void); //串口初始化
static void SendData(uint8_t); //串口发送字符
static void SendArray(uint8_t *, uint16_t); //串口发送数组
static void SendString(uint8_t *); //串口发送字符串
static void Protocol_Analy(void); //串口协议
/* Public variables-----------------------------------------------------------*/
UART_t idata UART1 =
{
FALSE,
FALSE,
0,
ucSend_Buffer,
ucRec_Buffer,
Init,
SendData,
SendArray,
SendString,
Protocol_Analy};
/*
* @name Init
* @brief 1
* @param None
* @retval None
*/
static void Init() // 9600bps@16MHz
{
// P2M0 = P2M0 & 0xF0 | 0x20; // P20设置为上拉输入
// P0M2 = P0M2 & 0x0F | 0x80; // P05设置为推挽输出
TXD_MAP = 0x05; // TXD映射P05
RXD_MAP = 0x20; // RXD映射P20
BRTSEL = 0X00; // UART1的波特率:00 T4
T4CON = 0x06; // T4工作模式UART1波特率发生器
//波特率计算
//波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
// = 1/16 * ((16000000 / 1) / 104)
// = 9615.38(误差0.16%)
//波特率9600
//反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
// = (65536 - (16000000 * (1 / 16) / 9600))
// = (65536 - 104.167)
// = FF98
TH4 = 0xFF;
TL4 = 0x98; //波特率9600
SCON2 = 0x02; // 8位UART波特率可变
SCON = 0x10; //允许串行接收
IE |= 0X10; //使能串口中断
EA = 1; //使能总中断
}
/*
* @name SendData
* @brief
* @param dat:
* @retval None
*/
static void SendData(uint8_t dat)
{
while (UART1.ucTX_Busy_Flag)
; //等待前面的数据发送完
UART1.ucTX_Busy_Flag = TRUE; //置位忙碌标志
SBUF = dat; //写数据至UART寄存器
}
/*
* @name SendArray
* @brief
* @param p_Arr:LEN:
* @retval None
*/
static void SendArray(uint8_t *p_Arr, uint16_t LEN)
{
uint16_t i = 0;
for (i = 0; i < LEN; i++)
{
UART1.UART_SendData(*(p_Arr + i));
}
while (UART1.ucTX_Busy_Flag)
; //等待数据发送完
}
/*
* @name SendString
* @brief
* @param p_Str:
* @retval None
// */
static void SendString(uint8_t *p_Str)
{
while (*p_Str)
{
UART1.UART_SendData(*(p_Str++)); //发送当前字符
}
while (UART1.ucTX_Busy_Flag)
; //等待数据发送完
}
// putchar字符发送函数重定向
// extern char putchar(char c)
// {
// UART1.UART_SendData((uint8_t)c);
// return c;
// }
/*
* @name UART1_isr
* @brief 1
* @param None
* @retval None
*/
void UART1_isr() interrupt UART1_VECTOR
{
if (RI)
{
RI = (bit)0; //清除接收中断标志
if (UART1.ucRec_Cnt < UART1_Rec_LENGTH)
{
ucRec_Buffer[UART1.ucRec_Cnt++] = SBUF;
}
UART1.ucRec_Flag = TRUE;
}
if (TI)
{
TI = (bit)0; //清除发送中断标志
UART1.ucTX_Busy_Flag = FALSE; //清忙碌标志
}
}
/*
* @name Protocol_Analy
* @brief
* @param None
* @retval None
*/
static void Protocol_Analy(void)
{
if (UART1.ucRec_Flag == TRUE)
{
//过滤无用的数据
if (ucRec_Buffer[0] != 0)
{
Timer0.msDelay_Timer = 0;
while (UART1.ucRec_Cnt < Protocol_Len)
{
if (Timer0.msDelay_Timer >= TIMER0_100mS) // 100ms没有接收完 跳出循环
break;
}
// 协议解析
Protocol.Analysis(&UART1); //串口协议处理
}
//清除缓存
Public.Memory_Clr(ucRec_Buffer, (uint16_t)UART1.ucRec_Cnt);
//重新接收
UART1.ucRec_Cnt = 0; //接收计数清零
UART1.ucRec_Flag = FALSE; //接收标志位取消
}
}
/********************************************************
End Of File
********************************************************/