交给生产

This commit is contained in:
徐青宇 2023-03-23 17:00:05 +08:00
commit 21bc991c48
65 changed files with 13214 additions and 0 deletions

39
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -0,0 +1,39 @@
{
"configurations": [
{
"name": "Target 1",
"includePath": [
"e:\\my code all\\stc\\Motorcontroller\\myinc",
"D:\\Keil_v5\\C51\\INC",
"e:\\my code all\\stc\\Motorcontroller",
"e:\\my code all\\stc\\Motorcontroller\\mycode"
],
"defines": [
"__C51__",
"__VSCODE_C51__",
"reentrant=",
"compact=",
"small=",
"large=",
"data=",
"idata=",
"pdata=",
"bdata=",
"xdata=",
"code=",
"bit=char",
"sbit=char",
"sfr=char",
"sfr16=int",
"sfr32=int",
"interrupt=",
"using=",
"_at_=",
"_priority_=",
"_task_="
],
"intelliSenseMode": "${default}"
}
],
"version": 4
}

34
.vscode/keil-assistant.log vendored Normal file
View File

@ -0,0 +1,34 @@
[info] Log at : 2023/3/14|08:48:46|GMT+0800
[info] Log at : 2023/3/14|09:21:10|GMT+0800
[info] Log at : 2023/3/14|09:32:32|GMT+0800
[info] Log at : 2023/3/14|11:05:08|GMT+0800
[info] Log at : 2023/3/14|11:30:16|GMT+0800
[info] Log at : 2023/3/14|13:14:03|GMT+0800
[info] Log at : 2023/3/15|08:27:33|GMT+0800
[info] Log at : 2023/3/16|14:53:18|GMT+0800
[info] Log at : 2023/3/17|08:42:14|GMT+0800
[info] Log at : 2023/3/17|10:35:48|GMT+0800
[info] Log at : 2023/3/17|16:54:22|GMT+0800
[info] Log at : 2023/3/18|08:31:18|GMT+0800
[info] Log at : 2023/3/20|08:28:25|GMT+0800
[info] Log at : 2023/3/21|08:29:01|GMT+0800
[info] Log at : 2023/3/22|08:33:44|GMT+0800
[info] Log at : 2023/3/22|16:38:07|GMT+0800
[info] Log at : 2023/3/23|08:37:05|GMT+0800

15
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
"files.associations": {
"UART.C": "cpp",
"gpio.h": "c",
"TM5160.C": "cpp",
"i2c.h": "c",
"timer.h": "c",
"tm1650.h": "c",
"delay.h": "c",
"config.h": "c",
"common.h": "c",
"eeprom.h": "c",
"stdio.h": "c"
}
}

14
.vscode/uv4.log vendored Normal file
View File

@ -0,0 +1,14 @@
Build target 'Target 1'
compiling timer.c...
compiling common.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_PRINTSTRING1?UART
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_TM1650_PRINT_SMG3?TM1650
Program Size: data=100.1 xdata=64 code=8087
creating hex file from ".\Objects\Motorcontroller"...
".\Objects\Motorcontroller" - 0 Error(s), 2 Warning(s).
Build Time Elapsed: 00:00:00

1
.vscode/uv4.log.lock vendored Normal file
View File

@ -0,0 +1 @@
2023/3/23 16:31:25

155
Listings/EEPROM.lst Normal file
View File

@ -0,0 +1,155 @@
C51 COMPILER V9.60.0.0 EEPROM 03/23/2023 13:25:30 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN .\Objects\EEPROM.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\EEPROM.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXT
-END PRINT(.\Listings\EEPROM.lst) TABS(2) OBJECT(.\Objects\EEPROM.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 /*************** 功能说明 ****************
14
15 本文件为STC8系列的内置EEPROM读写程序,用户几乎可以不修改这个程序.
16
17 ******************************************/
18
19 #include "config.h"
20 #include "eeprom.h"
21
22 //========================================================================
23 // 函数: void ISP_Disable(void)
24 // 描述: 禁止访问ISP/IAP.
25 // 参数: non.
26 // 返回: non.
27 // 版本: V1.0, 2012-10-22
28 //========================================================================
29 void DisableEEPROM(void)
30 {
31 1 IAP_CONTR = 0; //禁止IAP操作
32 1 IAP_CMD = 0; //去除IAP命令
33 1 IAP_TRIG = 0; //防止IAP命令误触发
34 1 IAP_ADDRH = 0xff; //清0地址高字节
35 1 IAP_ADDRL = 0xff; //清0地址低字节指向非EEPROM区防止误操作
36 1 }
37
38 //========================================================================
39 // 函数: void EEPROM_Trig(void)
40 // 描述: 触发EEPROM操作.
41 // 参数: none.
42 // 返回: none.
43 // 版本: V1.0, 2014-6-30
44 //========================================================================
45 void EEPROM_Trig(void)
46 {
47 1 F0 = EA; //保存全局中断
48 1 EA = 0; //禁止中断, 避免触发命令无效
49 1 IAP_TRIG = 0x5A;
50 1 IAP_TRIG = 0xA5; //先送5AH再送A5H到IAP触发寄存器每次都需要如此
51 1 //送完A5H后IAP命令立即被触发启动
52 1 //CPU等待IAP完成后才会继续执行程序。
53 1 _nop_();
54 1 _nop_();
C51 COMPILER V9.60.0.0 EEPROM 03/23/2023 13:25:30 PAGE 2
55 1 EA = F0; //恢复全局中断
56 1 }
57
58 //========================================================================
59 // 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
60 // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
61 // 参数: EE_address: 读出EEPROM的首地址.
62 // DataAddress: 读出数据放缓冲的首地址.
63 // number: 读出的字节长度.
64 // 返回: non.
65 // 版本: V1.0, 2012-10-22
66 //========================================================================
67 void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
68 {
69 1 IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
70 1 IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
71 1 do
72 1 {
73 2 IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
74 2 IAP_ADDRL = EE_address % 256; //送地址低字节
75 2 EEPROM_Trig(); //触发EEPROM操作
76 2 *DataAddress = IAP_DATA; //读出的数据送往
77 2 EE_address++;
78 2 DataAddress++;
79 2 }while(--number);
80 1
81 1 DisableEEPROM();
82 1 }
83
84 //========================================================================
85 // 函数: void EEPROM_SectorErase(u16 EE_address)
86 // 描述: 把指定地址的EEPROM扇区擦除.
87 // 参数: EE_address: 要擦除的扇区EEPROM的地址.
88 // 返回: non.
89 // 版本: V1.0, 2013-5-10
90 //========================================================================
91 void EEPROM_SectorErase(u16 EE_address)
92 {
93 1 IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
94 1 IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
95 1 //只有扇区擦除没有字节擦除512字节/扇区。
96 1 //扇区中任意一个字节地址都是扇区地址。
97 1 IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
98 1 IAP_ADDRL = EE_address % 256; //送扇区地址低字节
99 1 EEPROM_Trig(); //触发EEPROM操作
100 1 DisableEEPROM(); //禁止EEPROM操作
101 1 }
102
103 //========================================================================
104 // 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
105 // 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
106 // 参数: EE_address: 写入EEPROM的首地址.
107 // DataAddress: 写入源数据的缓冲的首地址.
108 // number: 写入的字节长度.
109 // 返回: non.
110 // 版本: V1.0, 2012-10-22
111 //========================================================================
112 void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
113 {
114 1 IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
115 1 IAP_WRITE(); //宏调用, 送字节写命令
116 1 do
C51 COMPILER V9.60.0.0 EEPROM 03/23/2023 13:25:30 PAGE 3
117 1 {
118 2 IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
119 2 IAP_ADDRL = EE_address % 256; //送地址低字节
120 2 IAP_DATA = *DataAddress; //送数据到IAP_DATA只有数据改变时才需重新送
121 2 EEPROM_Trig(); //触发EEPROM操作
122 2 EE_address++; //下一个地址
123 2 DataAddress++; //下一个数据
124 2 }while(--number); //直到结束
125 1 DisableEEPROM();
126 1 }
127
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 162 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

179
Listings/GPIO.lst Normal file
View File

@ -0,0 +1,179 @@
C51 COMPILER V9.60.0.0 GPIO 03/23/2023 13:25:30 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE GPIO
OBJECT MODULE PLACED IN .\Objects\GPIO.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\GPIO.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEN
-D PRINT(.\Listings\GPIO.lst) TABS(2) OBJECT(.\Objects\GPIO.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 /*************** 功能说明 ****************
14
15 本文件为STC8系列的端口初始化程序,用户几乎可以不修改这个程序.
16
17 ******************************************/
18
19 #include "GPIO.h"
20 //========================================================================
21 // 函数: u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
22 // 描述: 初始化IO口.
23 // 参数: GPIOx: 结构参数,请参考timer.h里的定义.
24 // 返回: 成功返回0, 空操作返回1,错误返回2.
25 // 版本: V1.0, 2012-10-22
26 //========================================================================
27 u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
28 {
29 1 if (GPIO > GPIO_P7)
30 1 return 1; // 空操作
31 1 if (GPIOx->Mode > GPIO_OUT_PP)
32 1 return 2; // 错误
33 1 if (GPIO == GPIO_P0)
34 1 {
35 2 if (GPIOx->Mode == GPIO_PullUp)
36 2 P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin; // 上拉准双向口
37 2 if (GPIOx->Mode == GPIO_HighZ)
38 2 P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin; // 浮空输入
39 2 if (GPIOx->Mode == GPIO_OUT_OD)
40 2 P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin; // 开漏输出
41 2 if (GPIOx->Mode == GPIO_OUT_PP)
42 2 P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin; // 推挽输出
43 2 }
44 1 if (GPIO == GPIO_P1)
45 1 {
46 2 if (GPIOx->Mode == GPIO_PullUp)
47 2 P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin; // 上拉准双向口
48 2 if (GPIOx->Mode == GPIO_HighZ)
49 2 P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin; // 浮空输入
50 2 if (GPIOx->Mode == GPIO_OUT_OD)
51 2 P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin; // 开漏输出
52 2 if (GPIOx->Mode == GPIO_OUT_PP)
53 2 P1M1 &= ~GPIOx->Pin, P1M0 |= GPIOx->Pin; // 推挽输出
54 2 }
C51 COMPILER V9.60.0.0 GPIO 03/23/2023 13:25:30 PAGE 2
55 1 if (GPIO == GPIO_P2)
56 1 {
57 2 if (GPIOx->Mode == GPIO_PullUp)
58 2 P2M1 &= ~GPIOx->Pin, P2M0 &= ~GPIOx->Pin; // 上拉准双向口
59 2 if (GPIOx->Mode == GPIO_HighZ)
60 2 P2M1 |= GPIOx->Pin, P2M0 &= ~GPIOx->Pin; // 浮空输入
61 2 if (GPIOx->Mode == GPIO_OUT_OD)
62 2 P2M1 |= GPIOx->Pin, P2M0 |= GPIOx->Pin; // 开漏输出
63 2 if (GPIOx->Mode == GPIO_OUT_PP)
64 2 P2M1 &= ~GPIOx->Pin, P2M0 |= GPIOx->Pin; // 推挽输出
65 2 }
66 1 if (GPIO == GPIO_P3)
67 1 {
68 2 if (GPIOx->Mode == GPIO_PullUp)
69 2 P3M1 &= ~GPIOx->Pin, P3M0 &= ~GPIOx->Pin; // 上拉准双向口
70 2 if (GPIOx->Mode == GPIO_HighZ)
71 2 P3M1 |= GPIOx->Pin, P3M0 &= ~GPIOx->Pin; // 浮空输入
72 2 if (GPIOx->Mode == GPIO_OUT_OD)
73 2 P3M1 |= GPIOx->Pin, P3M0 |= GPIOx->Pin; // 开漏输出
74 2 if (GPIOx->Mode == GPIO_OUT_PP)
75 2 P3M1 &= ~GPIOx->Pin, P3M0 |= GPIOx->Pin; // 推挽输出
76 2 }
77 1 if (GPIO == GPIO_P4)
78 1 {
79 2 if (GPIOx->Mode == GPIO_PullUp)
80 2 P4M1 &= ~GPIOx->Pin, P4M0 &= ~GPIOx->Pin; // 上拉准双向口
81 2 if (GPIOx->Mode == GPIO_HighZ)
82 2 P4M1 |= GPIOx->Pin, P4M0 &= ~GPIOx->Pin; // 浮空输入
83 2 if (GPIOx->Mode == GPIO_OUT_OD)
84 2 P4M1 |= GPIOx->Pin, P4M0 |= GPIOx->Pin; // 开漏输出
85 2 if (GPIOx->Mode == GPIO_OUT_PP)
86 2 P4M1 &= ~GPIOx->Pin, P4M0 |= GPIOx->Pin; // 推挽输出
87 2 }
88 1 if (GPIO == GPIO_P5)
89 1 {
90 2 if (GPIOx->Mode == GPIO_PullUp)
91 2 P5M1 &= ~GPIOx->Pin, P5M0 &= ~GPIOx->Pin; // 上拉准双向口
92 2 if (GPIOx->Mode == GPIO_HighZ)
93 2 P5M1 |= GPIOx->Pin, P5M0 &= ~GPIOx->Pin; // 浮空输入
94 2 if (GPIOx->Mode == GPIO_OUT_OD)
95 2 P5M1 |= GPIOx->Pin, P5M0 |= GPIOx->Pin; // 开漏输出
96 2 if (GPIOx->Mode == GPIO_OUT_PP)
97 2 P5M1 &= ~GPIOx->Pin, P5M0 |= GPIOx->Pin; // 推挽输出
98 2 }
99 1 if (GPIO == GPIO_P6)
100 1 {
101 2 if (GPIOx->Mode == GPIO_PullUp)
102 2 P6M1 &= ~GPIOx->Pin, P6M0 &= ~GPIOx->Pin; // 上拉准双向口
103 2 if (GPIOx->Mode == GPIO_HighZ)
104 2 P6M1 |= GPIOx->Pin, P6M0 &= ~GPIOx->Pin; // 浮空输入
105 2 if (GPIOx->Mode == GPIO_OUT_OD)
106 2 P6M1 |= GPIOx->Pin, P6M0 |= GPIOx->Pin; // 开漏输出
107 2 if (GPIOx->Mode == GPIO_OUT_PP)
108 2 P6M1 &= ~GPIOx->Pin, P6M0 |= GPIOx->Pin; // 推挽输出
109 2 }
110 1 if (GPIO == GPIO_P7)
111 1 {
112 2 if (GPIOx->Mode == GPIO_PullUp)
113 2 P7M1 &= ~GPIOx->Pin, P7M0 &= ~GPIOx->Pin; // 上拉准双向口
114 2 if (GPIOx->Mode == GPIO_HighZ)
115 2 P7M1 |= GPIOx->Pin, P7M0 &= ~GPIOx->Pin; // 浮空输入
116 2 if (GPIOx->Mode == GPIO_OUT_OD)
C51 COMPILER V9.60.0.0 GPIO 03/23/2023 13:25:30 PAGE 3
117 2 P7M1 |= GPIOx->Pin, P7M0 |= GPIOx->Pin; // 开漏输出
118 2 if (GPIOx->Mode == GPIO_OUT_PP)
119 2 P7M1 &= ~GPIOx->Pin, P7M0 |= GPIOx->Pin; // 推挽输出
120 2 }
121 1 return 0; // 成功
122 1 }
123 /******************** IO口配置 ********************/
124 void GPIO_config(void)
125 {
126 1 GPIO_InitTypeDef GPIO_InitStructure; // 结构定义
127 1
128 1 GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 指定要初始
-化 或操作p32
129 1 GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输
-入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
130 1 GPIO_Inilize(GPIO_P3, &GPIO_InitStructure); // 初始化
131 1
132 1 GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; // 指定要初始化 或操作输出使能
133 1 GPIO_InitStructure.Mode = GPIO_OUT_PP; // 指定IO的输入或输出方式,GPIO_PullUp,G
-PIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
134 1 GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
135 1
136 1 GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 指定要初始化 或操作输出
-使能
137 1 GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输入或输出方式,
-GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
138 1 GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
139 1
140 1 GPIO_InitStructure.Pin = GPIO_Pin_4; // 指定要初始化 或操作输出使能
141 1 GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_
-OD,GPIO_OUT_PP
142 1 GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); // 初始化
143 1 EN=1;
144 1 }
145
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 683 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

288
Listings/I2C.lst Normal file
View File

@ -0,0 +1,288 @@
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\Objects\I2C.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\I2C.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND
- PRINT(.\Listings\I2C.lst) TABS(2) OBJECT(.\Objects\I2C.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 #include "I2C.h"
14
15 u8 I2C_BUF_type I2C_RxBuffer[I2C_BUF_LENTH];
16
17 #define SLAW 0xA2
18 #define SLAR 0xA3
19
20 //========================================================================
21 // 函数: void I2C_Init(I2C_InitTypeDef *I2Cx)
22 // 描述: I2C初始化程序.
23 // 参数: I2Cx: 结构参数,请参考I2C.h里的定义.
24 // 返回: none.
25 // 版本: V1.0, 2012-11-22
26 //========================================================================
27 void I2C_Init(I2C_InitTypeDef *I2Cx)
28 {
29 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
30 1
31 1 if(I2Cx->I2C_Mode == I2C_Mode_Master)
32 1 {
33 2 I2C_Master(); //设为主机
34 2 I2CMSST = 0x00; //清除I2C主机状态寄存器
35 2 I2C_Master_Inturrupt(I2Cx->I2C_MS_Interrupt);
36 2 I2C_SetSpeed(I2Cx->I2C_Speed);
37 2 if(I2Cx->I2C_MS_WDTA == ENABLE) I2C_WDTA_EN(); //使能自动发送
38 2 else I2C_WDTA_DIS(); //禁止自动发送
39 2 }
40 1 else
41 1 {
42 2 I2C_Slave(); //设为从机
43 2 I2CSLST = 0x00; //清除I2C从机状态寄存器
44 2 if(I2Cx->I2C_SL_ESTAI == ENABLE) I2C_ESTAI_EN(); //使能从机接收START信号中断
45 2 else I2C_ESTAI_DIS(); //禁止从机接收START信号中断
46 2 if(I2Cx->I2C_SL_ERXI == ENABLE) I2C_ERXI_EN(); //使能从机接收1字节数据中断
47 2 else I2C_ERXI_DIS(); //禁止从机接收1字节数据中断
48 2 if(I2Cx->I2C_SL_ETXI == ENABLE) I2C_ETXI_EN(); //使能从机发送1字节数据中断
49 2 else I2C_ETXI_DIS(); //禁止从机发送1字节数据中断
50 2 if(I2Cx->I2C_SL_ESTOI == ENABLE) I2C_ESTOI_EN(); //使能从机接收STOP信号中断
51 2 else I2C_ESTOI_DIS(); //禁止从机接收STOP信号中断
52 2 I2C_Address(I2Cx->I2C_SL_ADR);
53 2 if(I2Cx->I2C_SL_MA == ENABLE) I2C_MATCH_EN(); //从机地址比较功能,只接受相匹配地址
54 2 else I2C_MATCH_DIS(); //禁止从机地址比较功能,接受所有设备地址
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 2
55 2 }
56 1
57 1 P_SW2 = (P_SW2 & ~(3<<4)) | I2Cx->I2C_IoUse;
58 1 I2C_Function(I2Cx->I2C_Enable);
59 1
60 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
61 1 }
62
63 //========================================================================
64 // 函数: void Wait (void)
65 // 描述: 等待主机模式I2C控制器执行完成I2CMSCR.
66 // 参数: mode: 指定模式, 取值 I2C_Mode_Master 或 I2C_Mode_Slave.
67 // 返回: none.
68 // 版本: V1.0, 2012-11-22
69 //========================================================================
70 void Wait()
71 {
72 1 while (!(I2CMSST & 0x40));
73 1 I2CMSST &= ~0x40;
74 1 }
75
76 //========================================================================
77 // 函数: void Start (void)
78 // 描述: I2C总线起始函数.
79 // 参数: none.
80 // 返回: none.
81 // 版本: V1.0, 2020-09-15
82 //========================================================================
83 void Start()
84 {
85 1 I2CMSCR = 0x01; //发送START命令
86 1 Wait();
87 1 }
88
89 //========================================================================
90 // 函数: void SendData (char dat)
91 // 描述: I2C发送一个字节数据函数.
92 // 参数: 发送的数据.
93 // 返回: none.
94 // 版本: V1.0, 2020-09-15
95 //========================================================================
96 void SendData(char dat)
97 {
98 1 I2CTXD = dat; //写数据到数据缓冲区
99 1 I2CMSCR = 0x02; //发送SEND命令
100 1 Wait();
101 1 }
102
103 //========================================================================
104 // 函数: void RecvACK (void)
105 // 描述: I2C获取ACK函数.
106 // 参数: none.
107 // 返回: none.
108 // 版本: V1.0, 2020-09-15
109 //========================================================================
110 void RecvACK()
111 {
112 1 I2CMSCR = 0x03; //发送读ACK命令
113 1 Wait();
114 1 }
115
116 //========================================================================
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 3
117 // 函数: char RecvData (void)
118 // 描述: I2C读取一个字节数据函数.
119 // 参数: none.
120 // 返回: 读取数据.
121 // 版本: V1.0, 2020-09-15
122 //========================================================================
123 char RecvData()
124 {
125 1 I2CMSCR = 0x04; //发送RECV命令
126 1 Wait();
127 1 return I2CRXD;
128 1 }
129
130 //========================================================================
131 // 函数: void SendACK (void)
132 // 描述: I2C发送ACK函数.
133 // 参数: none.
134 // 返回: none.
135 // 版本: V1.0, 2020-09-15
136 //========================================================================
137 void SendACK()
138 {
139 1 I2CMSST = 0x00; //设置ACK信号
140 1 I2CMSCR = 0x05; //发送ACK命令
141 1 Wait();
142 1 }
143
144 //========================================================================
145 // 函数: void SendNAK (void)
146 // 描述: I2C发送NAK函数.
147 // 参数: none.
148 // 返回: none.
149 // 版本: V1.0, 2020-09-15
150 //========================================================================
151 void SendNAK()
152 {
153 1 I2CMSST = 0x01; //设置NAK信号
154 1 I2CMSCR = 0x05; //发送ACK命令
155 1 Wait();
156 1 }
157
158 //========================================================================
159 // 函数: void Stop (void)
160 // 描述: I2C总线停止函数.
161 // 参数: none.
162 // 返回: none.
163 // 版本: V1.0, 2020-09-15
164 //========================================================================
165 void Stop()
166 {
167 1 I2CMSCR = 0x06; //发送STOP命令
168 1 Wait();
169 1 }
170
171 //========================================================================
172 // 函数: void WriteNbyte(u8 addr, u8 *p, u8 number)
173 // 描述: I2C写入数据函数.
174 // 参数: addr: 指定地址, *p写入数据存储位置, number写入数据个数.
175 // 返回: none.
176 // 版本: V1.0, 2020-09-15
177 //========================================================================
178 void WriteNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 4
179 {
180 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
181 1 Start(); //发送起始命令
182 1 SendData(SLAW); //发送设备地址+写命令
183 1 RecvACK();
184 1 SendData(addr); //发送存储地址
185 1 RecvACK();
186 1 do
187 1 {
188 2 SendData(*p++);
189 2 RecvACK();
190 2 }
191 1 while(--number);
192 1 Stop(); //发送停止命令
193 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
194 1 }
195
196 //========================================================================
197 // 函数: void ReadNbyte(u8 addr, u8 *p, u8 number)
198 // 描述: I2C读取数据函数.
199 // 参数: addr: 指定地址, *p读取数据存储位置, number读取数据个数.
200 // 返回: none.
201 // 版本: V1.0, 2020-09-15
202 //========================================================================
203 void ReadNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */
204 {
205 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
206 1 Start(); //发送起始命令
207 1 SendData(SLAW); //发送设备地址+写命令
208 1 RecvACK();
209 1 SendData(addr); //发送存储地址
210 1 RecvACK();
211 1 Start(); //发送起始命令
212 1 SendData(SLAR); //发送设备地址+读命令
213 1 RecvACK();
214 1 do
215 1 {
216 2 *p = RecvData();
217 2 p++;
218 2 if(number != 1) SendACK(); //send ACK
219 2 }
220 1 while(--number);
221 1 SendNAK(); //send no ACK
222 1 Stop(); //发送停止命令
223 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
224 1 }
225
226 //========================================================================
227 // 函数: void I2C_Isr (void) interrupt I2C_VECTOR
228 // 描述: I2C中断函数.
229 // 参数: none.
230 // 返回: none.
231 // 版本: V1.0, 2020-09-15
232 //========================================================================
233 void I2C_Isr() interrupt I2C_VECTOR
234 {
235 1 char store;
236 1
237 1 store = P_SW2;
238 1 P_SW2 |= 0x80;
239 1
240 1 //Add user code here.
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 5
241 1
242 1 P_SW2 = store;
243 1 }
244 /**************** I2C初始化函数 *****************/
245 void I2C_config(void)
246 {
247 1 I2C_InitTypeDef I2C_InitStructure;
248 1 I2C_InitStructure.I2C_Mode = I2C_Mode_Master; //主从选择 I2C_Mode_Master, I2C_Mode_Slave
249 1 I2C_InitStructure.I2C_Enable = ENABLE; //I2C功能使能, ENABLE, DISABLE
250 1 I2C_InitStructure.I2C_MS_WDTA = DISABLE; //主机使能自动发送, ENABLE, DISABLE
251 1 I2C_InitStructure.I2C_MS_Interrupt = DISABLE; //使能主机模式中断, ENABLE, DISABLE
252 1 I2C_InitStructure.I2C_Speed = 16; //总线速度=Fosc/2/(Speed*2+4), 0~63
253 1 I2C_InitStructure.I2C_IoUse = I2C_P14_P15; //IO口切换 I2C_P14_P15, I2C_P24_P25, I2C_P33_P32
254 1
255 1 I2C_Init(&I2C_InitStructure);
256 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 516 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 128 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 22
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

1988
Listings/Motorcontroller.m51 Normal file

File diff suppressed because it is too large Load Diff

204
Listings/PWM.lst Normal file
View File

@ -0,0 +1,204 @@
C51 COMPILER V9.60.0.0 PWM 03/13/2023 17:49:47 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE PWM
OBJECT MODULE PLACED IN .\Objects\PWM.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\PWM.C OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND
- PRINT(.\Listings\PWM.lst) TABS(2) OBJECT(.\Objects\PWM.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 #include "PWM.h"
14 PWMx_Duty PWMA_Duty;
15 u8 PWM_Configuration(u8 PWM, PWMx_InitDefine *PWMx)
16 {
17 1 if(PWM == PWMA)
18 1 {
19 2 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
20 2
21 2 if(PWMx->PWM1_SetPriority <= Priority_3) PWM1_Priority(PWMx->PWM1_SetPriority); //指定中断优先级(低到高)
- Priority_0,Priority_1,Priority_2,Priority_3
22 2 if(PWMx->PWM2_SetPriority <= Priority_3) PWM2_Priority(PWMx->PWM2_SetPriority); //指定中断优先级(低到高)
- Priority_0,Priority_1,Priority_2,Priority_3
23 2 if(PWMx->PWM3_SetPriority <= Priority_3) PWM3_Priority(PWMx->PWM3_SetPriority); //指定中断优先级(低到高)
- Priority_0,Priority_1,Priority_2,Priority_3
24 2 if(PWMx->PWM4_SetPriority <= Priority_3) PWM4_Priority(PWMx->PWM4_SetPriority); //指定中断优先级(低到高)
- Priority_0,Priority_1,Priority_2,Priority_3
25 2
26 2 PWMA_CCER1_Disable(); //关闭所有输入捕获/比较输出
27 2 PWMA_CCER2_Disable(); //关闭所有输入捕获/比较输出
28 2 PWMA_OC1ModeSet(PWMx->PWM1_Mode); //设置输出比较模式
29 2 PWMA_OC2ModeSet(PWMx->PWM2_Mode); //设置输出比较模式
30 2 PWMA_OC3ModeSet(PWMx->PWM3_Mode); //设置输出比较模式
31 2 PWMA_OC4ModeSet(PWMx->PWM4_Mode); //设置输出比较模式
32 2 if(PWMx->PWM_Reload == ENABLE) PWMA_OC1_ReloadEnable(); //输出比较的预装载使能
33 2 else PWMA_OC1_RelosdDisable(); //禁止输出比较的预装载
34 2 if(PWMx->PWM_Fast == ENABLE) PWMA_OC1_FastEnable(); //输出比较快速功能使能
35 2 else PWMA_OC1_FastDisable(); //禁止输出比较快速功能
36 2
37 2 if(PWMx->PWM_CC1Enable == ENABLE) PWMA_CC1E_Enable(); //开启输入捕获/比较输出
38 2 else PWMA_CC1E_Disable(); //关闭输入捕获/比较输出
39 2 if(PWMx->PWM_CC1NEnable == ENABLE) PWMA_CC1NE_Enable(); //开启输入捕获/比较输出
40 2 else PWMA_CC1NE_Disable(); //关闭输入捕获/比较输出
41 2 if(PWMx->PWM_CC2Enable == ENABLE) PWMA_CC2E_Enable(); //开启输入捕获/比较输出
42 2 else PWMA_CC2E_Disable(); //关闭输入捕获/比较输出
43 2 if(PWMx->PWM_CC2NEnable == ENABLE) PWMA_CC2NE_Enable(); //开启输入捕获/比较输出
44 2 else PWMA_CC2NE_Disable(); //关闭输入捕获/比较输出
45 2 if(PWMx->PWM_CC3Enable == ENABLE) PWMA_CC3E_Enable(); //开启输入捕获/比较输出
46 2 else PWMA_CC3E_Disable(); //关闭输入捕获/比较输出
47 2 if(PWMx->PWM_CC3NEnable == ENABLE) PWMA_CC3NE_Enable(); //开启输入捕获/比较输出
48 2 else PWMA_CC3NE_Disable(); //关闭输入捕获/比较输出
49 2 if(PWMx->PWM_CC4Enable == ENABLE) PWMA_CC4E_Enable(); //开启输入捕获/比较输出
50 2 else PWMA_CC4E_Disable(); //关闭输入捕获/比较输出
C51 COMPILER V9.60.0.0 PWM 03/13/2023 17:49:47 PAGE 2
51 2 if(PWMx->PWM_CC4NEnable == ENABLE) PWMA_CC4NE_Enable(); //开启输入捕获/比较输出
52 2 else PWMA_CC4NE_Disable(); //关闭输入捕获/比较输出
53 2
54 2 PWMA_AutoReload(PWMx->PWM_Period);
55 2 PWMA_Duty1(PWMx->PWM1_Duty);
56 2 PWMA_Duty2(PWMx->PWM2_Duty);
57 2 PWMA_Duty3(PWMx->PWM3_Duty);
58 2 PWMA_Duty4(PWMx->PWM4_Duty);
59 2
60 2 PWMA_CCPCAPreloaded(PWMx->PWM_PreLoad); //捕获/比较预装载控制位(该位只对具有互补输出的通道起作用)
61 2 PWMA_PS = PWMx->PWM_PS_SW; //切换IO
62 2 PWMA_ENO = PWMx->PWM_EnoSelect; //输出通道选择
63 2 PWMA_DeadTime(PWMx->PWM_DeadTime); //死区发生器设置
64 2
65 2 if(PWMx->PWM_BrakeEnable == ENABLE) PWMA_BrakeEnable(); //开启刹车输入
66 2 else PWMA_BrakeDisable(); //禁止刹车输入
67 2 if(PWMx->PWM_MainOutEnable == ENABLE) PWMA_BrakeOutputEnable(); //主输出使能
68 2 else PWMA_BrakeOutputDisable(); //主输出禁止
69 2 if(PWMx->PWM_CEN_Enable == ENABLE) PWMA_CEN_Enable(); //使能计数器
70 2 else PWMA_CEN_Disable(); //禁止计数器
71 2
72 2 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
73 2 return 0;
74 2 }
75 1
76 1 if(PWM == PWMB)
77 1 {
78 2 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
79 2
80 2 if(PWMx->PWM5_SetPriority <= Priority_3) PWM5_Priority(PWMx->PWM5_SetPriority); //指定中断优先级(低到高)
- Priority_0,Priority_1,Priority_2,Priority_3
81 2
82 2 PWMB_CCER1_Disable(); //关闭所有输入捕获/比较输出
83 2 PWMB_CCER2_Disable(); //关闭所有输入捕获/比较输出
84 2 PWMB_OC5ModeSet(PWMx->PWM5_Mode); //设置输出比较模式
85 2 PWMB_OC6ModeSet(PWMx->PWM6_Mode); //设置输出比较模式
86 2 PWMB_OC7ModeSet(PWMx->PWM7_Mode); //设置输出比较模式
87 2 PWMB_OC8ModeSet(PWMx->PWM8_Mode); //设置输出比较模式
88 2 if(PWMx->PWM_Reload == ENABLE) PWMB_OC5_ReloadEnable(); //输出比较的预装载使能
89 2 else PWMB_OC5_RelosdDisable(); //禁止输出比较的预装载
90 2 if(PWMx->PWM_Fast == ENABLE) PWMB_OC5_FastEnable(); //输出比较快速功能使能
91 2 else PWMB_OC5_FastDisable(); //禁止输出比较快速功能
92 2
93 2 if(PWMx->PWM_CC5Enable == ENABLE) PWMB_CC5E_Enable(); //开启输入捕获/比较输出
94 2 else PWMB_CC5E_Disable(); //关闭输入捕获/比较输出
95 2 if(PWMx->PWM_CC6Enable == ENABLE) PWMB_CC6E_Enable(); //开启输入捕获/比较输出
96 2 else PWMB_CC6E_Disable(); //关闭输入捕获/比较输出
97 2 if(PWMx->PWM_CC7Enable == ENABLE) PWMB_CC7E_Enable(); //开启输入捕获/比较输出
98 2 else PWMB_CC7E_Disable(); //关闭输入捕获/比较输出
99 2 if(PWMx->PWM_CC8Enable == ENABLE) PWMB_CC8E_Enable(); //开启输入捕获/比较输出
100 2 else PWMB_CC8E_Disable(); //关闭输入捕获/比较输出
101 2
102 2 PWMB_AutoReload(PWMx->PWM_Period);
103 2 PWMB_Duty5(PWMx->PWM5_Duty);
104 2 PWMB_Duty6(PWMx->PWM6_Duty);
105 2 PWMB_Duty7(PWMx->PWM7_Duty);
106 2 PWMB_Duty8(PWMx->PWM8_Duty);
107 2
108 2 PWMB_CCPCBPreloaded(PWMx->PWM_PreLoad); //捕获/比较预装载控制位(该位只对具有互补输出的通道起作用)
109 2 PWMB_PS = PWMx->PWM_PS_SW; //切换IO
110 2 PWMB_ENO = PWMx->PWM_EnoSelect; //输出通道选择
111 2 PWMB_DeadTime(PWMx->PWM_DeadTime); //死区发生器设置
C51 COMPILER V9.60.0.0 PWM 03/13/2023 17:49:47 PAGE 3
112 2
113 2 if(PWMx->PWM_BrakeEnable == ENABLE) PWMB_BrakeEnable(); //开启刹车输入
114 2 else PWMB_BrakeDisable(); //禁止刹车输入
115 2 if(PWMx->PWM_MainOutEnable == ENABLE) PWMB_BrakeOutputEnable(); //主输出使能
116 2 else PWMB_BrakeOutputDisable(); //主输出禁止
117 2 if(PWMx->PWM_CEN_Enable == ENABLE) PWMB_CEN_Enable(); //使能计数器
118 2 else PWMB_CEN_Disable(); //禁止计数器
119 2
120 2 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
121 2 return 0;
122 2 }
123 1
124 1 return 2; //错误
125 1 }
126
127 /*********************************************************/
128
129 /******************* PWM 占空比设置函数 *******************/
130 void UpdatePwm(u8 PWM, PWMx_Duty *PWMx)
131 {
132 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
133 1
134 1 if(PWM == PWMA)
135 1 {
136 2 PWMA_Duty1(PWMx->PWM1_Duty);
137 2 PWMA_Duty2(PWMx->PWM2_Duty);
138 2 PWMA_Duty3(PWMx->PWM3_Duty);
139 2 PWMA_Duty4(PWMx->PWM4_Duty);
140 2 }
141 1 else
142 1 {
143 2 PWMB_Duty5(PWMx->PWM5_Duty);
144 2 PWMB_Duty6(PWMx->PWM6_Duty);
145 2 PWMB_Duty7(PWMx->PWM7_Duty);
146 2 PWMB_Duty8(PWMx->PWM8_Duty);
147 2 }
148 1
149 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
150 1 }
151
152 /*********************************************************/
153 void PWM_config(void)
154 {
155 1 PWMx_InitDefine PWMx_InitStructure;
156 1 PWMx_InitStructure.PWM2_Mode = CCMRn_PWM_MODE1; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_IN
-VALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
157 1 PWMx_InitStructure.PWM2_SetPriority = Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Prior
-ity_2,Priority_3
158 1 PWMx_InitStructure.PWM_Period = 2047; //周期时间, 0~65535
159 1 PWMx_InitStructure.PWM2_Duty = PWMA_Duty.PWM2_Duty; //PWM2占空比时间, 0~Period
160 1 PWMx_InitStructure.PWM_DeadTime = 0; //死区发生器设置, 0~255
161 1 PWMx_InitStructure.PWM_EnoSelect = ENO2N ;
162 1 PWMx_InitStructure.PWM_PS_SW =PWM2_SW_P12_P13;
163 1 PWMx_InitStructure.PWM_CC2NEnable = ENABLE; //开启PWM2N输入捕获/比较输出, ENABLE,DISABLE
164 1 PWMx_InitStructure.PWM_MainOutEnable= ENABLE; //主输出使能, ENABLE,DISABLE
165 1 PWMx_InitStructure.PWM_CEN_Enable = ENABLE; //使能计数器, ENABLE,DISABLE
166 1 PWM_Configuration(PWMA, &PWMx_InitStructure); //初始化PWM, PWMA,PWMB
167 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1440 ----
C51 COMPILER V9.60.0.0 PWM 03/13/2023 17:49:47 PAGE 4
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 52
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

253
Listings/STARTUP.lst Normal file
View File

@ -0,0 +1,253 @@
A51 MACRO ASSEMBLER STARTUP 03/20/2023 09:24:24 PAGE 1
MACRO ASSEMBLER A51 V8.2.7.0
OBJECT MODULE PLACED IN .\Objects\STARTUP.obj
ASSEMBLER INVOKED BY: d:\Keil_v5\C51\BIN\A51.EXE STARTUP.A51 SET(SMALL) DEBUG PRINT(.\Listings\STARTUP.lst) OBJECT(.\Obj
ects\STARTUP.obj) EP
LOC OBJ LINE SOURCE
1 $nomod51
2 ;------------------------------------------------------------------------------
3 ; This file is part of the C51 Compiler package
4 ; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
5 ; Version 8.01
6 ;
7 ; *** <<< Use Configuration Wizard in Context Menu >>> ***
8 ;------------------------------------------------------------------------------
9 ; STARTUP.A51: This code is executed after processor reset.
10 ;
11 ; To translate this file use A51 with the following invocation:
12 ;
13 ; A51 STARTUP.A51
14 ;
15 ; To link the modified STARTUP.OBJ file to your application use the following
16 ; Lx51 invocation:
17 ;
18 ; Lx51 your object file list, STARTUP.OBJ controls
19 ;
20 ;------------------------------------------------------------------------------
21 ;
22 ; User-defined <h> Power-On Initialization of Memory
23 ;
24 ; With the following EQU statements the initialization of memory
25 ; at processor reset can be defined:
26 ;
27 ; <o> IDATALEN: IDATA memory size <0x0-0x100>
28 ; <i> Note: The absolute start-address of IDATA memory is always 0
29 ; <i> The IDATA space overlaps physically the DATA and BIT areas.
0080 30 IDATALEN EQU 80H
31 ;
32 ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
33 ; <i> The absolute start address of XDATA memory
0000 34 XDATASTART EQU 0
35 ;
36 ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
37 ; <i> The length of XDATA memory in bytes.
0000 38 XDATALEN EQU 0
39 ;
40 ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
41 ; <i> The absolute start address of PDATA memory
0000 42 PDATASTART EQU 0H
43 ;
44 ; <o> PDATALEN: PDATA memory size <0x0-0xFF>
45 ; <i> The length of PDATA memory in bytes.
0000 46 PDATALEN EQU 0H
47 ;
48 ;</h>
49 ;------------------------------------------------------------------------------
50 ;
51 ;<h> Reentrant Stack Initialization
52 ;
53 ; The following EQU statements define the stack pointer for reentrant
54 ; functions and initialized it:
55 ;
56 ; <h> Stack Space for reentrant functions in the SMALL model.
57 ; <q> IBPSTACK: Enable SMALL model reentrant stack
A51 MACRO ASSEMBLER STARTUP 03/20/2023 09:24:24 PAGE 2
58 ; <i> Stack space for reentrant functions in the SMALL model.
0000 59 IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
60 ; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
61 ; <i> Set the top of the stack to the highest location.
0100 62 IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
63 ; </h>
64 ;
65 ; <h> Stack Space for reentrant functions in the LARGE model.
66 ; <q> XBPSTACK: Enable LARGE model reentrant stack
67 ; <i> Stack space for reentrant functions in the LARGE model.
0000 68 XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
69 ; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
70 ; <i> Set the top of the stack to the highest location.
0000 71 XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
72 ; </h>
73 ;
74 ; <h> Stack Space for reentrant functions in the COMPACT model.
75 ; <q> PBPSTACK: Enable COMPACT model reentrant stack
76 ; <i> Stack space for reentrant functions in the COMPACT model.
0000 77 PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
78 ;
79 ; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
80 ; <i> Set the top of the stack to the highest location.
0100 81 PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
82 ; </h>
83 ;</h>
84 ;------------------------------------------------------------------------------
85 ;
86 ; Memory Page for Using the Compact Model with 64 KByte xdata RAM
87 ; <e>Compact Model Page Definition
88 ;
89 ; <i>Define the XDATA page used for PDATA variables.
90 ; <i>PPAGE must conform with the PPAGE set in the linker invocation.
91 ;
92 ; Enable pdata memory page initalization
0000 93 PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
94 ;
95 ; <o> PPAGE number <0x0-0xFF>
96 ; <i> uppermost 256-byte address of the page used for PDATA variables.
0000 97 PPAGE EQU 0
98 ;
99 ; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
100 ; <i> most 8051 variants use P2 as uppermost address byte
00A0 101 PPAGE_SFR DATA 0A0H
102 ;
103 ; </e>
104 ;------------------------------------------------------------------------------
105
106 ; Standard SFR Symbols
00E0 107 ACC DATA 0E0H
00F0 108 B DATA 0F0H
0081 109 SP DATA 81H
0082 110 DPL DATA 82H
0083 111 DPH DATA 83H
112
113 NAME ?C_STARTUP
114
115
116 ?C_C51STARTUP SEGMENT CODE
117 ?STACK SEGMENT IDATA
118
---- 119 RSEG ?STACK
0000 120 DS 1
121
122 EXTRN CODE (?C_START)
123 PUBLIC ?C_STARTUP
A51 MACRO ASSEMBLER STARTUP 03/20/2023 09:24:24 PAGE 3
124
---- 125 CSEG AT 0
0000 020000 F 126 ?C_STARTUP: LJMP STARTUP1
127
---- 128 RSEG ?C_C51STARTUP
129
0000 130 STARTUP1:
131
132 IF IDATALEN <> 0
0000 787F 133 MOV R0,#IDATALEN - 1
0002 E4 134 CLR A
0003 F6 135 IDATALOOP: MOV @R0,A
0004 D8FD 136 DJNZ R0,IDATALOOP
137 ENDIF
138
139 IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
153
154 IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
157
158 IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
166
167 IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
172
173 IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
179
180 IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
184
0006 758100 F 185 MOV SP,#?STACK-1
186
187 ; This code is required if you use L51_BANK.A51 with Banking Mode 4
188 ;<h> Code Banking
189 ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
A51 MACRO ASSEMBLER STARTUP 03/20/2023 09:24:24 PAGE 4
190
195 ;</h>
0009 020000 F 196 LJMP ?C_START
197
198 END
A51 MACRO ASSEMBLER STARTUP 03/20/2023 09:24:24 PAGE 5
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
?C_C51STARTUP. . . C SEG 000CH REL=UNIT
?C_START . . . . . C ADDR ----- EXT
?C_STARTUP . . . . C ADDR 0000H A
?STACK . . . . . . I SEG 0001H REL=UNIT
ACC. . . . . . . . D ADDR 00E0H A
B. . . . . . . . . D ADDR 00F0H A
DPH. . . . . . . . D ADDR 0083H A
DPL. . . . . . . . D ADDR 0082H A
IBPSTACK . . . . . N NUMB 0000H A
IBPSTACKTOP. . . . N NUMB 0100H A
IDATALEN . . . . . N NUMB 0080H A
IDATALOOP. . . . . C ADDR 0003H R SEG=?C_C51STARTUP
PBPSTACK . . . . . N NUMB 0000H A
PBPSTACKTOP. . . . N NUMB 0100H A
PDATALEN . . . . . N NUMB 0000H A
PDATASTART . . . . N NUMB 0000H A
PPAGE. . . . . . . N NUMB 0000H A
PPAGEENABLE. . . . N NUMB 0000H A
PPAGE_SFR. . . . . D ADDR 00A0H A
SP . . . . . . . . D ADDR 0081H A
STARTUP1 . . . . . C ADDR 0000H R SEG=?C_C51STARTUP
XBPSTACK . . . . . N NUMB 0000H A
XBPSTACKTOP. . . . N NUMB 0000H A
XDATALEN . . . . . N NUMB 0000H A
XDATASTART . . . . N NUMB 0000H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

28
Listings/TM5160.lst Normal file
View File

@ -0,0 +1,28 @@
C51 COMPILER V9.60.0.0 TM5160 03/14/2023 09:21:34 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE TM5160
OBJECT MODULE PLACED IN .\Objects\TM5160.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\TM5160.C OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXT
-END PRINT(.\Listings\TM5160.lst) TABS(2) OBJECT(.\Objects\TM5160.obj)
line level source
1 #include "tm5160.h"
2 void tmc()
3 {
4 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

495
Listings/UART.lst Normal file
View File

@ -0,0 +1,495 @@
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN .\Objects\UART.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\UART.C OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEN
-D PRINT(.\Listings\UART.lst) TABS(2) OBJECT(.\Objects\UART.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 #include "UART.h"
14 #include "STDIO.H"
15
16 #ifdef UART1
17 COMx_Define COM1;
18 u8 xdata TX1_Buffer[COM_TX1_Lenth]; //发送缓冲
19 u8 xdata RX1_Buffer[COM_RX1_Lenth]; //接收缓冲
20 #endif
21 #ifdef UART2
COMx_Define COM2;
u8 xdata TX2_Buffer[COM_TX2_Lenth]; //发送缓冲
u8 xdata RX2_Buffer[COM_RX2_Lenth]; //接收缓冲
#endif
26 #ifdef UART3
COMx_Define COM3;
u8 xdata TX3_Buffer[COM_TX3_Lenth]; //发送缓冲
u8 xdata RX3_Buffer[COM_RX3_Lenth]; //接收缓冲
#endif
31 #ifdef UART4
COMx_Define COM4;
u8 xdata TX4_Buffer[COM_TX4_Lenth]; //发送缓冲
u8 xdata RX4_Buffer[COM_RX4_Lenth]; //接收缓冲
#endif
36
37 u8 UART_Configuration(u8 UARTx, COMx_InitDefine *COMx)
38 {
39 1 u8 i;
40 1 u32 j;
41 1
42 1 #ifdef UART1
43 1 if(UARTx == UART1)
44 1 {
45 2 COM1.id = 1;
46 2 COM1.TX_read = 0;
47 2 COM1.TX_write = 0;
48 2 COM1.B_TX_busy = 0;
49 2 COM1.RX_Cnt = 0;
50 2 COM1.RX_TimeOut = 0;
51 2 COM1.B_RX_OK = 0;
52 2 for(i=0; i<COM_TX1_Lenth; i++) TX1_Buffer[i] = 0;
53 2 for(i=0; i<COM_RX1_Lenth; i++) RX1_Buffer[i] = 0;
54 2
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 2
55 2 if(COMx->UART_Priority > Priority_3) return 2; //错误
56 2 UART1_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_
-3
57 2 if(COMx->UART_Mode > UART_9bit_BRTx) return 2; //模式错误
58 2 SCON = (SCON & 0x3f) | COMx->UART_Mode;
59 2 if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
60 2 {
61 3 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
62 3 if(j >= 65536UL) return 2; //错误
63 3 j = 65536UL - j;
64 3 if(COMx->UART_BRT_Use == BRT_Timer1)
65 3 {
66 4 TR1 = 0;
67 4 AUXR &= ~0x01; //S1 BRT Use Timer1;
68 4 TMOD &= ~(1<<6); //Timer1 set As Timer
69 4 TMOD &= ~0x30; //Timer1_16bitAutoReload;
70 4 AUXR |= (1<<6); //Timer1 set as 1T mode
71 4 TH1 = (u8)(j>>8);
72 4 TL1 = (u8)j;
73 4 ET1 = 0; //禁止中断
74 4 TMOD &= ~0x40; //定时
75 4 INT_CLKO &= ~0x02; //不输出时钟
76 4 TR1 = 1;
77 4 }
78 3 else if(COMx->UART_BRT_Use == BRT_Timer2)
79 3 {
80 4 AUXR &= ~(1<<4); //Timer stop
81 4 AUXR |= 0x01; //S1 BRT Use Timer2;
82 4 AUXR &= ~(1<<3); //Timer2 set As Timer
83 4 AUXR |= (1<<2); //Timer2 set as 1T mode
84 4 TH2 = (u8)(j>>8);
85 4 TL2 = (u8)j;
86 4 IE2 &= ~(1<<2); //禁止中断
87 4 AUXR |= (1<<4); //Timer run enable
88 4 }
89 3 else return 2; //错误
90 3 }
91 2 else if(COMx->UART_Mode == UART_ShiftRight)
92 2 {
93 3 if(COMx->BaudRateDouble == ENABLE) AUXR |= (1<<5); //固定波特率SysClk/2
94 3 else AUXR &= ~(1<<5); //固定波特率SysClk/12
95 3 }
96 2 else if(COMx->UART_Mode == UART_9bit) //固定波特率SysClk*2^SMOD/64
97 2 {
98 3 if(COMx->BaudRateDouble == ENABLE) PCON |= (1<<7); //固定波特率SysClk/32
99 3 else PCON &= ~(1<<7); //固定波特率SysClk/64
100 3 }
101 2 if(COMx->UART_Interrupt == ENABLE) ES = 1; //允许中断
102 2 else ES = 0; //禁止中断
103 2 if(COMx->UART_RxEnable == ENABLE) REN = 1; //允许接收
104 2 else REN = 0; //禁止接收
105 2 P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0); //切换IO
106 2 return 0;
107 2 }
108 1 #endif
109 1 #ifdef UART2
if(UARTx == UART2)
{
COM2.id = 2;
COM2.TX_read = 0;
COM2.TX_write = 0;
COM2.B_TX_busy = 0;
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 3
COM2.RX_Cnt = 0;
COM2.RX_TimeOut = 0;
COM2.B_RX_OK = 0;
for(i=0; i<COM_TX2_Lenth; i++) TX2_Buffer[i] = 0;
for(i=0; i<COM_RX2_Lenth; i++) RX2_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART2_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority
-_3
if(COMx->UART_Mode == UART_9bit_BRTx) S2CON |= (1<<7); //9bit
else S2CON &= ~(1<<7); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
AUXR &= ~(1<<4); //Timer stop
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) IE2 |= 1; //允许中断
else IE2 &= ~1; //禁止中断
if(COMx->UART_RxEnable == ENABLE) S2CON |= (1<<4); //允许接收
else S2CON &= ~(1<<4); //禁止接收
P_SW2 = (P_SW2 & ~1) | (COMx->UART_P_SW & 0x01); //切换IO
return 0;
}
#endif
148 1 #ifdef UART3
if(UARTx == UART3)
{
COM3.id = 3;
COM3.TX_read = 0;
COM3.TX_write = 0;
COM3.B_TX_busy = 0;
COM3.RX_Cnt = 0;
COM3.RX_TimeOut = 0;
COM3.B_RX_OK = 0;
for(i=0; i<COM_TX3_Lenth; i++) TX3_Buffer[i] = 0;
for(i=0; i<COM_RX3_Lenth; i++) RX3_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART3_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority
-_3
if(COMx->UART_Mode == UART_9bit_BRTx) S3_9bit(); //9bit
else S3_8bit(); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
if(COMx->UART_BRT_Use == BRT_Timer3)
{
S3_BRT_UseTimer3(); //S3 BRT Use Timer3;
TH3 = (u8)(j>>8);
TL3 = (u8)j;
T4T3M &= 0xf0;
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 4
T4T3M |= 0x0a; //Timer3 set As Timer, 1T mode, Start timer3
}
else if(COMx->UART_BRT_Use == BRT_Timer2)
{
AUXR &= ~(1<<4); //Timer stop
S3_BRT_UseTimer2(); //S3 BRT Use Timer2;
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //错误
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) S3_Int_Enable(); //允许中断
else S3_Int_Disable(); //禁止中断
if(COMx->UART_RxEnable == ENABLE) S3_RX_Enable(); //允许接收
else S3_RX_Disable(); //禁止接收
P_SW2 = (P_SW2 & ~2) | (COMx->UART_P_SW & 0x02); //切换IO
return 0;
}
#endif
200 1 #ifdef UART4
if(UARTx == UART4)
{
COM4.id = 3;
COM4.TX_read = 0;
COM4.TX_write = 0;
COM4.B_TX_busy = 0;
COM4.RX_Cnt = 0;
COM4.RX_TimeOut = 0;
COM4.B_RX_OK = 0;
for(i=0; i<COM_TX4_Lenth; i++) TX4_Buffer[i] = 0;
for(i=0; i<COM_RX4_Lenth; i++) RX4_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART4_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority
-_3
if(COMx->UART_Mode == UART_9bit_BRTx) S4_9bit(); //9bit
else S4_8bit(); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
if(COMx->UART_BRT_Use == BRT_Timer4)
{
S4_BRT_UseTimer4(); //S4 BRT Use Timer4;
TH4 = (u8)(j>>8);
TL4 = (u8)j;
T4T3M &= 0x0f;
T4T3M |= 0xa0; //Timer4 set As Timer, 1T mode, Start timer4
}
else if(COMx->UART_BRT_Use == BRT_Timer2)
{
AUXR &= ~(1<<4); //Timer stop
S4_BRT_UseTimer2(); //S4 BRT Use Timer2;
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 5
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //错误
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) S4_Int_Enable(); //允许中断
else S4_Int_Disable(); //禁止中断
if(COMx->UART_RxEnable == ENABLE) S4_RX_Enable(); //允许接收
else S4_RX_Disable(); //禁止接收
P_SW2 = (P_SW2 & ~4) | (COMx->UART_P_SW & 0x04); //切换IO
return 0;
}
#endif
252 1 return 2; //错误
253 1 }
254
255 /*********************************************************/
256
257 /********************* UART1 函数 ************************/
258 #ifdef UART1
259 void TX1_write2buff(u8 dat) //写入发送缓冲,指针+1
260 {
261 1 TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲
262 1 if(++COM1.TX_write >= COM_TX1_Lenth) COM1.TX_write = 0;
263 1
264 1 if(COM1.B_TX_busy == 0) //空闲
265 1 {
266 2 COM1.B_TX_busy = 1; //标志忙
267 2 TI = 1; //触发发送中断
268 2 }
269 1 }
270
271 void PrintString1(u8 *puts)
272 {
273 1 for (; *puts != 0; puts++) TX1_write2buff(*puts); //遇到停止符0结束
274 1 }
275
276 void UART1_int (void) interrupt UART1_VECTOR
277 {
278 1 if(RI)
279 1 {
280 2 RI = 0;
281 2 if(COM1.B_RX_OK == 0)
282 2 {
283 3 if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;
284 3 RX1_Buffer[COM1.RX_Cnt++] = SBUF;
285 3 COM1.RX_TimeOut = TimeOutSet1;
286 3 }
287 2 }
288 1
289 1 if(TI)
290 1 {
291 2 TI = 0;
292 2 if(COM1.TX_read != COM1.TX_write)
293 2 {
294 3 SBUF = TX1_Buffer[COM1.TX_read];
295 3 if(++COM1.TX_read >= COM_TX1_Lenth) COM1.TX_read = 0;
296 3 }
297 2 else COM1.B_TX_busy = 0;
298 2 }
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 6
299 1 }
300 #endif
301
302 /********************* UART2 函数 ************************/
303 #ifdef UART2
void TX2_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX2_Buffer[COM2.TX_write] = dat; //装发送缓冲
if(++COM2.TX_write >= COM_TX2_Lenth) COM2.TX_write = 0;
if(COM2.B_TX_busy == 0) //空闲
{
COM2.B_TX_busy = 1; //标志忙
SET_TI2(); //触发发送中断
}
}
void PrintString2(u8 *puts)
{
for (; *puts != 0; puts++) TX2_write2buff(*puts); //遇到停止符0结束
}
void UART2_int (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
if(COM2.B_RX_OK == 0)
{
if(COM2.RX_Cnt >= COM_RX2_Lenth) COM2.RX_Cnt = 0;
RX2_Buffer[COM2.RX_Cnt++] = S2BUF;
COM2.RX_TimeOut = TimeOutSet2;
}
}
if(TI2)
{
CLR_TI2();
if(COM2.TX_read != COM2.TX_write)
{
S2BUF = TX2_Buffer[COM2.TX_read];
if(++COM2.TX_read >= COM_TX2_Lenth) COM2.TX_read = 0;
}
else COM2.B_TX_busy = 0;
}
}
#endif
346
347 /********************* UART3 函数 ************************/
348 #ifdef UART3
void TX3_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX3_Buffer[COM3.TX_write] = dat; //装发送缓冲
if(++COM3.TX_write >= COM_TX3_Lenth) COM3.TX_write = 0;
if(COM3.B_TX_busy == 0) //空闲
{
COM3.B_TX_busy = 1; //标志忙
SET_TI3(); //触发发送中断
}
}
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 7
void PrintString3(u8 *puts)
{
for (; *puts != 0; puts++) TX3_write2buff(*puts); //遇到停止符0结束
}
void UART3_int (void) interrupt UART3_VECTOR
{
if(RI3)
{
CLR_RI3();
if(COM3.B_RX_OK == 0)
{
if(COM3.RX_Cnt >= COM_RX3_Lenth) COM3.RX_Cnt = 0;
RX3_Buffer[COM3.RX_Cnt++] = S3BUF;
COM3.RX_TimeOut = TimeOutSet3;
}
}
if(TI3)
{
CLR_TI3();
if(COM3.TX_read != COM3.TX_write)
{
S3BUF = TX3_Buffer[COM3.TX_read];
if(++COM3.TX_read >= COM_TX3_Lenth) COM3.TX_read = 0;
}
else COM3.B_TX_busy = 0;
}
}
#endif
391
392 /********************* UART4 函数 ************************/
393 #ifdef UART4
void TX4_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX4_Buffer[COM4.TX_write] = dat; //装发送缓冲
if(++COM4.TX_write >= COM_TX4_Lenth) COM4.TX_write = 0;
if(COM4.B_TX_busy == 0) //空闲
{
COM4.B_TX_busy = 1; //标志忙
SET_TI4(); //触发发送中断
}
}
void PrintString4(u8 *puts)
{
for (; *puts != 0; puts++) TX4_write2buff(*puts); //遇到停止符0结束
}
void UART4_int (void) interrupt UART4_VECTOR
{
if(RI4)
{
CLR_RI4();
if(COM4.B_RX_OK == 0)
{
if(COM4.RX_Cnt >= COM_RX4_Lenth) COM4.RX_Cnt = 0;
RX4_Buffer[COM4.RX_Cnt++] = S4BUF;
COM4.RX_TimeOut = TimeOutSet4;
}
}
C51 COMPILER V9.60.0.0 UART 03/23/2023 13:25:30 PAGE 8
if(TI4)
{
CLR_TI4();
if(COM4.TX_read != COM4.TX_write)
{
S4BUF = TX4_Buffer[COM4.TX_read];
if(++COM4.TX_read >= COM_TX4_Lenth) COM4.TX_read = 0;
}
else COM4.B_TX_busy = 0;
}
}
#endif
436 void UART_config(void)
437 {
438 1 COMx_InitDefine COMx_InitStructure;
439 1 COMx_InitStructure.UART_Mode = UART_8bit_BRTx;
440 1 COMx_InitStructure.UART_BRT_Use = BRT_Timer1;
441 1 COMx_InitStructure.UART_BaudRate = 115200ul;
442 1 COMx_InitStructure.UART_RxEnable = ENABLE;
443 1 COMx_InitStructure.BaudRateDouble = DISABLE;
444 1 COMx_InitStructure.UART_Interrupt = ENABLE;
445 1 COMx_InitStructure.UART_Priority = Priority_0;
446 1 COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31;
447 1 UART_Configuration(UART1, &COMx_InitStructure);
448 1 }
449 char putchar(char c)
450 {
451 1 TX1_write2buff(c);
452 1 return c;
453 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 726 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 64 ----
PDATA SIZE = ---- ----
DATA SIZE = 7 19
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

419
Listings/common.lst Normal file
View File

@ -0,0 +1,419 @@
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE COMMON
OBJECT MODULE PLACED IN .\Objects\common.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\common.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXT
-END PRINT(.\Listings\common.lst) TABS(2) OBJECT(.\Objects\common.obj)
line level source
1 #include "common.h"
2 #include "GPIO.h"
3 #include "tm1650.h"
4 #include "STDIO.H"
5 #include "EEPROM.h"
6 #include "timer.h"
7 u8 keyflag = 0;
8 u8 sunmode = 1;
9 u8 pog = 4;
10 u16 keytime = 0;
11 u8 keyloog = 0;
12 u8 speedmode1 = speedstart, speedmode2 = speedstart, speedmode3 = speedstart, speedmode4 = speedstart, sub
-division1 = substart, subdivision2 = substart, subdivision3 = substart, subdivision4 = substart;
13 u8 num[9] = 0;
14 static void key_add(u8 *speedmode, u8 *subdivision)
15 {
16 1 u8 key__time = 0;
17 1 if (keyloog)
18 1 key__time = 100;
19 1 else
20 1 key__time = 500;
21 1 switch (pog)
22 1 {
23 2 case 1:
24 2 break;
25 2 case 2:
26 2 if (keyflag == 0)
27 2 {
28 3 *speedmode += 1;
29 3 if (*speedmode >= speedmax)
30 3 *speedmode = speedmax;
31 3 keyflag = 1;
32 3 }
33 2 if (keytime > key__time)
34 2 {
35 3 *speedmode += 1;
36 3 keytime = 0;
37 3 keyloog = 1;
38 3 if (*speedmode >= speedmax)
39 3 *speedmode = speedmax;
40 3 }
41 2 break;
42 2 case 3:
43 2 if (keyflag == 0)
44 2 {
45 3 *subdivision += 1;
46 3 if (*subdivision >= subdivisionmax)
47 3 *subdivision = subdivisionmax;
48 3 keyflag = 1;
49 3 }
50 2 if (keytime > key__time)
51 2 {
52 3 *subdivision += 1;
53 3 keytime = 0;
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 2
54 3 keyloog = 1;
55 3 if (*subdivision >= subdivisionmax)
56 3 *subdivision = subdivisionmax;
57 3 }
58 2 break;
59 2 }
60 1 }
61
62 static void key_Redu(u8 *speedmode, u8 *subdivision)
63 {
64 1 u8 key__time = 0;
65 1 if (keyloog)
66 1 key__time = 100;
67 1 else
68 1 key__time = 500;
69 1 switch (pog)
70 1 {
71 2 case 1:
72 2 break;
73 2 case 2:
74 2 if (keyflag == 0)
75 2 {
76 3 *speedmode -= 1;
77 3 if (*speedmode <= speedmin)
78 3 *speedmode = speedmin;
79 3 keyflag = 1;
80 3 }
81 2 if (keytime > key__time)
82 2 {
83 3 *speedmode -= 1;
84 3 keytime = 0;
85 3 keyloog = 1;
86 3 if (*speedmode <= speedmin)
87 3 *speedmode = speedmin;
88 3 }
89 2 break;
90 2 case 3:
91 2 if (keyflag == 0)
92 2 {
93 3 if (*subdivision <= subdivisionmin)
94 3 *subdivision = subdivisionmin;
95 3 else
96 3 *subdivision -= 1;
97 3 keyflag = 1;
98 3 }
99 2 if (keytime > key__time)
100 2 {
101 3 keytime = 0;
102 3 keyloog = 1;
103 3 if (*subdivision <= subdivisionmin)
104 3 *subdivision = subdivisionmin;
105 3 else
106 3 *subdivision -= 1;
107 3 }
108 2 break;
109 2 }
110 1 }
111 void keyscan()
112 {
113 1 if (k1 == 0)
114 1 if (keyflag == 0)
115 1 {
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 3
116 2 timex = 400 * subdivision1;
117 2 DIR = 1;
118 2 sunmode = 1;
119 2 keyflag = 1;
120 2 setconfig();
121 2 }
122 1 if (k2 == 0)
123 1 if (keyflag == 0)
124 1 {
125 2 timex = 400 * subdivision2;
126 2 DIR = 0;
127 2 sunmode = 2;
128 2 keyflag = 1;
129 2 setconfig();
130 2 }
131 1 if (k3 == 0)
132 1 if (keyflag == 0)
133 1 {
134 2 timex = 800 <<subdivision3;
135 2 DIR = 1;
136 2 sunmode = 3;
137 2 keyflag = 1;
138 2 setconfig();
139 2 }
140 1 if (k4 == 0)
141 1 if (keyflag == 0)
142 1 {
143 2 timex = 0;
144 2 sunmode = 4;
145 2 keyflag = 1;
146 2 setconfig();
147 2 }
148 1 if (k5 == 0)
149 1 {
150 2 if (keyflag == 0)
151 2 {
152 3 switch (pog)
153 3 {
154 4 case 1:
155 4 pog = 2;
156 4 break;
157 4 case 2:
158 4 pog = 3;
159 4 break;
160 4 case 3:
161 4 pog = 4;
162 4 setconfig();
163 4 break;
164 4 case 4:
165 4 pog = 2;
166 4 break;
167 4 }
168 3 keyflag = 1;
169 3 }
170 2 }
171 1 if (k6 == 0)
172 1 {
173 2 switch (sunmode)
174 2 {
175 3 case 1:
176 3 key_add(&speedmode1, &subdivision1);
177 3 break;
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 4
178 3 case 2:
179 3 key_add(&speedmode2, &subdivision2);
180 3 break;
181 3 case 3:
182 3 key_add(&speedmode3, &subdivision3);
183 3 break;
184 3 case 4:
185 3 key_add(&speedmode4, &subdivision4);
186 3 break;
187 3 }
188 2 }
189 1 if (k7 == 0)
190 1 {
191 2 switch (sunmode)
192 2 {
193 3 case 1:
194 3 key_Redu(&speedmode1, &subdivision1);
195 3 break;
196 3 case 2:
197 3 key_Redu(&speedmode2, &subdivision2);
198 3 break;
199 3 case 3:
200 3 key_Redu(&speedmode3, &subdivision3);
201 3 break;
202 3 case 4:
203 3 key_Redu(&speedmode4, &subdivision4);
204 3 break;
205 3 }
206 2 }
207 1 if (k8 == 0)
208 1 {
209 2 if (keyflag == 0)
210 2 {
211 3 if (pog != 1)
212 3 pog = 1;
213 3 else
214 3 pog = 4;
215 3 setconfig();
216 3 keyflag = 1;
217 3 switch (sunmode)
218 3 {
219 4 case 1:
220 4 timex = 400 << subdivision1;
221 4 DIR = 1;
222 4 break;
223 4 case 2:
224 4 timex = 400 << subdivision2;
225 4 DIR = 0;
226 4 break;
227 4 case 3:
228 4 timex = 800 << subdivision3;
229 4 DIR = 1;
230 4 break;
231 4 case 4:
232 4 break;
233 4 }
234 3 }
235 2 }
236 1 if (k1 != 0 & k2 != 0 & k3 != 0 & k4 != 0 & k5 != 0 & k6 != 0 & k7 != 0 & k8 != 0)
237 1 {
238 2 keyflag = 0;
239 2 keyloog = 0;
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 5
240 2 }
241 1 }
242 static void dislittleplay(u8 speedmode, u16 subdivision)
243 {
244 1 switch (pog)
245 1 {
246 2 case 1:
247 2 TM1650_printpogrun(sunmode, displaydata);
248 2 break;
249 2 case 2:
250 2 TM1650_print_SMG1(speedmode);
251 2 break;
252 2 case 3:
253 2 TM1650_print_SMG2(subdivision);
254 2 break;
255 2 case 4:
256 2 TM1650_printpogstop(sunmode);
257 2 break;
258 2 }
259 1 }
260 void display()
261 {
262 1 switch (sunmode)
263 1 {
264 2 case 1:
265 2 dislittleplay(speedmode1, (u16)(1 << subdivision1));
266 2 break;
267 2 case 2:
268 2 dislittleplay(speedmode2, (u16)(1 << subdivision2));
269 2 break;
270 2 case 3:
271 2 dislittleplay(speedmode3, (u16)(1 << subdivision3));
272 2 break;
273 2 case 4:
274 2 dislittleplay(speedmode4, (u16)(1 << subdivision4));
275 2 break;
276 2 }
277 1 }
278 void shuju()
279 {
280 1
281 1 switch (sunmode)
282 1 {
283 2 case 1:
284 2 if (((u16)(speedmode1 * 20 * (1 << subdivision1) / 3)) < 400)
285 2 {
286 3 Timer0_12T();
287 3 T0_Load(65536UL - (MAIN_Fosc / ((u32)speedmode1 * 80 * (1 << subdivision1))));
288 3 }
289 2 else
290 2 {
291 3 Timer0_1T();
292 3 T0_Load(65536UL - (MAIN_Fosc / ((u32)speedmode1 * 20 * (1 << subdivision1) / 3)));
293 3 }
294 2 break;
295 2 case 2:
296 2 if ((u16)(speedmode2 * 20 * (1 << subdivision2) / 3) < 400)
297 2 {
298 3 Timer0_12T();
299 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode2 * 80 * (1 << subdivision2))));
300 3 }
301 2 else
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 6
302 2 {
303 3 Timer0_1T();
304 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode2 * 20 * (1 << subdivision2) / 3)));
305 3 }
306 2 break;
307 2 case 3:
308 2 if ((u16)(speedmode3 * 20 * (1 << subdivision3) / 3) < 400)
309 2 {
310 3 Timer0_12T();
311 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode3 * 80 * (1 << subdivision3))));
312 3 }
313 2 else
314 2 {
315 3 Timer0_1T();
316 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode3 * 20 * (1 << subdivision3) / 3)));
317 3 }
318 2 break;
319 2 case 4:
320 2 if ((u16)(speedmode4 * 20 * (1 << subdivision4) / 3) < 400)
321 2 {
322 3 Timer0_12T();
323 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode4 * 80 * (1 << subdivision4))));
324 3 }
325 2 else
326 2 {
327 3 Timer0_1T();
328 3 T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode4 * 20 * (1 << subdivision4) / 3)));
329 3 }
330 2 break;
331 2 }
332 1 }
333 void run()
334 {
335 1 switch (pog)
336 1 {
337 2 case 1:
338 2 if (timex == 0)
339 2 pog = 4;
340 2 EN = 0;
341 2 break;
342 2 case 2:
343 2 EN = 1;
344 2 break;
345 2 case 3:
346 2 EN = 1;
347 2 break;
348 2 case 4:
349 2 EN = 1;
350 2 break;
351 2 }
352 1 }
353 void getconfig()
354 {
355 1 EEPROM_read_n(MYaddress, num, 9);
356 1 if (num[0] != 255)
357 1 {
358 2 speedmode1 = num[0];
359 2 speedmode2 = num[1];
360 2 speedmode3 = num[2];
361 2 speedmode4 = num[3];
362 2 subdivision1 = num[4];
363 2 subdivision2 = num[5];
C51 COMPILER V9.60.0.0 COMMON 03/23/2023 16:31:25 PAGE 7
364 2 subdivision3 = num[6];
365 2 subdivision4 = num[7];
366 2 sunmode = num[8];
367 2 }
368 1 }
369 void setconfig()
370 {
371 1 EEPROM_SectorErase(MYaddress);
372 1 num[0] = speedmode1;
373 1 num[1] = speedmode2;
374 1 num[2] = speedmode3;
375 1 num[3] = speedmode4;
376 1 num[4] = subdivision1;
377 1 num[5] = subdivision2;
378 1 num[6] = subdivision3;
379 1 num[7] = subdivision4;
380 1 num[8] = sunmode;
381 1 EEPROM_write_n(MYaddress, num, 9);
382 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2668 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

82
Listings/delay.lst Normal file
View File

@ -0,0 +1,82 @@
C51 COMPILER V9.60.0.0 DELAY 03/23/2023 13:25:30 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE DELAY
OBJECT MODULE PLACED IN .\Objects\delay.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\delay.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTE
-ND PRINT(.\Listings\delay.lst) TABS(2) OBJECT(.\Objects\delay.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 /*************** 功能说明 ****************
14
15 本文件为STC8系列的延时程序,用户几乎可以不修改这个程序.
16
17 ******************************************/
18
19 #include "delay.h"
20
21 //========================================================================
22 // 函数: void delay_ms(unsigned char ms)
23 // 描述: 延时函数。
24 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
25 // 返回: none.
26 // 版本: VER1.0
27 // 日期: 2021-3-9
28 // 备注:
29 //========================================================================
30 void delay_ms(unsigned char ms)
31 {
32 1 unsigned int i;
33 1 do{
34 2 i = MAIN_Fosc / 10000;
35 2 while(--i);
36 2 }while(--ms);
37 1 }
38 void Delay4us() //@11.0592MHz
39 {
40 1 unsigned char i;
41 1
42 1 _nop_();
43 1 _nop_();
44 1 i = 12;
45 1 while (--i)
46 1 ;
47 1 }
48 void Delay2us() //@11.0592MHz
49 {
50 1 unsigned char i;
51 1
52 1 _nop_();
53 1 i = 5;
54 1 while (--i)
C51 COMPILER V9.60.0.0 DELAY 03/23/2023 13:25:30 PAGE 2
55 1 ;
56 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 29 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

52
Listings/main.lst Normal file
View File

@ -0,0 +1,52 @@
C51 COMPILER V9.60.0.0 MAIN 03/23/2023 15:55:27 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\Objects\main.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\main.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEN
-D PRINT(.\Listings\main.lst) TABS(2) OBJECT(.\Objects\main.obj)
line level source
1 #include "config.h"
2 #include "GPIO.h"
3 #include "tm1650.h"
4 #include "timer.h"
5 #include "UART.h"
6 #include "STDIO.H"
7 #include "delay.h"
8 #include "common.h"
9 #include "EEPROM.h"
10
11 void main()
12 {
13 1 TM1650_init();
14 1 Timer_config();
15 1 GPIO_config();
16 1 UART_config();
17 1 getconfig();
18 1 EA = 1;
19 1 delay_ms(10);
20 1 while (1)
21 1 {
22 2 shuju();
23 2 keyscan();
24 2 display();
25 2 run();
26 2 printf("%d\r\n", timex);
27 2 }
28 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 57 ----
CONSTANT SIZE = 5 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

312
Listings/timer.lst Normal file
View File

@ -0,0 +1,312 @@
C51 COMPILER V9.60.0.0 TIMER 03/23/2023 16:31:25 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN .\Objects\timer.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\timer.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTE
-ND PRINT(.\Listings\timer.lst) TABS(2) OBJECT(.\Objects\timer.obj)
line level source
1 /*---------------------------------------------------------------------*/
2 /* --- STC MCU Limited ------------------------------------------------*/
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
9 /* --- QQ: 800003751 -------------------------------------------------*/
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
11 /*---------------------------------------------------------------------*/
12
13 /************* 功能说明 **************
14
15 本文件为STC8系列的定时器初始化和中断程序,用户可以在这个文件中修改自己需要的中断程序.
16
17 ******************************************/
18
19 #include "timer.h"
20 #include "GPIO.h"
21 #include "common.h"
22 u32 timex;
23 static u16 displaytime = 0;
24 u8 displaydata = 0;
25 /********************* Timer0中断函数************************/
26 void timer0_int(void) interrupt TIMER0_VECTOR
27 {
28 1 if (sunmode == 3)
29 1 {
30 2 if (timex <= 400 << subdivision3)
31 2 DIR = 0;
32 2 }
33 1 if (timex <= 0)
34 1 timex = 0;
35 1 else
36 1 {
37 2
38 2 if (pog == 1)
39 2 {
40 3 timex--;
41 3 PUL = ~PUL;
42 3 }
43 2 }
44 1 }
45
46 /********************* Timer1中断函数************************/
47 void timer1_int(void) interrupt TIMER1_VECTOR
48 {
49 1 }
50
51 /********************* Timer2中断函数************************/
52 void timer2_int(void) interrupt TIMER2_VECTOR
53 {
54 1 displaytime++;
C51 COMPILER V9.60.0.0 TIMER 03/23/2023 16:31:25 PAGE 2
55 1 if (displaytime >= 200)
56 1 {
57 2 if (DIR)
58 2 {
59 3 if (displaydata >= 7)
60 3 displaydata = 0;
61 3 else
62 3 displaydata++;
63 3 }
64 2 else
65 2 {
66 3 if (displaydata <= 0)
67 3 displaydata = 7;
68 3 else
69 3 displaydata--;
70 3 }
71 2 displaytime = 0;
72 2 }
73 1 if (keyflag)
74 1 keytime++;
75 1 else
76 1 keytime = 0;
77 1 }
78
79 /********************* Timer3中断函数************************/
80 void timer3_int(void) interrupt TIMER3_VECTOR
81 {
82 1 }
83
84 /********************* Timer4中断函数************************/
85 void timer4_int(void) interrupt TIMER4_VECTOR
86 {
87 1 }
88
89 //========================================================================
90 // 函数: u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
91 // 描述: 定时器初始化程序.
92 // 参数: TIMx: 结构参数,请参考timer.h里的定义.
93 // 返回: 成功返回0, 空操作返回1,错误返回2.
94 // 版本: V1.0, 2012-10-22
95 //========================================================================
96 u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
97 {
98 1 if (TIM > Timer4)
99 1 return 1; // 空操作
100 1
101 1 if (TIM == Timer0)
102 1 {
103 2 Timer0_Stop(); // 停止计数
104 2 if (TIMx->TIM_Interrupt == ENABLE)
105 2 Timer0_InterruptEnable(); // 允许中断
106 2 else
107 2 Timer0_InterruptDisable(); // 禁止中断
108 2 if (TIMx->TIM_Priority > Priority_3)
109 2 return 2; // 错误
110 2 Timer0_Priority(TIMx->TIM_Priority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Pr
-iority_3
111 2
112 2 if (TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask)
113 2 return 2; // 错误
114 2 TMOD = (TMOD & ~0x03) | TIMx->TIM_Mode; // 工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动<E887AA>
-刈<>, 3: 不可屏蔽16位自动重装
C51 COMPILER V9.60.0.0 TIMER 03/23/2023 16:31:25 PAGE 3
115 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
116 2 Timer0_12T(); // 12T
117 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
118 2 Timer0_1T(); // 1T
119 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
120 2 Timer0_AsCounter(); // 对外计数或分频
121 2 else
122 2 Timer0_AsTimer(); // 定时
123 2 if (TIMx->TIM_ClkOut == ENABLE)
124 2 Timer0_CLKO_Enable(); // 输出时钟
125 2 else
126 2 Timer0_CLKO_Disable(); // 不输出时钟
127 2
128 2 T0_Load(TIMx->TIM_Value);
129 2 if (TIMx->TIM_Run == ENABLE)
130 2 Timer0_Run(); // 开始运行
131 2 return 0; // 成功
132 2 }
133 1
134 1 if (TIM == Timer1)
135 1 {
136 2 Timer1_Stop(); // 停止计数
137 2 if (TIMx->TIM_Interrupt == ENABLE)
138 2 Timer1_InterruptEnable(); // 允许中断
139 2 else
140 2 Timer1_InterruptDisable(); // 禁止中断
141 2 if (TIMx->TIM_Priority > Priority_3)
142 2 return 2; // 错误
143 2 Timer1_Priority(TIMx->TIM_Priority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Pr
-iority_3
144 2 if (TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask)
145 2 return 2; // 错误
146 2 TMOD = (TMOD & ~0x30) | (TIMx->TIM_Mode << 4); // 工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8
-位自动重装, 3: 停止工作
147 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
148 2 Timer1_12T(); // 12T
149 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
150 2 Timer1_1T(); // 1T
151 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
152 2 Timer1_AsCounter(); // 对外计数或分频
153 2 else
154 2 Timer1_AsTimer(); // 定时
155 2 if (TIMx->TIM_ClkOut == ENABLE)
156 2 Timer1_CLKO_Enable(); // 输出时钟
157 2 else
158 2 Timer1_CLKO_Disable(); // 不输出时钟
159 2
160 2 T1_Load(TIMx->TIM_Value);
161 2 if (TIMx->TIM_Run == ENABLE)
162 2 Timer1_Run(); // 开始运行
163 2 return 0; // 成功
164 2 }
165 1
166 1 if (TIM == Timer2) // Timer2,固定为16位自动重装, 中断无优先级
167 1 {
168 2 Timer2_Stop(); // 停止计数
169 2 if (TIMx->TIM_Interrupt == ENABLE)
170 2 Timer2_InterruptEnable(); // 允许中断
171 2 else
172 2 Timer2_InterruptDisable(); // 禁止中断
173 2 if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
174 2 return 2;
C51 COMPILER V9.60.0.0 TIMER 03/23/2023 16:31:25 PAGE 4
175 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
176 2 Timer2_12T(); // 12T
177 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
178 2 Timer2_1T(); // 1T
179 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
180 2 Timer2_AsCounter(); // 对外计数或分频
181 2 else
182 2 Timer2_AsTimer(); // 定时
183 2 if (TIMx->TIM_ClkOut == ENABLE)
184 2 Timer2_CLKO_Enable(); // 输出时钟
185 2 else
186 2 Timer2_CLKO_Disable(); // 不输出时钟
187 2
188 2 T2_Load(TIMx->TIM_Value);
189 2 if (TIMx->TIM_Run == ENABLE)
190 2 Timer2_Run(); // 开始运行
191 2 return 0; // 成功
192 2 }
193 1
194 1 if (TIM == Timer3) // Timer3,固定为16位自动重装, 中断无优先级
195 1 {
196 2 Timer3_Stop(); // 停止计数
197 2 if (TIMx->TIM_Interrupt == ENABLE)
198 2 Timer3_InterruptEnable(); // 允许中断
199 2 else
200 2 Timer3_InterruptDisable(); // 禁止中断
201 2 if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
202 2 return 2;
203 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
204 2 Timer3_12T(); // 12T
205 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
206 2 Timer3_1T(); // 1T
207 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
208 2 Timer3_AsCounter(); // 对外计数或分频
209 2 else
210 2 Timer3_AsTimer(); // 定时
211 2 if (TIMx->TIM_ClkOut == ENABLE)
212 2 Timer3_CLKO_Enable(); // 输出时钟
213 2 else
214 2 Timer3_CLKO_Disable(); // 不输出时钟
215 2
216 2 T3_Load(TIMx->TIM_Value);
217 2 if (TIMx->TIM_Run == ENABLE)
218 2 Timer3_Run(); // 开始运行
219 2 return 0; // 成功
220 2 }
221 1
222 1 if (TIM == Timer4) // Timer3,固定为16位自动重装, 中断无优先级
223 1 {
224 2 Timer4_Stop(); // 停止计数
225 2 if (TIMx->TIM_Interrupt == ENABLE)
226 2 Timer4_InterruptEnable(); // 允许中断
227 2 else
228 2 Timer4_InterruptDisable(); // 禁止中断
229 2 if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
230 2 return 2;
231 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
232 2 Timer4_12T(); // 12T
233 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
234 2 Timer4_1T(); // 1T
235 2 if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
236 2 Timer4_AsCounter(); // 对外计数或分频
C51 COMPILER V9.60.0.0 TIMER 03/23/2023 16:31:25 PAGE 5
237 2 else
238 2 Timer4_AsTimer(); // 定时
239 2 if (TIMx->TIM_ClkOut == ENABLE)
240 2 Timer4_CLKO_Enable(); // 输出时钟
241 2 else
242 2 Timer4_CLKO_Disable(); // 不输出时钟
243 2
244 2 T4_Load(TIMx->TIM_Value);
245 2 if (TIMx->TIM_Run == ENABLE)
246 2 Timer4_Run(); // 开始运行
247 2 return 0; // 成功
248 2 }
249 1 return 2; // 错误
250 1 }
251 /************************ ?¨?±?÷???? ****************************/
252 void Timer_config(void)
253 {
254 1 TIM_InitTypeDef TIM_InitStructure; //?á???¨??
255 1 TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //???¨?¤×÷????, TIM_16BitAutoRel
-oad,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
256 1 TIM_InitStructure.TIM_Priority = Priority_0; //???¨??????????(??????) Priority_0,P
-riority_1,Priority_2,Priority_3
257 1 TIM_InitStructure.TIM_Interrupt = ENABLE; //??????·????í, ENABLE?òDISABLE
258 1 TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //???¨?±????, TIM_CLOCK_1T,TIM_C
-LOCK_12T,TIM_CLOCK_Ext
259 1 TIM_InitStructure.TIM_ClkOut = DISABLE; //??·?????????????, ENABLE?òDISABLE
260 1 TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 100000UL); //????,
261 1 TIM_InitStructure.TIM_Run = ENABLE; //??·????????ó?????¨?±?÷, ENABLE?
-òDISABLE
262 1 Timer_Inilize(Timer0, &TIM_InitStructure); //??????Timer0 Timer0,Timer1,Timer2,
-Timer3,Timer4
263 1
264 1 TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //???¨?±????, TIM_CLOCK_1T,TIM_CLO
-CK_12T,TIM_CLOCK_Ext
265 1 TIM_InitStructure.TIM_ClkOut = DISABLE; //??·?????????????, ENABLE?òDISABLE
266 1 TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); //????,
267 1 TIM_InitStructure.TIM_Run = ENABLE; //??·????????ó?????¨?±?÷, ENABLE?ò
-DISABLE
268 1 Timer_Inilize(Timer2, &TIM_InitStructure);
269 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1127 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

225
Listings/tm1650.lst Normal file
View File

@ -0,0 +1,225 @@
C51 COMPILER V9.60.0.0 TM1650 03/23/2023 15:55:27 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE TM1650
OBJECT MODULE PLACED IN .\Objects\tm1650.obj
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\tm1650.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXT
-END PRINT(.\Listings\tm1650.lst) TABS(2) OBJECT(.\Objects\tm1650.obj)
line level source
1 #include "tm1650.h"
2 #include "delay.h"
3 #include "timer.h"
4 // 往一个指定的数码管位写入指定的显示数据
5 // 共阴数码管段码表:
6 // const unsigned char TUBE_TABLE_0[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //共阴0~9的数字
7 const unsigned char TUBE_TABLE_0[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77,
-0x7c, 0x39, 0x5e, 0x79, 0x71}; // 共阴0~9~A~F
8 const unsigned char TUBE_TABLE_1[16]={0x01,0x21,0x30,0x18,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x0
-c,0x06,0x03};
9 // 产生IIC总线起始信号
10 static void TM1650_IIC_start(void)
11 {
12 1 scl = 1; // SCL=1
13 1 sda = 1; // SDA=1
14 1 Delay4us();
15 1 sda = 0; // SDA=0
16 1 Delay4us();
17 1 scl = 0; // SCL=0
18 1 }
19 // 产生IIC总线结束信号
20 static void TM1650_IIC_stop(void)
21 {
22 1 scl = 0; // SCL=0
23 1 sda = 0; // SDA=0
24 1 Delay4us();
25 1 scl = 1; // SCL=1
26 1 Delay4us();
27 1 sda = 1; // SDA=1
28 1 }
29 // 通过IIC总线发送一个字节
30 static void TM1650_IIC_write_byte(unsigned char dat)
31 {
32 1 unsigned char i;
33 1 scl = 0;
34 1 for (i = 0; i < 8; i++)
35 1 {
36 2 do
37 2 {
38 3 if (dat & 0x80)
39 3 sda = 1; // SDA=1
40 3 else
41 3 sda = 0;
42 3 } while (0);
43 2 dat <<= 1;
44 2 Delay2us();
45 2 scl = 1;
46 2 Delay2us();
47 2 scl = 0;
48 2 Delay2us();
49 2 }
50 1 }
51 // 通过IIC总线接收从机响应的ACK信号
C51 COMPILER V9.60.0.0 TM1650 03/23/2023 15:55:27 PAGE 2
52 static unsigned char TM1650_IIC_wait_ack(void)
53 {
54 1 unsigned char ack_signal = 0;
55 1 sda = 1; // SDA=1
56 1 Delay2us();
57 1 ack_signal = sda;
58 1 scl = 1;
59 1 Delay2us();
60 1 // if(sda == 0)
61 1 // ack_signal = 1; //如果读取到的是NACK信号
62 1 scl = 0;
63 1 Delay2us();
64 1 return ack_signal;
65 1 }
66
67 // 作用:设置显示参数
68 // 备注:这个操作不影响显存中的数据
69 // 用例:
70 // 设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
71 // 关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
72 static void TM1650_cfg_display(unsigned char x)
73 {
74 1 TM1650_IIC_start();
75 1 TM1650_IIC_write_byte(0x48);
76 1 TM1650_IIC_wait_ack(); // 固定命令
77 1 TM1650_IIC_write_byte(x);
78 1 TM1650_IIC_wait_ack(); // 参数值
79 1 TM1650_IIC_stop();
80 1 }
81 // 在DIG1位上显示数字3: TM1650_print(TM1650_DIG1,TUBE_TABLE_0[3]);
82 void TM1650_print(unsigned char dig, unsigned char seg_data)
83 {
84 1
85 1 TM1650_IIC_start();
86 1 TM1650_IIC_write_byte(dig * 2 + 0x68);
87 1 TM1650_IIC_wait_ack(); // 显存起始地址为0x68
88 1 TM1650_IIC_write_byte(seg_data);
89 1 TM1650_IIC_wait_ack(); // 发送段码
90 1 TM1650_IIC_stop();
91 1 }
92 // 将显存数据全部刷为0清空显示
93 static void TM1650_clear(void)
94 {
95 1 unsigned char a;
96 1 for (a = TM1650_DIG1; a <= TM1650_DIG4; a++)
97 1 {
98 2 TM1650_print(a, 0); // 将显存数据刷为0
99 2 }
100 1 }
101 // TM1650初始化
102 void TM1650_init(void)
103 {
104 1 sda = 1; // 释放SDA线
105 1 scl = 1; // 释放SCL线
106 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
107 1 TM1650_clear(); // 将显存内容清0
108 1 }
109
110 void TM1650_printpogrun(u8 set,u8 mode) // 显示run
111 {
112 1 sda = 1; // 释放SDA线
113 1 scl = 1; // 释放SCL线
C51 COMPILER V9.60.0.0 TM1650 03/23/2023 15:55:27 PAGE 3
114 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
115 1 TM1650_print(TM1650_DIG1, TUBE_TABLE_1[mode]);
116 1 Delay4us();
117 1 TM1650_print(TM1650_DIG2, 0x73);
118 1 Delay4us();
119 1 TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set]);
120 1 Delay4us();
121 1 TM1650_print(TM1650_DIG4, TUBE_TABLE_1[mode+8]);
122 1 }
123 void TM1650_printpogstop(u8 set) // 显示run
124 {
125 1 sda = 1; // 释放SDA线
126 1 scl = 1; // 释放SCL线
127 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
128 1 TM1650_print(TM1650_DIG1, 0x40);
129 1 Delay4us();
130 1 TM1650_print(TM1650_DIG2, 0x73);
131 1 Delay4us();
132 1 TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set]);
133 1 Delay4us();
134 1 TM1650_print(TM1650_DIG4, 0x40);
135 1 }
136 void TM1650_print_SMG1(u8 set) // 显示----页面0显示
137 {
138 1 sda = 1; // 释放SDA线
139 1 scl = 1; // 释放SCL线
140 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
141 1 TM1650_print(TM1650_DIG1, 0x40);
142 1 Delay4us();
143 1 if (set > 99)
144 1 TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
145 1 else
146 1 TM1650_print(TM1650_DIG2, 0x00);
147 1 Delay4us();
148 1 if (set > 9)
149 1 TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
150 1 else
151 1 TM1650_print(TM1650_DIG3, 0x00);
152 1 Delay4us();
153 1 TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
154 1 }
155 void TM1650_print_SMG2(u16 set) // 显示----页面0显示
156 {
157 1 sda = 1; // 释放SDA线
158 1 scl = 1; // 释放SCL线
159 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
160 1 TM1650_print(TM1650_DIG1, 0x48);
161 1 Delay4us();
162 1 if (set > 99)
163 1 TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
164 1 else
165 1 TM1650_print(TM1650_DIG2, 0x00);
166 1 Delay4us();
167 1 if (set > 9)
168 1 TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
169 1 else
170 1 TM1650_print(TM1650_DIG3, 0x00);
171 1 Delay4us();
172 1 TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
173 1 }
174 void TM1650_print_SMG3(u8 set) // 显示----页面0显示
175 {
C51 COMPILER V9.60.0.0 TM1650 03/23/2023 15:55:27 PAGE 4
176 1 sda = 1; // 释放SDA线
177 1 scl = 1; // 释放SCL线
178 1 TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
179 1 TM1650_print(TM1650_DIG1, 0x49);
180 1 Delay4us();
181 1 if (set > 99)
182 1 TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
183 1 else
184 1 TM1650_print(TM1650_DIG2, 0x00);
185 1 Delay4us();
186 1 if (set > 9)
187 1 TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
188 1 else
189 1 TM1650_print(TM1650_DIG3, 0x00);
190 1 Delay4us();
191 1 TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
192 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 657 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 32 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)

1941
Motorcontroller.uvgui.User Normal file

File diff suppressed because one or more lines are too long

289
Motorcontroller.uvopt Normal file
View File

@ -0,0 +1,289 @@
<?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; *.o</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>35000000</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>255</CpuCode>
<DebugOpt>
<uSim>1</uSim>
<uTrg>0</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>0</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>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>-1</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon></pMon>
</DebugOpt>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</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>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
</TargetOption>
</Target>
<Group>
<GroupName>Source Group 1</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\STARTUP.A51</PathWithFileName>
<FilenameWithoutPath>STARTUP.A51</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>mycode</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\delay.c</PathWithFileName>
<FilenameWithoutPath>delay.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\GPIO.c</PathWithFileName>
<FilenameWithoutPath>GPIO.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\UART.C</PathWithFileName>
<FilenameWithoutPath>UART.C</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\timer.c</PathWithFileName>
<FilenameWithoutPath>timer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\tm1650.c</PathWithFileName>
<FilenameWithoutPath>tm1650.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\common.c</PathWithFileName>
<FilenameWithoutPath>common.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\mycode\EEPROM.c</PathWithFileName>
<FilenameWithoutPath>EEPROM.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
</ProjectOpt>

435
Motorcontroller.uvproj Normal file
View File

@ -0,0 +1,435 @@
<?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>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STC8G1K08 Series</Device>
<Vendor>STC</Vendor>
<Cpu>IRAM(0-0xFF) XRAM(0-0x03FF) IROM(0-0x1FF8) CLOCK(35000000) MODP2</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile>"LIB\STARTUP.A51" ("Standard 8051 Startup Code")</StartupFile>
<FlashDriverDll></FlashDriverDll>
<DeviceId>63316</DeviceId>
<RegisterFile>STC8.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>STC\</RegisterFilePath>
<DBRegisterFilePath>STC\</DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>.\Objects\</OutputDirectory>
<OutputName>Motorcontroller</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>-pDP8051</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>1</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>0</UseTarget>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>0</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>-1</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></Driver>
</TargetDlls>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>0</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
<Capability>0</Capability>
<DriverSelection>-1</DriverSelection>
</Flash1>
<bUseTDR>0</bUseTDR>
<Flash2></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>1</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>
<hadXRAM3>0</hadXRAM3>
<ModC2>0</ModC2>
<ModH2>0</ModH2>
<Mdu_R515>0</Mdu_R515>
<Mdu_F120>0</Mdu_F120>
<Psoc>0</Psoc>
<hadIROM2>0</hadIROM2>
<hadIROM3>0</hadIROM3>
<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>0x1ff9</Size>
</IRO>
<IRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x100</Size>
</IRA>
<XRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x400</Size>
</XRA>
<XRA512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA512>
<IROM512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM512>
<XRA513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA513>
<IROM513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM513>
</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>.\myinc</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 1</GroupName>
<Files>
<File>
<FileName>STARTUP.A51</FileName>
<FileType>2</FileType>
<FilePath>.\STARTUP.A51</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>mycode</GroupName>
<Files>
<File>
<FileName>delay.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\delay.c</FilePath>
</File>
<File>
<FileName>GPIO.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\GPIO.c</FilePath>
</File>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\main.c</FilePath>
</File>
<File>
<FileName>UART.C</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\UART.C</FilePath>
</File>
<File>
<FileName>timer.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\timer.c</FilePath>
</File>
<File>
<FileName>tm1650.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\tm1650.c</FilePath>
</File>
<File>
<FileName>common.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\common.c</FilePath>
</File>
<File>
<FileName>EEPROM.c</FileName>
<FileType>1</FileType>
<FilePath>.\mycode\EEPROM.c</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
</Project>

1
Objects/EEPROM.__i Normal file
View File

@ -0,0 +1 @@
"mycode\EEPROM.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\EEPROM.lst) TABS (2) OBJECT(.\Objects\EEPROM.obj)

BIN
Objects/EEPROM.obj Normal file

Binary file not shown.

1
Objects/GPIO.__i Normal file
View File

@ -0,0 +1 @@
"mycode\GPIO.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\GPIO.lst) TABS (2) OBJECT(.\Objects\GPIO.obj)

BIN
Objects/GPIO.obj Normal file

Binary file not shown.

BIN
Objects/I2C.obj Normal file

Binary file not shown.

BIN
Objects/Motorcontroller Normal file

Binary file not shown.

View File

@ -0,0 +1,39 @@
<html>
<body>
<pre>
<h1>µVision Build Log</h1>
<h2>Tool Versions:</h2>
IDE-Version: ¦ÌVision V5.27.1.0
Copyright (C) 2019 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information: xx xx, xx, LIC=WH7DL-0DZI4-3A0DP-MA9EC-R17VA-4MPD4
Tool Versions:
Toolchain: PK51 Prof. Developers Kit Version: 9.60.0.0
Toolchain Path: d:\Keil_v5\C51\BIN
C Compiler: C51.exe V9.60.0.0
Assembler: A51.exe V8.2.7.0
Linker/Locator: BL51.exe V6.22.2.0
Library Manager: LIB51.exe V4.30.1.0
Hex Converter: OH51.exe V2.7.0.0
CPU DLL: S8051.DLL V3.122.0.0
Dialog DLL: DP51.DLL V2.67.0.0
<h2>Project:</h2>
e:\my code all\stc\Motorcontroller\Motorcontroller.uvproj
Project File Date: 03/17/2023
<h2>Output:</h2>
Build target 'Target 1'
compiling timer.c...
compiling common.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_PRINTSTRING1?UART
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_TM1650_PRINT_SMG3?TM1650
Program Size: data=100.1 xdata=64 code=8087
creating hex file from ".\Objects\Motorcontroller"...
".\Objects\Motorcontroller" - 0 Error(s), 2 Warning(s).
Build Time Elapsed: 00:00:00
</pre>
</body>
</html>

563
Objects/Motorcontroller.hex Normal file
View File

@ -0,0 +1,563 @@
:030000000218DC07
:0C18DC00787FE4F6D8FD758163021923C3
:0F1F5E007D607C09ED1D70011C144C70F7DFF1E4
:011F6D002251
:0600030000007F0CDFFE8F
:0100090022D4
:05000E00007F05DFFE8C
:0100130022CA
:10102300EFD394077480948040037F0122120999BF
:10103300FED394037480948040037F0222EF7044B4
:10104300EE700B9000011209B2F4529352941209FC
:10105300996401700B9000011209B24293F4529407
:10106300120999FE6402700A9000011209B24293B8
:101073004294EE6403700D9000011209B2FEF45223
:1010830093EE4294EF64017046120999FE700B903F
:1010930000011209B2F452915292EE6401700B9066
:1010A30000011209B24291F452921209996402703A
:1010B3000A9000011209B242914292120999640303
:1010C300700D9000011209B2FEF45291EE4292EFBC
:1010D30064027046120999FE700B9000011209B266
:1010E300F452955296EE6401700B9000011209B20E
:1010F3004295F452961209996402700A9000011203
:1011030009B2429542961209996403700D90000149
:101113001209B2FEF45295EE4296EF640370461242
:101123000999FE700B9000011209B2F452B152B248
:10113300EE6401700B9000011209B242B1F452B295
:101143001209996402700A9000011209B242B14275
:10115300B21209996403700D9000011209B2FEF4F2
:1011630052B1EE42B2EF64047046120999FE700B5D
:101173009000011209B2F452B352B4EE6401700B41
:101183009000011209B242B3F452B41209996402F5
:10119300700A9000011209B242B342B41209996471
:1011A30003700D9000011209B2FEF452B3EE42B483
:1011B300EF64057046120999FE700B900001120945
:1011C300B2F452C952CAEE6401700B9000011209C5
:1011D300B242C9F452CA1209996402700A9000011A
:1011E3001209B242C942CA1209996403700D9000F0
:1011F300011209B2FEF452C9EE42CAEF6406704608
:10120300120999FE700B9000011209B2F452CB52ED
:10121300CCEE6401700B9000011209B242CBF45280
:10122300CC1209996402700A9000011209B242CBF0
:1012330042CC1209996403700D9000011209B2FEA9
:10124300F452CBEE42CCEF64077049120999FF7E4A
:1012530000700B9000011209B2F452E152E2EF6404
:10126300014E700B9000011209B242E1F452E212F6
:1012730009996402700A9000011209B242E142E244
:101283001209996403700D9000011209B2FFF45220
:07129300E1EF42E27F0022BF
:101D08007543ECE4F542FB7A0079427F0312102315
:101D180075431C7542037F011210237543E1E4F5F6
:101D2800427F01121023754310E4F5427F0512101B
:031D380023D2941F
:011D3B002285
:05001E0025640D0A003D
:10002600120014121D70121D08121E58121D3CD209
:10003600AF7F0A121F5E1200A612129A121B3A1204
:100046001E017BFF7A00791E856148856047855FC2
:0900560046855E4512069F80DD1F
:0614DF008B4E8A4F89507C
:1014E500EF640160030216D9755601F557F558F5F5
:1014F50059F55AF55BF55CFFEFC394207480948031
:10150500500F74202FF582E43400F583E4F00F804A
:10151500E7E4FFEFC3942074809480500F74002F8C
:10152500F582E43400F583E4F00F80E7AB4EAA4F73
:10153500A95090000A1209B2FD7C00D3940374806F
:10154500948040037F0222ED4C700553B7EFC2BC77
:10155500AB4EAA4FA95090000A1209B2640170055A
:1015650053B7EFD2BC90000A1209B2FF7E006402A5
:10157500700543B710C2BCEF64034E700543B71046
:10158500D2BC120999FD7C00D394C074809480402C
:10159500037F0222120999FFE598543F4FF598ED14
:1015A50064C04C6008EF6440600302166690000258
:1015B500120C297F807E8D7D5B7C00120B738F540E
:1015C5008E538D528C51E4FFFE7D01FCAB54AA5322
:1015D500A952A851C3120C0540037F0222C3E4950A
:1015E50054F554E49553F55374019552F552E49529
:1015F50051F551AB4EAA4FA9509000011209B2FB0B
:101605007A006401702CC28E538EFE5389BF5389B4
:10161500CF438E40AF54AE53AD52AC517808120C47
:10162500168F8D85548BC2AB5389BF538FFDD28ED8
:101635008069EB64024A7026538EEF438E01538E08
:10164500F7438E04AF54AE53AD52AC517808120C2B
:10165500168FD68554D753AFFB438E10803D7F023E
:1016650022AB4EAA4FA950120999FF7E0070149023
:1016750000081209B264017005438E20801D538E47
:10168500DF8018EF64804E70129000081209B26472
:10169500017005438780800353877FAB4EAA4FA90E
:1016A500509000091209B264017004D2AC8002C2E4
:1016B500AC9000071209B264017004D29C8002C28A
:1016C5009C90000B1209B254C0FFE5A2543F4FF5A0
:0616D500A27F00227F024B
:0116DB0022EC
:101E810074202558F582E43400F583EFF00558C33A
:101E9100E5589420748094804003E4F558E5597026
:071EA10005755901D29922D9
:101F3800120999FF600C121E81740129F9E43AFA1A
:031F480080EE2206
:030023000219EBD4
:1019EB00C0E0C083C082C0D075D000C0073098283B
:1019FB00C298E55C7022C3E55A94207480948040B1
:101A0B0003755A00AF5A055A74002FF582E434005F
:101A1B00F583E599F0755B0530992BC299E5576510
:101A2B0058602074202557F582E43400F583E0F5E7
:101A3B00990557C3E55794207480948040087557D7
:101A4B00008003755900D007D0D0D082D083D0E06E
:011A5B003258
:101E58007542407543017547007546C27545017561
:101E68004400754901E4F54A754B01F54CF54DFB05
:091E78007A0079427F010214DFB7
:05009E00AE07021E8107
:071BA80002620000015D0074
:03000B00021836A2
:10183600C0E0C0F0C083C082C0D075D000C000C078
:1018460001C002C003C004C005C006C007E50964A4
:101856000370277E017490A817088005C333CE3322
:10186600CED8F9FFEE3395E0FDFCAB61AA60A95F27
:10187600A85ED3120C055002C292E4FFFEFDFCAB3B
:1018860061AA60A95FA85ED3120C05500E756100AF
:10189600756000755F00755E008020E50A64017062
:1018A6001AE56124FFF561E56034FFF560E55F3414
:1018B600FFF55FE55E34FFF55EB293D007D006D044
:1018C60005D004D003D002D001D000D0D0D082D031
:0618D60083D0F0D0E032E7
:03001B0002000AD6
:01000A0032C3
:03006300021C0775
:101C0700C0E0C0D00563E56370020562C394C8E510
:101C1700629400402E309213E55D9407748094809F
:101C27004005755D008016055D8012D3E55D940063
:101C3700748094805005755D078002155D7562009C
:101C4700756300E514600A051EE51E700A051D8010
:0C1C570006751D00751E00D0D0D0E032D4
:03009B0002001A46
:01001A0032B3
:0300A30002005FF9
:01005F00326E
:100CF200AD07EDD394047480948040037F0122ED0C
:100D02006003020DC7C28C9000021209B264017026
:100D120004D2A98002C2A99000011209B2FED394A2
:100D2200037480948040037F0222EEFF7E007005F0
:100D320053B7FDC2B9EF64014E700553B7FDD2B986
:100D4200EF64024E700543B702C2B9EF64034E70FE
:100D52000543B702D2B9120999FEC3940374809471
:100D62008040037F0222E58954FC4EF589900003FE
:100D72001209B2FF7E0064017003538E7FEF4E7042
:100D820003438E80EF64024E70054389048003534F
:100D920089FB9000041209B264017005438F01803F
:100DA20003538FFE900005120AB0E5F0F58C900017
:100DB20005120AB0F58A9000071209B264017002A6
:100DC200D28C7F0022ED64016003020E94C28E90E9
:100DD20000021209B264017004D2AB8002C2AB906D
:100DE20000011209B2FED394037480948040037F01
:100DF2000222EEFF7E00700553B7F7C2BBEF64011B
:100E02004E700553B7F7D2BBEF64024E700543B77D
:100E120008C2BBEF64034E700543B708D2BB120988
:100E220099FEC394037480948040037F0222EEC42F
:100E320054F0FFE58954CF4FF5899000031209B2AF
:100E4200FF7E0064017003538EBFEF4E7003438E2A
:100E520040EF64024E700543894080035389BF907E
:100E620000041209B264017005438F028003538F9C
:100E7200FD900005120AB0E5F0F58D900005120A0A
:100E8200B0F58B9000071209B264017002D28E7F16
:100E92000022ED6402707C538EEF9000021209B2C0
:100EA2006401700543AF04800353AFFB900003124B
:100EB20009B2FED394027480948040037F0222EE32
:100EC200FF7E0064017003538EFBEF4E7003438E6E
:100ED20004EF64024E7005438E088003538EF79030
:100EE20000041209B264017005438F048003538F1A
:100EF200FB900005120AB0E5F0F5D6900005120A43
:100F0200B0F5D79000071209B264017003438E1046
:100F12007F0022ED6403707C53D1F7900002120926
:100F2200B26401700543AF20800353AFDF9000032A
:100F32001209B2FED394027480948040037F02228D
:100F4200EEFF7E006401700353D1FDEF4E70034348
:100F5200D102EF64024E700543D104800353D1FBEA
:100F62009000041209B26401700543D10180035359
:100F7200D1FE900005120AB0E5F0F5D490000512FA
:100F82000AB0F5D59000071209B26401700343D18B
:100F9200087F0022ED6404600302102053D17F9089
:100FA20000021209B26401700543AF40800353AFDF
:100FB200BF9000031209B2FD7C00D39402748094A6
:100FC2008040037F0222ED64014C700353D1DF9015
:100FD20000031209B2700343D1209000031209B238
:100FE2006402700543D140800353D1BF90000412C4
:100FF20009B26401700543D110800353D1EF900010
:1010020005120AB0FDACF0ECF5D2AF058FD390001B
:10101200071209B26401700343D1807F00227F026C
:0110220022AB
:101D7000E4F542F543754401F545F5467547FF75B1
:101D80004810754901FB7A007942FF120CF2E4F524
:101D900045F5467547A27548407549017F02020C1A
:011DA000F250
:101BAF0010223F065B4F666D7D077F6F777C395E36
:101BBF007971103201213018080000000100000077
:041BCF00080C0603F5
:0F1F6E00D2B2D2B3120003C2B3120003C2B22226
:0F1F7D00C2B2C2B3120003D2B2120003D2B32217
:020066008F49C0
:10006800C2B2E4F54AC3E54A9408748094805022E9
:10007800E54930E704D2B38002C2B3E54925E0F58B
:100088004912000ED2B212000EC2B212000E054A78
:0200980080D313
:01009A002243
:101EEA00E4F549D2B312000EA2B3E433F549D2B2F3
:0A1EFA0012000EC2B212000EAF4932
:011F040022BA
:061ECC00D2B3D2B27F5137
:101ED2008F47121F6E7F48120066121EEAAF47122A
:081EE2000066121EEA021F7DDA
:051EA800F8E6FD7F02D9
:101EAD008F478D48121F6EE54725E02468FF12000D
:0F1EBD0066121EEAAF48120066121EEA021F7D6F
:101F0500E4F542D3E542940374809480500BE4FDDC
:091F1500AF42121EAD054280EA44
:011F1E0022A0
:06001400121ECC021F05C4
:101CD2008F458D46121ECC74322546F8E6FDE4FF90
:101CE200121EAD1200037D737F01121EAD1200039E
:101CF20074222545121EA8120003743A2546F8E6FE
:061D0200FD7F03021EAD8F
:101E2E008F45121ECC7D40E4FF121EAD1200037DC5
:101E3E00737F01121EAD12000374222545121EA8D7
:0A1E4E001200037D407F03021EAD69
:101A5C008F45121ECC7D40E4FF121EAD120003D345
:101A6C00E5459463748094804012E54575F0648478
:101A7C0075F00A84742225F0F8E68001E4FD7F01FC
:101A8C00121EAD120003D3E5459409748094804076
:101A9C0012E54575F00A8475F00A84742225F0F875
:101AAC00E68001E4FD7F02121EAD120003E54575D0
:0F1ABC00F00A84742225F0F8E6FD7F03021EADC8
:101968008E458F46121ECC7D48E4FF121EAD120034
:1019780003D3E5469463E54594004019AE45AF4668
:101988007C007D64120A257C007D0A120A257422D7
:101998002DF8E68001E4FD7F01121EAD120003D38D
:1019A800E5469409E54594004019AE45AF467C00EC
:1019B8007D0A120A257C007D0A120A2574222DF858
:1019C800E68001E4FD7F02121EAD120003AE45AFB2
:1019D800467C007D0A120A2574222DF8E6FD7F0355
:0319E800021EAD2F
:101ACB008F1F121ECC7D49E4FF121EAD120003D3F3
:101ADB00E51F9463748094804012E51F75F0648455
:101AEB0075F00A84742225F0F8E68001E4FD7F018D
:101AFB00121EAD120003D3E51F940974809480402D
:101B0B0012E51F75F00A8475F00A84742225F0F82B
:101B1B00E68001E4FD7F02121EAD120003E51F7586
:0F1B2B00F00A84742225F0F8E6FD7F03021EAD58
:101BD300011400010901010A04021D0000010800AB
:101BE30001193C011A3C011B3C011C3C0115040179
:101BF3001604011704011804090B0000000000007B
:031C0300000000DE
:10178A00E50860047F6480027FF4E50A24FD604B6B
:10179A00046003021835E5147018041209DF1209EF
:1017AA0099C394647480948040057464120A017524
:1017BA001401EFFDD3E51E9DE51D9400406D7401F3
:1017CA001209DFE4F51DF51E750801120999C39483
:1017DA00647480948040547464804DE514701EAB28
:1017EA0045AA46A947041209DF120999C394087445
:1017FA0080948040057408120A01751401D3E51E0D
:10180A009FE51D94004024AB45AA46A947740112DE
:10181A0009DFE4F51DF51E750801120999C394083C
:0B182A007480948040057408120A01CD
:011835002290
:1016DC00E50860047F6480027FF4E50A24FD604C19
:1016EC00046003021789E514701974FF1209DF12E4
:1016FC000999D3940A748094805005740A120A01D3
:10170C00751401EFFDD3E51E9DE51D9400406E742C
:10171C00FF1209DFE4F51DF51E750801120999D3B6
:10172C00940A748094805055740A8049E514702092
:10173C00AB45AA46A947120999D3940074809480AA
:10174C005006E4120A01800574FF1209DF751401BA
:10175C00D3E51E9FE51D94004023E4F51DF51E7591
:10176C000801AB45AA46A947120999D39400748085
:0D177C0094805004E4020A0174FF1209DF9A
:01178900223D
:10129A0020951FE514701BAF15FE7C017D90120A84
:1012AA0013E48F618E60F55FF55ED29275090112C3
:1012BA001C6320961FE514701BAF16FE7C017D90FF
:1012CA00120A13E48F618E60F55FF55EC2927509AA
:1012DA0002121C6320972CE51470287E037420A840
:1012EA0017088005C333CE33CED8F9FFEE3395E025
:1012FA008F618E60F55FF55ED292750903751401F0
:10130A00121C6620CC15E5147011F561F560F55FC5
:10131A00F55E750904751401121C66209029E514FE
:10132A007025E50A24FE600C14600E146004240380
:10133A007012800D750A03800B750A04121C6680F0
:10134A0003750A0275140120B755E50924FE601BCE
:10135A0014602914603724037045754500754600EA
:10136A007547157B007A00791980317545007546F5
:10137A00007547167B007A00791A8020754500753A
:10138A0046007547177B007A00791B800F75450068
:10139A007546007547187B007A00791C12178A2057
:1013AA00B655E50924FE601B14602914603724032E
:1013BA0070457545007546007547157B007A0079BA
:1013CA001980317545007546007547167B007A000D
:1013DA00791A80207545007546007547177B007A93
:1013EA0000791B800F7545007546007547187B000C
:1013FA007A00791C1216DC20B577E5147073E50AB9
:10140A0064016005750A018003750A04121C667579
:10141A001401E50924FE6019146037240270527E13
:10142A00017490A815088005C333CE33CED8F9804D
:10143A00317E017490A816088005C333CE33CED806
:10144A00F9FFEE3395E08F618E60F55FF55EC2922B
:10145A00801F7E037420A817088005C333CE33CEBD
:10146A00D8F9FFEE3395E08F618E60F55FF55ED2B5
:10147A00923096047F0180027F003095047E0180BD
:10148A00027E00EE5FFF3097047E0180027E00EE4E
:10149A005FFF30CC047E0180027E00EE5FFF309059
:1014AA00047E0180027E00EE5FFF30B7047E018079
:1014BA00027E00EE5FFF30B6047E0180027E00EEFF
:1014CA005FFF30B5047E0180027E00EE5F6005E4B6
:0514DA00F514F50822E5
:101DD2008F428C438D44E50A24FE60111460131473
:101DE200601724037018AD5DAF09021CD2AF420226
:0F1DF2001A5CAF44AE43021968AF09121E2E22CD
:101B3A00E50924FE60211460351460492403705DB0
:101B4A007E007401A815088005C333CE33CED8F9B8
:101B5A00FDAC06AF1980437E007401A81608800503
:101B6A00C333CE33CED8F9FDAC06AF1A802C7E0033
:101B7A007401A817088005C333CE33CED8F9FDAC5B
:101B8A0006AF1B80157E007401A818088005C333B0
:0E1B9A00CE33CED8F9FDAC06AF1C121DD22200
:1000A600E50924FE700302024A1470030203961443
:1000B60070030204E22403600302063CE51975F0AE
:1000C60014A4FBAAF07E007401A815088005C333AA
:1000D600CE33CED8F9FDAC06AF03AE02120A137CBE
:1000E600007D03120A7AC3EF9490EE940140030256
:1000F6000194538E7FAF197E007C007D50120C59FF
:10010600C004C005C006C0077E007401A81508809B
:1001160005C333CE33CED8F9FFEE3395E0FDFCD0E0
:1001260003D002D001D000120AE8A804A905AA0645
:10013600AB077F007E367D6E7C01120B73C3E49F96
:10014600FFE49EFE74019DFDE49CFCE4FB7A01F94C
:10015600F8120B738F8CAF197E007C007D50120C49
:1001660059C004C005C006C0077E007401A8150862
:100176008005C333CE33CED8F9FFEE3395E0FDFCD0
:10018600D003D002D001D000120AE802023F438E0B
:1001960080AF197E007C007D14120C59C004C00586
:1001A600C006C0077E007401A815088005C333CEBB
:1001B60033CED8F9FFEE3395E0FDFCD003D002D064
:1001C60001D000120AE8E47B03FAF9F8120B73A8CF
:1001D60004A905AA06AB077F007E367D6E7C011258
:1001E6000B73C3E49FFFE49EFE74019DFDE49CFC3B
:1001F600E4FB7A01F9F8120B738F8CAF197E007C41
:10020600007D14120C59C004C005C006C0077E004C
:100216007401A815088005C333CE33CED8F9FFEE96
:100226003395E0FDFCD003D002D001D000120AE8DD
:10023600E47B03FAF9F8120B73A804A905AA06AB26
:100246000702062BE51A75F014A4FBAAF07E0074CB
:1002560001A816088005C333CE33CED8F9FDAC0607
:10026600AF03AE02120A137C007D03120A7AC3EFB3
:100276009490EE94014003020304538E7FE51A75B1
:10028600F050A4FBAAF07E007401A816088005C3EE
:1002960033CE33CED8F9FDAC06AF03AE02120A1345
:1002A600AB07AA06EA3395E0F9F87F007E367D6E45
:1002B6007C01120B73C3E49FFFE49EFE74019DFD57
:1002C600E49CFCE4FB7A01F9F8120B738F8CE51AB7
:1002D60075F050A4FBAAF07E007401A816088005EC
:1002E600C333CE33CED8F9FDAC06AF03AE02120A45
:1002F60013AB07AA06EA3395E0F9F802062B438EFC
:1003060080E51A75F014A4FBAAF07E007401A81605
:10031600088005C333CE33CED8F9FDAC06AF03AEA5
:1003260002120A137C007D03120A7AAB07AA06EAB8
:100336003395E0F9F87F007E367D6E7C01120B73F3
:10034600C3E49FFFE49EFE74019DFDE49CFCE4FB78
:100356007A01F9F8120B738F8CE51A75F014A4FB69
:10036600AAF07E007401A816088005C333CE33CEEA
:10037600D8F9FDAC06AF03AE02120A137C007D036A
:10038600120A7AAB07AA06EA3395E0F9F802062BB9
:10039600E51B75F014A4FBAAF07E007401A81708EB
:1003A6008005C333CE33CED8F9FDAC06AF03AE021B
:1003B600120A137C007D03120A7AC3EF9490EE941E
:1003C600014003020450538E7FE51B75F050A4FBD9
:1003D600AAF07E007401A817088005C333CE33CE79
:1003E600D8F9FDAC06AF03AE02120A13AB07AA0694
:1003F600EA3395E0F9F87F007E367D6E7C01120BBC
:1004060073C3E49FFFE49EFE74019DFDE49CFCE43F
:10041600FB7A01F9F8120B738F8CE51B75F050A46B
:10042600FBAAF07E007401A817088005C333CE33FB
:10043600CED8F9FDAC06AF03AE02120A13AB07AA7B
:1004460006EA3395E0F9F802062B438E80E51B7524
:10045600F014A4FBAAF07E007401A817088005C357
:1004660033CE33CED8F9FDAC06AF03AE02120A1373
:100476007C007D03120A7AAB07AA06EA3395E0F9F7
:10048600F87F007E367D6E7C01120B73C3E49FFFFE
:10049600E49EFE74019DFDE49CFCE4FB7A01F9F800
:1004A600120B738F8CE51B75F014A4FBAAF07E006B
:1004B6007401A817088005C333CE33CED8F9FDAC36
:1004C60006AF03AE02120A137C007D03120A7AAB52
:1004D60007AA06EA3395E0F9F802062BE51C75F043
:1004E60014A4FBAAF07E007401A818088005C33383
:1004F600CE33CED8F9FDAC06AF03AE02120A137C9A
:10050600007D03120A7AC3EF9490EE940140030231
:10051600059C538E7FE51C75F050A4FBAAF07E0067
:100526007401A818088005C333CE33CED8F9FDACC4
:1005360006AF03AE02120A13AB07AA06EA3395E02A
:10054600F9F87F007E367D6E7C01120B73C3E49F43
:10055600FFE49EFE74019DFDE49CFCE4FB7A01F938
:10056600F8120B738F8CE51C75F050A4FBAAF07E75
:10057600007401A818088005C333CE33CED8F9FD20
:10058600AC06AF03AE02120A13AB07AA06EA33950E
:10059600E0F9F802062B438E80E51C75F014A4FBE7
:1005A600AAF07E007401A818088005C333CE33CEA6
:1005B600D8F9FDAC06AF03AE02120A137C007D0328
:1005C600120A7AAB07AA06EA3395E0F9F87F007EAD
:1005D600367D6E7C01120B73C3E49FFFE49EFE74AE
:1005E600019DFDE49CFCE4FB7A01F9F8120B738F84
:1005F6008CE51C75F014A4FBAAF07E007401A81803
:10060600088005C333CE33CED8F9FDAC06AF03AEB2
:1006160002120A137C007D03120A7AAB07AA06EAC5
:100626003395E0F9F87F007E367D6E7C01120B7300
:07063600C3E49FFF8F8A223D
:101E0100E50A24FE602314602014601D2403701C65
:101E1100E4FFFEFDFCAB61AA60A95FA85EC3120CE2
:0D1E2100057003750A04C29422D294222297
:101D3C007B007A00790B7547007548097F047E009B
:101D4C00121DA1E50BF4601B850B19850C1A850D72
:101D5C001B850E1C850F15851016851117851218FD
:041D6C0085130922B0
:031C6300751401F4
:101C66007F047E00121F4B85190B851A0C851B0DF0
:101C7600851C0E85150F851610851711851812857A
:101C860009137B007A00790B7547007548097F04B4
:051C96007E00021C9B12
:0E1F8C00E4F5C7F5C5F5C675C3FF75C4FF22A1
:061F1F008CC3AF058FC466
:101F2500A2AF92D5C2AF75C65A75C6A50000A2D597
:031F350092AF2246
:101DA100AD07AC0675C78075F51875C501121F1F03
:101DB100E5C2120A010DBD00010C740129F9E43AD2
:101DC100FAE54815487002154714454770DF021FB0
:011DD1008C85
:101F4B00AD07AC0675C78075F51875C503121F1F55
:031F5B00021F8CD6
:101C9B00AD07AC0675C78075F51875C5028CC3AF5B
:101CAB00058FC4120999F5C2121F250DBD00010C39
:101CBB00740129F9E43AFAE54815487002154714FE
:071CCB00454770D9021F8C90
:1018E800020026E493A3F8E493A34003F68001F2F0
:1018F80008DFF48029E493A3F85407240CC8C33301
:10190800C4540F4420C8834004F456800146F6DFCF
:10191800E4800B0102040810204080901BA8E47E9C
:10192800019360BCA3FF543F30E509541FFEE493C4
:10193800A360010ECF54C025E060A840B8E493A38B
:10194800FAE493A3F8E493A3C8C582C8CAC583CAB6
:10195800F0A3C8C582C8CAC583CADFE9DEE780BE6E
:011C060000DD
:10099900BB010689828A83E0225002E722BBFE025C
:0909A900E32289828A83E493228F
:1009B200BB010CE58229F582E5833AF583E02250FA
:1009C20006E92582F8E622BBFE06E92582F8E22244
:0D09D200E58229F582E5833AF583E493225E
:1009DF00BB010989828A83F8E028F022500327F7A8
:1009EF0022BBFE05F8E328F3228A838982F8E49379
:0209FF002822AC
:100A0100BB010689828A83F0225002F722BBFE01D4
:020A1100F322CE
:100A1300EF8DF0A4A8F0CF8CF0A428CE8DF0A42EF7
:020A2300FE22B1
:100A2500BC000BBE0029EF8DF084FFADF022E4CCB5
:100A3500F875F008EF2FFFEE33FEEC33FCEE9DEC7E
:100A4500984005FCEE9DFE0FD5F0E9E4CEFD22EDC4
:100A5500F8F5F0EE8420D21CFEADF075F008EF2F0E
:100A6500FFED33FD4007985006D5F0F222C398FDFF
:050A75000FD5F0EA229C
:100A7A00C2D5EC30E709B2D5E4C39DFDE49CFCEE97
:100A8A0030E715B2D5E4C39FFFE49EFE120A25C3E0
:100A9A00E49DFDE49CFC8003120A2530D507C3E4DB
:060AAA009FFFE49EFE2206
:100AB000BB0110E58229F582E5833AF583E0F5F084
:100AC000A3E0225009E92582F886F008E622BBFE61
:100AD0000AE92582F8E2F5F008E222E5832AF583A7
:080AE000E993F5F0A3E993226C
:100AE800E88FF0A4CC8BF0A42CFCE98EF0A42CFCAD
:100AF8008AF0EDA42CFCEA8EF0A4CDA8F08BF0A42B
:100B08002DCC3825F0FDE98FF0A42CCD35F0FCEB89
:100B18008EF0A4FEA9F0EB8FF0A4CFC5F02ECD394E
:0F0B2800FEE43CFCEAA42DCE35F0FDE43CFC22BB
:100B370075F008758200EF2FFFEE33FECD33CDCC75
:100B470033CCC58233C5829BED9AEC99E5829840F8
:100B57000CF582EE9BFEED9AFDEC99FC0FD5F0D6D5
:100B6700E4CEFBE4CDFAE4CCF9A88222B800C1B9FF
:100B77000059BA002DEC8BF084CFCECDFCE5F0CB3D
:100B8700F97818EF2FFFEE33FEED33FDEC33FCEB76
:100B970033FB10D703994004EB99FB0FD8E5E4F931
:100BA700FA227818EF2FFFEE33FEED33FDEC33FC1E
:100BB700C933C910D7059BE99A4007EC9BFCE99A12
:100BC700F90FD8E0E4C9FAE4CCFB2275F010EF2F57
:100BD700FFEE33FEED33FDCC33CCC833C810D70757
:100BE7009BEC9AE899400AED9BFDEC9AFCE899F892
:0E0BF7000FD5F0DAE4CDFBE4CCFAE4C8F92225
:100C0500EB9FF5F0EA9E42F0E99D42F0E89C45F045
:010C150022BC
:100C1600E8600FECC313FCED13FDEE13FEEF13FFBC
:030C2600D8F122E0
:100C2900BB010DE58229F582E5833AF583020C9330
:100C39005007E92582F8020C86BBFE07E92582F8F0
:100C4900020C9FE58229F582E5833AF583020CAC13
:100C5900EC8EF0A4CCC5F0CCCDF8EFA4CEC5F02D28
:100C6900FDE43CFCE8A42EC8C5F03DFDE43CFCEFE6
:0D0C7900A4FFE5F028FEE43DFDE43CFC2274
:10063D00E5512445F8E60551227842300702784508
:10064D00E475F001120CBC0209992000EB7F2ED24B
:10065D00008018EF540F2490D43440D4FF30040B95
:10066D00EF24BFB41A0050032461FFE55260021558
:10067D00520555E5557002055430070D7842E47565
:10068D00F001120CBCEF020A0102009E7403D207A6
:10069D008003E4C207F5518B428A438944E4F55245
:1006AD00F554F555E55260077F2012067880F575F3
:1006BD0053FFC201C200C202C203C205C206C20874
:1006CD00120646FF700D3007057F00120689AF55E3
:1006DD00AE5422B4255FC2D5C204120646FF24D003
:1006ED00B40A00501A75F00A785230D50508B6FFD5
:1006FD000106C6A426F620D5047002D20380D924A3
:10070D00CFB41A00EF5004C2E5D204020889D20119
:10071D0080C6D20080C0D20280BCD2D580BAD205AC
:10072D0080B47F201206782002077401B552004074
:10073D00F112063DFF1206780206B1D208D20680EC
:10074D009512063DFB12063DFA12063DF94A4B7015
:10075D0006795A7A097BFF20022EE552602A7E0027
:10076D008E827583001209B260060EEE655370F02D
:10077D00C2D5EBC0E0EAC0E0E9C0E0EE1208D0D08F
:10078D00E0F9D0E0FAD0E0FB120999FF60AAEBC0C6
:10079D00E0EAC0E0E9C0E0120678D0E02401F9D02B
:1007AD00E03400FAD0E0FBE5530460DCD553D9808A
:1007BD00877BFF7A0879CCD202809C7910800279F0
:1007CD0008C206C2088008D2D5790A8004790AC207
:1007DD00D5E553047002F553E4FAFDFEFF12063D14
:1007ED00FC7B0820011312063DFD7B1030000A1220
:1007FD00063DFE12063DFF7B20EC3382D592D5508F
:10080D0013C3E43000069FFFE49EFEE42001039D28
:10081D00FDE49CFCE4CBF8C201EC700CCFCECDCC4A
:10082D00E824F8F870F38017C3EF33FFEE33FEEDD5
:10083D0033FDEC33FCEB33FB994002FB0FD8E9EBB6
:10084D00300105F8D0E0C448B201C0E00AEC4D4ECD
:10085D004F78207B0070C2EAB5530040BCC0E01257
:10086D0008D2D0F0D0E0200104C4C0E0C4B201C071
:10087D00F0120661D0F0D5F0EB0206B1120CCC07E8
:10088D004E5307C858071F4C071B4207CC4F07D4C0
:0F089D004407D44907344307DA5507BE4607BE60
:1008AC004507BE47097A5007232D07272E074A2BE9
:1008BC00072B2307482009632A06E3480000074258
:1008CC003F3F3F00790AA2D5200314300509B91027
:1008DC00020404B9080104A2D52006025001042028
:1008EC0002689202B552005034C0E07F20300319E8
:1008FC007F30A20272067205500F120929C202C281
:10090C0006C205C2087F30800F300503E9C0E01233
:10091C000678300503D0E0F9D0E0B552CC3005179D
:10092C007F30B9100C1206787F583004077F78801E
:10093C0003B908031206783002057F2D0206787F72
:10094C00202008F87F2B2006F322920280CF286EFD
:10095C00756C6C2900D20112063D3001F8C2017889
:10096C005230D50108F60206E32D504349581206C1
:10097C003D2403B405004001E49009759312066907
:0D098C00743A120669D2037552040207C8BE
:0D0C8600E6FB08E6F908E6FA08E6CBF822DE
:0C0C9300E0F8A3E0F9A3E0FAA3E0FB22E4
:0D0C9F00E2FB08E2F908E2FA08E2CBF822D5
:100CAC00E493F8740193F9740293FA740393FB229E
:100CBC00FAE6FB0808E6F925F0F618E6CA3AF62239
:100CCC00D083D082F8E4937012740193700DA3A3B7
:100CDC0093F8740193F5828883E4737402936860CB
:060CEC00EFA3A3A380DFCB
:00000001FF

View File

@ -0,0 +1,11 @@
".\Objects\STARTUP.obj",
".\Objects\delay.obj",
".\Objects\GPIO.obj",
".\Objects\main.obj",
".\Objects\UART.obj",
".\Objects\timer.obj",
".\Objects\tm1650.obj",
".\Objects\common.obj",
".\Objects\EEPROM.obj"
TO ".\Objects\Motorcontroller"
PRINT(".\Listings\Motorcontroller.m51") RAMSIZE(256)

BIN
Objects/PWM.obj Normal file

Binary file not shown.

BIN
Objects/STARTUP.obj Normal file

Binary file not shown.

1
Objects/TM5160.__i Normal file
View File

@ -0,0 +1 @@
"mycode\TM5160.C" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\TM5160.lst) TABS (2) OBJECT(.\Objects\TM5160.obj)

BIN
Objects/TM5160.obj Normal file

Binary file not shown.

1
Objects/UART.__i Normal file
View File

@ -0,0 +1 @@
"mycode\UART.C" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\UART.lst) TABS (2) OBJECT(.\Objects\UART.obj)

BIN
Objects/UART.obj Normal file

Binary file not shown.

1
Objects/common.__i Normal file
View File

@ -0,0 +1 @@
"mycode\common.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\common.lst) TABS (2) OBJECT(.\Objects\common.obj)

BIN
Objects/common.obj Normal file

Binary file not shown.

1
Objects/delay.__i Normal file
View File

@ -0,0 +1 @@
"mycode\delay.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\delay.lst) TABS (2) OBJECT(.\Objects\delay.obj)

BIN
Objects/delay.obj Normal file

Binary file not shown.

1
Objects/main.__i Normal file
View File

@ -0,0 +1 @@
"mycode\main.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\main.lst) TABS (2) OBJECT(.\Objects\main.obj)

BIN
Objects/main.obj Normal file

Binary file not shown.

1
Objects/timer.__i Normal file
View File

@ -0,0 +1 @@
"mycode\timer.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\timer.lst) TABS (2) OBJECT(.\Objects\timer.obj)

BIN
Objects/timer.obj Normal file

Binary file not shown.

1
Objects/tm1650.__i Normal file
View File

@ -0,0 +1 @@
"mycode\tm1650.c" OPTIMIZE (8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND PRINT(.\Listings\tm1650.lst) TABS (2) OBJECT(.\Objects\tm1650.obj)

BIN
Objects/tm1650.obj Normal file

Binary file not shown.

198
STARTUP.A51 Normal file
View File

@ -0,0 +1,198 @@
$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
; Version 8.01
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
; STARTUP.A51: This code is executed after processor reset.
;
; To translate this file use A51 with the following invocation:
;
; A51 STARTUP.A51
;
; To link the modified STARTUP.OBJ file to your application use the following
; Lx51 invocation:
;
; Lx51 your object file list, STARTUP.OBJ controls
;
;------------------------------------------------------------------------------
;
; User-defined <h> Power-On Initialization of Memory
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
; <i> Note: The absolute start-address of IDATA memory is always 0
; <i> The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN EQU 80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU 0
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU 0
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
; <i> The length of PDATA memory in bytes.
PDATALEN EQU 0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
; The following EQU statements define the stack pointer for reentrant
; functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
; <q> IBPSTACK: Enable SMALL model reentrant stack
; <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.
; <q> XBPSTACK: Enable LARGE model reentrant stack
; <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.
; <q> PBPSTACK: Enable COMPACT model reentrant stack
; <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
;
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;</h>
;------------------------------------------------------------------------------
;
; Memory Page for Using the Compact Model with 64 KByte xdata RAM
; <e>Compact Model Page Definition
;
; <i>Define the XDATA page used for PDATA variables.
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE EQU 0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR DATA 0A0H
;
; </e>
;------------------------------------------------------------------------------
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
#endif
;</h>
LJMP ?C_START
END

127
mycode/EEPROM.c Normal file
View File

@ -0,0 +1,127 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/*************** 功能说明 ****************
STC8系列的内置EEPROM读写程序,.
******************************************/
#include "config.h"
#include "eeprom.h"
//========================================================================
// 函数: void ISP_Disable(void)
// 描述: 禁止访问ISP/IAP.
// 参数: non.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void DisableEEPROM(void)
{
IAP_CONTR = 0; //禁止IAP操作
IAP_CMD = 0; //去除IAP命令
IAP_TRIG = 0; //防止IAP命令误触发
IAP_ADDRH = 0xff; //清0地址高字节
IAP_ADDRL = 0xff; //清0地址低字节指向非EEPROM区防止误操作
}
//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
F0 = EA; //保存全局中断
EA = 0; //禁止中断, 避免触发命令无效
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5; //先送5AH再送A5H到IAP触发寄存器每次都需要如此
//送完A5H后IAP命令立即被触发启动
//CPU等待IAP完成后才会继续执行程序。
_nop_();
_nop_();
EA = F0; //恢复全局中断
}
//========================================================================
// 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
// 参数: EE_address: 读出EEPROM的首地址.
// DataAddress: 读出数据放缓冲的首地址.
// number: 读出的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
EEPROM_Trig(); //触发EEPROM操作
*DataAddress = IAP_DATA; //读出的数据送往
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
}
//========================================================================
// 函数: void EEPROM_SectorErase(u16 EE_address)
// 描述: 把指定地址的EEPROM扇区擦除.
// 参数: EE_address: 要擦除的扇区EEPROM的地址.
// 返回: non.
// 版本: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
//只有扇区擦除没有字节擦除512字节/扇区。
//扇区中任意一个字节地址都是扇区地址。
IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送扇区地址低字节
EEPROM_Trig(); //触发EEPROM操作
DisableEEPROM(); //禁止EEPROM操作
}
//========================================================================
// 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
// 参数: EE_address: 写入EEPROM的首地址.
// DataAddress: 写入源数据的缓冲的首地址.
// number: 写入的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间允许IAP操作送一次就够
IAP_WRITE(); //宏调用, 送字节写命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
IAP_DATA = *DataAddress; //送数据到IAP_DATA只有数据改变时才需重新送
EEPROM_Trig(); //触发EEPROM操作
EE_address++; //下一个地址
DataAddress++; //下一个数据
}while(--number); //直到结束
DisableEEPROM();
}

145
mycode/GPIO.c Normal file
View File

@ -0,0 +1,145 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/*************** 功能说明 ****************
STC8系列的端口初始化程序,.
******************************************/
#include "GPIO.h"
//========================================================================
// 函数: u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
// 描述: 初始化IO口.
// 参数: GPIOx: 结构参数,请参考timer.h里的定义.
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.0, 2012-10-22
//========================================================================
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
{
if (GPIO > GPIO_P7)
return 1; // 空操作
if (GPIOx->Mode > GPIO_OUT_PP)
return 2; // 错误
if (GPIO == GPIO_P0)
{
if (GPIOx->Mode == GPIO_PullUp)
P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P1)
{
if (GPIOx->Mode == GPIO_PullUp)
P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P1M1 &= ~GPIOx->Pin, P1M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P2)
{
if (GPIOx->Mode == GPIO_PullUp)
P2M1 &= ~GPIOx->Pin, P2M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P2M1 |= GPIOx->Pin, P2M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P2M1 |= GPIOx->Pin, P2M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P2M1 &= ~GPIOx->Pin, P2M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P3)
{
if (GPIOx->Mode == GPIO_PullUp)
P3M1 &= ~GPIOx->Pin, P3M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P3M1 |= GPIOx->Pin, P3M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P3M1 |= GPIOx->Pin, P3M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P3M1 &= ~GPIOx->Pin, P3M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P4)
{
if (GPIOx->Mode == GPIO_PullUp)
P4M1 &= ~GPIOx->Pin, P4M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P4M1 |= GPIOx->Pin, P4M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P4M1 |= GPIOx->Pin, P4M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P4M1 &= ~GPIOx->Pin, P4M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P5)
{
if (GPIOx->Mode == GPIO_PullUp)
P5M1 &= ~GPIOx->Pin, P5M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P5M1 |= GPIOx->Pin, P5M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P5M1 |= GPIOx->Pin, P5M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P5M1 &= ~GPIOx->Pin, P5M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P6)
{
if (GPIOx->Mode == GPIO_PullUp)
P6M1 &= ~GPIOx->Pin, P6M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P6M1 |= GPIOx->Pin, P6M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P6M1 |= GPIOx->Pin, P6M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P6M1 &= ~GPIOx->Pin, P6M0 |= GPIOx->Pin; // 推挽输出
}
if (GPIO == GPIO_P7)
{
if (GPIOx->Mode == GPIO_PullUp)
P7M1 &= ~GPIOx->Pin, P7M0 &= ~GPIOx->Pin; // 上拉准双向口
if (GPIOx->Mode == GPIO_HighZ)
P7M1 |= GPIOx->Pin, P7M0 &= ~GPIOx->Pin; // 浮空输入
if (GPIOx->Mode == GPIO_OUT_OD)
P7M1 |= GPIOx->Pin, P7M0 |= GPIOx->Pin; // 开漏输出
if (GPIOx->Mode == GPIO_OUT_PP)
P7M1 &= ~GPIOx->Pin, P7M0 |= GPIOx->Pin; // 推挽输出
}
return 0; // 成功
}
/******************** IO口配置 ********************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 结构定义
GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 指定要初始化 或操作p32
GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3, &GPIO_InitStructure); // 初始化
GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; // 指定要初始化 或操作输出使能
GPIO_InitStructure.Mode = GPIO_OUT_PP; // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 指定要初始化 或操作输出使能
GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
GPIO_InitStructure.Pin = GPIO_Pin_4; // 指定要初始化 或操作输出使能
GPIO_InitStructure.Mode = GPIO_PullUp; // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); // 初始化
EN=1;
}

453
mycode/UART.C Normal file
View File

@ -0,0 +1,453 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#include "UART.h"
#include "STDIO.H"
#ifdef UART1
COMx_Define COM1;
u8 xdata TX1_Buffer[COM_TX1_Lenth]; //发送缓冲
u8 xdata RX1_Buffer[COM_RX1_Lenth]; //接收缓冲
#endif
#ifdef UART2
COMx_Define COM2;
u8 xdata TX2_Buffer[COM_TX2_Lenth]; //发送缓冲
u8 xdata RX2_Buffer[COM_RX2_Lenth]; //接收缓冲
#endif
#ifdef UART3
COMx_Define COM3;
u8 xdata TX3_Buffer[COM_TX3_Lenth]; //发送缓冲
u8 xdata RX3_Buffer[COM_RX3_Lenth]; //接收缓冲
#endif
#ifdef UART4
COMx_Define COM4;
u8 xdata TX4_Buffer[COM_TX4_Lenth]; //发送缓冲
u8 xdata RX4_Buffer[COM_RX4_Lenth]; //接收缓冲
#endif
u8 UART_Configuration(u8 UARTx, COMx_InitDefine *COMx)
{
u8 i;
u32 j;
#ifdef UART1
if(UARTx == UART1)
{
COM1.id = 1;
COM1.TX_read = 0;
COM1.TX_write = 0;
COM1.B_TX_busy = 0;
COM1.RX_Cnt = 0;
COM1.RX_TimeOut = 0;
COM1.B_RX_OK = 0;
for(i=0; i<COM_TX1_Lenth; i++) TX1_Buffer[i] = 0;
for(i=0; i<COM_RX1_Lenth; i++) RX1_Buffer[i] = 0;
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART1_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if(COMx->UART_Mode > UART_9bit_BRTx) return 2; //模式错误
SCON = (SCON & 0x3f) | COMx->UART_Mode;
if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
if(COMx->UART_BRT_Use == BRT_Timer1)
{
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(j>>8);
TL1 = (u8)j;
ET1 = 0; //禁止中断
TMOD &= ~0x40; //定时
INT_CLKO &= ~0x02; //不输出时钟
TR1 = 1;
}
else if(COMx->UART_BRT_Use == BRT_Timer2)
{
AUXR &= ~(1<<4); //Timer stop
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //错误
}
else if(COMx->UART_Mode == UART_ShiftRight)
{
if(COMx->BaudRateDouble == ENABLE) AUXR |= (1<<5); //固定波特率SysClk/2
else AUXR &= ~(1<<5); //固定波特率SysClk/12
}
else if(COMx->UART_Mode == UART_9bit) //固定波特率SysClk*2^SMOD/64
{
if(COMx->BaudRateDouble == ENABLE) PCON |= (1<<7); //固定波特率SysClk/32
else PCON &= ~(1<<7); //固定波特率SysClk/64
}
if(COMx->UART_Interrupt == ENABLE) ES = 1; //允许中断
else ES = 0; //禁止中断
if(COMx->UART_RxEnable == ENABLE) REN = 1; //允许接收
else REN = 0; //禁止接收
P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0); //切换IO
return 0;
}
#endif
#ifdef UART2
if(UARTx == UART2)
{
COM2.id = 2;
COM2.TX_read = 0;
COM2.TX_write = 0;
COM2.B_TX_busy = 0;
COM2.RX_Cnt = 0;
COM2.RX_TimeOut = 0;
COM2.B_RX_OK = 0;
for(i=0; i<COM_TX2_Lenth; i++) TX2_Buffer[i] = 0;
for(i=0; i<COM_RX2_Lenth; i++) RX2_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART2_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if(COMx->UART_Mode == UART_9bit_BRTx) S2CON |= (1<<7); //9bit
else S2CON &= ~(1<<7); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
AUXR &= ~(1<<4); //Timer stop
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) IE2 |= 1; //允许中断
else IE2 &= ~1; //禁止中断
if(COMx->UART_RxEnable == ENABLE) S2CON |= (1<<4); //允许接收
else S2CON &= ~(1<<4); //禁止接收
P_SW2 = (P_SW2 & ~1) | (COMx->UART_P_SW & 0x01); //切换IO
return 0;
}
#endif
#ifdef UART3
if(UARTx == UART3)
{
COM3.id = 3;
COM3.TX_read = 0;
COM3.TX_write = 0;
COM3.B_TX_busy = 0;
COM3.RX_Cnt = 0;
COM3.RX_TimeOut = 0;
COM3.B_RX_OK = 0;
for(i=0; i<COM_TX3_Lenth; i++) TX3_Buffer[i] = 0;
for(i=0; i<COM_RX3_Lenth; i++) RX3_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART3_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if(COMx->UART_Mode == UART_9bit_BRTx) S3_9bit(); //9bit
else S3_8bit(); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
if(COMx->UART_BRT_Use == BRT_Timer3)
{
S3_BRT_UseTimer3(); //S3 BRT Use Timer3;
TH3 = (u8)(j>>8);
TL3 = (u8)j;
T4T3M &= 0xf0;
T4T3M |= 0x0a; //Timer3 set As Timer, 1T mode, Start timer3
}
else if(COMx->UART_BRT_Use == BRT_Timer2)
{
AUXR &= ~(1<<4); //Timer stop
S3_BRT_UseTimer2(); //S3 BRT Use Timer2;
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //错误
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) S3_Int_Enable(); //允许中断
else S3_Int_Disable(); //禁止中断
if(COMx->UART_RxEnable == ENABLE) S3_RX_Enable(); //允许接收
else S3_RX_Disable(); //禁止接收
P_SW2 = (P_SW2 & ~2) | (COMx->UART_P_SW & 0x02); //切换IO
return 0;
}
#endif
#ifdef UART4
if(UARTx == UART4)
{
COM4.id = 3;
COM4.TX_read = 0;
COM4.TX_write = 0;
COM4.B_TX_busy = 0;
COM4.RX_Cnt = 0;
COM4.RX_TimeOut = 0;
COM4.B_RX_OK = 0;
for(i=0; i<COM_TX4_Lenth; i++) TX4_Buffer[i] = 0;
for(i=0; i<COM_RX4_Lenth; i++) RX4_Buffer[i] = 0;
if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率
{
if(COMx->UART_Priority > Priority_3) return 2; //错误
UART4_Priority(COMx->UART_Priority); //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if(COMx->UART_Mode == UART_9bit_BRTx) S4_9bit(); //9bit
else S4_8bit(); //8bit
j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算
if(j >= 65536UL) return 2; //错误
j = 65536UL - j;
if(COMx->UART_BRT_Use == BRT_Timer4)
{
S4_BRT_UseTimer4(); //S4 BRT Use Timer4;
TH4 = (u8)(j>>8);
TL4 = (u8)j;
T4T3M &= 0x0f;
T4T3M |= 0xa0; //Timer4 set As Timer, 1T mode, Start timer4
}
else if(COMx->UART_BRT_Use == BRT_Timer2)
{
AUXR &= ~(1<<4); //Timer stop
S4_BRT_UseTimer2(); //S4 BRT Use Timer2;
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(j>>8);
TL2 = (u8)j;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
else return 2; //错误
}
else return 2; //模式错误
if(COMx->UART_Interrupt == ENABLE) S4_Int_Enable(); //允许中断
else S4_Int_Disable(); //禁止中断
if(COMx->UART_RxEnable == ENABLE) S4_RX_Enable(); //允许接收
else S4_RX_Disable(); //禁止接收
P_SW2 = (P_SW2 & ~4) | (COMx->UART_P_SW & 0x04); //切换IO
return 0;
}
#endif
return 2; //错误
}
/*********************************************************/
/********************* UART1 函数 ************************/
#ifdef UART1
void TX1_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲
if(++COM1.TX_write >= COM_TX1_Lenth) COM1.TX_write = 0;
if(COM1.B_TX_busy == 0) //空闲
{
COM1.B_TX_busy = 1; //标志忙
TI = 1; //触发发送中断
}
}
void PrintString1(u8 *puts)
{
for (; *puts != 0; puts++) TX1_write2buff(*puts); //遇到停止符0结束
}
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
if(COM1.B_RX_OK == 0)
{
if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;
RX1_Buffer[COM1.RX_Cnt++] = SBUF;
COM1.RX_TimeOut = TimeOutSet1;
}
}
if(TI)
{
TI = 0;
if(COM1.TX_read != COM1.TX_write)
{
SBUF = TX1_Buffer[COM1.TX_read];
if(++COM1.TX_read >= COM_TX1_Lenth) COM1.TX_read = 0;
}
else COM1.B_TX_busy = 0;
}
}
#endif
/********************* UART2 函数 ************************/
#ifdef UART2
void TX2_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX2_Buffer[COM2.TX_write] = dat; //装发送缓冲
if(++COM2.TX_write >= COM_TX2_Lenth) COM2.TX_write = 0;
if(COM2.B_TX_busy == 0) //空闲
{
COM2.B_TX_busy = 1; //标志忙
SET_TI2(); //触发发送中断
}
}
void PrintString2(u8 *puts)
{
for (; *puts != 0; puts++) TX2_write2buff(*puts); //遇到停止符0结束
}
void UART2_int (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
if(COM2.B_RX_OK == 0)
{
if(COM2.RX_Cnt >= COM_RX2_Lenth) COM2.RX_Cnt = 0;
RX2_Buffer[COM2.RX_Cnt++] = S2BUF;
COM2.RX_TimeOut = TimeOutSet2;
}
}
if(TI2)
{
CLR_TI2();
if(COM2.TX_read != COM2.TX_write)
{
S2BUF = TX2_Buffer[COM2.TX_read];
if(++COM2.TX_read >= COM_TX2_Lenth) COM2.TX_read = 0;
}
else COM2.B_TX_busy = 0;
}
}
#endif
/********************* UART3 函数 ************************/
#ifdef UART3
void TX3_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX3_Buffer[COM3.TX_write] = dat; //装发送缓冲
if(++COM3.TX_write >= COM_TX3_Lenth) COM3.TX_write = 0;
if(COM3.B_TX_busy == 0) //空闲
{
COM3.B_TX_busy = 1; //标志忙
SET_TI3(); //触发发送中断
}
}
void PrintString3(u8 *puts)
{
for (; *puts != 0; puts++) TX3_write2buff(*puts); //遇到停止符0结束
}
void UART3_int (void) interrupt UART3_VECTOR
{
if(RI3)
{
CLR_RI3();
if(COM3.B_RX_OK == 0)
{
if(COM3.RX_Cnt >= COM_RX3_Lenth) COM3.RX_Cnt = 0;
RX3_Buffer[COM3.RX_Cnt++] = S3BUF;
COM3.RX_TimeOut = TimeOutSet3;
}
}
if(TI3)
{
CLR_TI3();
if(COM3.TX_read != COM3.TX_write)
{
S3BUF = TX3_Buffer[COM3.TX_read];
if(++COM3.TX_read >= COM_TX3_Lenth) COM3.TX_read = 0;
}
else COM3.B_TX_busy = 0;
}
}
#endif
/********************* UART4 函数 ************************/
#ifdef UART4
void TX4_write2buff(u8 dat) //写入发送缓冲,指针+1
{
TX4_Buffer[COM4.TX_write] = dat; //装发送缓冲
if(++COM4.TX_write >= COM_TX4_Lenth) COM4.TX_write = 0;
if(COM4.B_TX_busy == 0) //空闲
{
COM4.B_TX_busy = 1; //标志忙
SET_TI4(); //触发发送中断
}
}
void PrintString4(u8 *puts)
{
for (; *puts != 0; puts++) TX4_write2buff(*puts); //遇到停止符0结束
}
void UART4_int (void) interrupt UART4_VECTOR
{
if(RI4)
{
CLR_RI4();
if(COM4.B_RX_OK == 0)
{
if(COM4.RX_Cnt >= COM_RX4_Lenth) COM4.RX_Cnt = 0;
RX4_Buffer[COM4.RX_Cnt++] = S4BUF;
COM4.RX_TimeOut = TimeOutSet4;
}
}
if(TI4)
{
CLR_TI4();
if(COM4.TX_read != COM4.TX_write)
{
S4BUF = TX4_Buffer[COM4.TX_read];
if(++COM4.TX_read >= COM_TX4_Lenth) COM4.TX_read = 0;
}
else COM4.B_TX_busy = 0;
}
}
#endif
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure;
COMx_InitStructure.UART_Mode = UART_8bit_BRTx;
COMx_InitStructure.UART_BRT_Use = BRT_Timer1;
COMx_InitStructure.UART_BaudRate = 115200ul;
COMx_InitStructure.UART_RxEnable = ENABLE;
COMx_InitStructure.BaudRateDouble = DISABLE;
COMx_InitStructure.UART_Interrupt = ENABLE;
COMx_InitStructure.UART_Priority = Priority_0;
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31;
UART_Configuration(UART1, &COMx_InitStructure);
}
char putchar(char c)
{
TX1_write2buff(c);
return c;
}

382
mycode/common.c Normal file
View File

@ -0,0 +1,382 @@
#include "common.h"
#include "GPIO.h"
#include "tm1650.h"
#include "STDIO.H"
#include "EEPROM.h"
#include "timer.h"
u8 keyflag = 0;
u8 sunmode = 1;
u8 pog = 4;
u16 keytime = 0;
u8 keyloog = 0;
u8 speedmode1 = speedstart, speedmode2 = speedstart, speedmode3 = speedstart, speedmode4 = speedstart, subdivision1 = substart, subdivision2 = substart, subdivision3 = substart, subdivision4 = substart;
u8 num[9] = 0;
static void key_add(u8 *speedmode, u8 *subdivision)
{
u8 key__time = 0;
if (keyloog)
key__time = 100;
else
key__time = 500;
switch (pog)
{
case 1:
break;
case 2:
if (keyflag == 0)
{
*speedmode += 1;
if (*speedmode >= speedmax)
*speedmode = speedmax;
keyflag = 1;
}
if (keytime > key__time)
{
*speedmode += 1;
keytime = 0;
keyloog = 1;
if (*speedmode >= speedmax)
*speedmode = speedmax;
}
break;
case 3:
if (keyflag == 0)
{
*subdivision += 1;
if (*subdivision >= subdivisionmax)
*subdivision = subdivisionmax;
keyflag = 1;
}
if (keytime > key__time)
{
*subdivision += 1;
keytime = 0;
keyloog = 1;
if (*subdivision >= subdivisionmax)
*subdivision = subdivisionmax;
}
break;
}
}
static void key_Redu(u8 *speedmode, u8 *subdivision)
{
u8 key__time = 0;
if (keyloog)
key__time = 100;
else
key__time = 500;
switch (pog)
{
case 1:
break;
case 2:
if (keyflag == 0)
{
*speedmode -= 1;
if (*speedmode <= speedmin)
*speedmode = speedmin;
keyflag = 1;
}
if (keytime > key__time)
{
*speedmode -= 1;
keytime = 0;
keyloog = 1;
if (*speedmode <= speedmin)
*speedmode = speedmin;
}
break;
case 3:
if (keyflag == 0)
{
if (*subdivision <= subdivisionmin)
*subdivision = subdivisionmin;
else
*subdivision -= 1;
keyflag = 1;
}
if (keytime > key__time)
{
keytime = 0;
keyloog = 1;
if (*subdivision <= subdivisionmin)
*subdivision = subdivisionmin;
else
*subdivision -= 1;
}
break;
}
}
void keyscan()
{
if (k1 == 0)
if (keyflag == 0)
{
timex = 400 * subdivision1;
DIR = 1;
sunmode = 1;
keyflag = 1;
setconfig();
}
if (k2 == 0)
if (keyflag == 0)
{
timex = 400 * subdivision2;
DIR = 0;
sunmode = 2;
keyflag = 1;
setconfig();
}
if (k3 == 0)
if (keyflag == 0)
{
timex = 800 <<subdivision3;
DIR = 1;
sunmode = 3;
keyflag = 1;
setconfig();
}
if (k4 == 0)
if (keyflag == 0)
{
timex = 0;
sunmode = 4;
keyflag = 1;
setconfig();
}
if (k5 == 0)
{
if (keyflag == 0)
{
switch (pog)
{
case 1:
pog = 2;
break;
case 2:
pog = 3;
break;
case 3:
pog = 4;
setconfig();
break;
case 4:
pog = 2;
break;
}
keyflag = 1;
}
}
if (k6 == 0)
{
switch (sunmode)
{
case 1:
key_add(&speedmode1, &subdivision1);
break;
case 2:
key_add(&speedmode2, &subdivision2);
break;
case 3:
key_add(&speedmode3, &subdivision3);
break;
case 4:
key_add(&speedmode4, &subdivision4);
break;
}
}
if (k7 == 0)
{
switch (sunmode)
{
case 1:
key_Redu(&speedmode1, &subdivision1);
break;
case 2:
key_Redu(&speedmode2, &subdivision2);
break;
case 3:
key_Redu(&speedmode3, &subdivision3);
break;
case 4:
key_Redu(&speedmode4, &subdivision4);
break;
}
}
if (k8 == 0)
{
if (keyflag == 0)
{
if (pog != 1)
pog = 1;
else
pog = 4;
setconfig();
keyflag = 1;
switch (sunmode)
{
case 1:
timex = 400 << subdivision1;
DIR = 1;
break;
case 2:
timex = 400 << subdivision2;
DIR = 0;
break;
case 3:
timex = 800 << subdivision3;
DIR = 1;
break;
case 4:
break;
}
}
}
if (k1 != 0 & k2 != 0 & k3 != 0 & k4 != 0 & k5 != 0 & k6 != 0 & k7 != 0 & k8 != 0)
{
keyflag = 0;
keyloog = 0;
}
}
static void dislittleplay(u8 speedmode, u16 subdivision)
{
switch (pog)
{
case 1:
TM1650_printpogrun(sunmode, displaydata);
break;
case 2:
TM1650_print_SMG1(speedmode);
break;
case 3:
TM1650_print_SMG2(subdivision);
break;
case 4:
TM1650_printpogstop(sunmode);
break;
}
}
void display()
{
switch (sunmode)
{
case 1:
dislittleplay(speedmode1, (u16)(1 << subdivision1));
break;
case 2:
dislittleplay(speedmode2, (u16)(1 << subdivision2));
break;
case 3:
dislittleplay(speedmode3, (u16)(1 << subdivision3));
break;
case 4:
dislittleplay(speedmode4, (u16)(1 << subdivision4));
break;
}
}
void shuju()
{
switch (sunmode)
{
case 1:
if (((u16)(speedmode1 * 20 * (1 << subdivision1) / 3)) < 400)
{
Timer0_12T();
T0_Load(65536UL - (MAIN_Fosc / ((u32)speedmode1 * 80 * (1 << subdivision1))));
}
else
{
Timer0_1T();
T0_Load(65536UL - (MAIN_Fosc / ((u32)speedmode1 * 20 * (1 << subdivision1) / 3)));
}
break;
case 2:
if ((u16)(speedmode2 * 20 * (1 << subdivision2) / 3) < 400)
{
Timer0_12T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode2 * 80 * (1 << subdivision2))));
}
else
{
Timer0_1T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode2 * 20 * (1 << subdivision2) / 3)));
}
break;
case 3:
if ((u16)(speedmode3 * 20 * (1 << subdivision3) / 3) < 400)
{
Timer0_12T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode3 * 80 * (1 << subdivision3))));
}
else
{
Timer0_1T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode3 * 20 * (1 << subdivision3) / 3)));
}
break;
case 4:
if ((u16)(speedmode4 * 20 * (1 << subdivision4) / 3) < 400)
{
Timer0_12T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode4 * 80 * (1 << subdivision4))));
}
else
{
Timer0_1T();
T0_Load(65536UL - (MAIN_Fosc / (u32)(speedmode4 * 20 * (1 << subdivision4) / 3)));
}
break;
}
}
void run()
{
switch (pog)
{
case 1:
if (timex == 0)
pog = 4;
EN = 0;
break;
case 2:
EN = 1;
break;
case 3:
EN = 1;
break;
case 4:
EN = 1;
break;
}
}
void getconfig()
{
EEPROM_read_n(MYaddress, num, 9);
if (num[0] != 255)
{
speedmode1 = num[0];
speedmode2 = num[1];
speedmode3 = num[2];
speedmode4 = num[3];
subdivision1 = num[4];
subdivision2 = num[5];
subdivision3 = num[6];
subdivision4 = num[7];
sunmode = num[8];
}
}
void setconfig()
{
EEPROM_SectorErase(MYaddress);
num[0] = speedmode1;
num[1] = speedmode2;
num[2] = speedmode3;
num[3] = speedmode4;
num[4] = subdivision1;
num[5] = subdivision2;
num[6] = subdivision3;
num[7] = subdivision4;
num[8] = sunmode;
EEPROM_write_n(MYaddress, num, 9);
}

56
mycode/delay.c Normal file
View File

@ -0,0 +1,56 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/*************** 功能说明 ****************
STC8系列的延时程序,.
******************************************/
#include "delay.h"
//========================================================================
// 函数: void delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay_ms(unsigned char ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 10000;
while(--i);
}while(--ms);
}
void Delay4us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
i = 12;
while (--i)
;
}
void Delay2us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 5;
while (--i)
;
}

28
mycode/main.c Normal file
View File

@ -0,0 +1,28 @@
#include "config.h"
#include "GPIO.h"
#include "tm1650.h"
#include "timer.h"
#include "UART.h"
#include "STDIO.H"
#include "delay.h"
#include "common.h"
#include "EEPROM.h"
void main()
{
TM1650_init();
Timer_config();
GPIO_config();
UART_config();
getconfig();
EA = 1;
delay_ms(10);
while (1)
{
shuju();
keyscan();
display();
run();
printf("%d\r\n", timex);
}
}

269
mycode/timer.c Normal file
View File

@ -0,0 +1,269 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
STC8系列的定时器初始化和中断程序,.
******************************************/
#include "timer.h"
#include "GPIO.h"
#include "common.h"
u32 timex;
static u16 displaytime = 0;
u8 displaydata = 0;
/********************* Timer0中断函数************************/
void timer0_int(void) interrupt TIMER0_VECTOR
{
if (sunmode == 3)
{
if (timex <= 4000 << subdivision3)
DIR = 0;
}
if (timex <= 0)
timex = 0;
else
{
if (pog == 1)
{
timex--;
PUL = ~PUL;
}
}
}
/********************* Timer1中断函数************************/
void timer1_int(void) interrupt TIMER1_VECTOR
{
}
/********************* Timer2中断函数************************/
void timer2_int(void) interrupt TIMER2_VECTOR
{
displaytime++;
if (displaytime >= 200)
{
if (DIR)
{
if (displaydata >= 7)
displaydata = 0;
else
displaydata++;
}
else
{
if (displaydata <= 0)
displaydata = 7;
else
displaydata--;
}
displaytime = 0;
}
if (keyflag)
keytime++;
else
keytime = 0;
}
/********************* Timer3中断函数************************/
void timer3_int(void) interrupt TIMER3_VECTOR
{
}
/********************* Timer4中断函数************************/
void timer4_int(void) interrupt TIMER4_VECTOR
{
}
//========================================================================
// 函数: u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
// 描述: 定时器初始化程序.
// 参数: TIMx: 结构参数,请参考timer.h里的定义.
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.0, 2012-10-22
//========================================================================
u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
{
if (TIM > Timer4)
return 1; // 空操作
if (TIM == Timer0)
{
Timer0_Stop(); // 停止计数
if (TIMx->TIM_Interrupt == ENABLE)
Timer0_InterruptEnable(); // 允许中断
else
Timer0_InterruptDisable(); // 禁止中断
if (TIMx->TIM_Priority > Priority_3)
return 2; // 错误
Timer0_Priority(TIMx->TIM_Priority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if (TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask)
return 2; // 错误
TMOD = (TMOD & ~0x03) | TIMx->TIM_Mode; // 工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 不可屏蔽16位自动重装
if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
Timer0_12T(); // 12T
if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
Timer0_1T(); // 1T
if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
Timer0_AsCounter(); // 对外计数或分频
else
Timer0_AsTimer(); // 定时
if (TIMx->TIM_ClkOut == ENABLE)
Timer0_CLKO_Enable(); // 输出时钟
else
Timer0_CLKO_Disable(); // 不输出时钟
T0_Load(TIMx->TIM_Value);
if (TIMx->TIM_Run == ENABLE)
Timer0_Run(); // 开始运行
return 0; // 成功
}
if (TIM == Timer1)
{
Timer1_Stop(); // 停止计数
if (TIMx->TIM_Interrupt == ENABLE)
Timer1_InterruptEnable(); // 允许中断
else
Timer1_InterruptDisable(); // 禁止中断
if (TIMx->TIM_Priority > Priority_3)
return 2; // 错误
Timer1_Priority(TIMx->TIM_Priority); // 指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
if (TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask)
return 2; // 错误
TMOD = (TMOD & ~0x30) | (TIMx->TIM_Mode << 4); // 工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 停止工作
if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
Timer1_12T(); // 12T
if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
Timer1_1T(); // 1T
if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
Timer1_AsCounter(); // 对外计数或分频
else
Timer1_AsTimer(); // 定时
if (TIMx->TIM_ClkOut == ENABLE)
Timer1_CLKO_Enable(); // 输出时钟
else
Timer1_CLKO_Disable(); // 不输出时钟
T1_Load(TIMx->TIM_Value);
if (TIMx->TIM_Run == ENABLE)
Timer1_Run(); // 开始运行
return 0; // 成功
}
if (TIM == Timer2) // Timer2,固定为16位自动重装, 中断无优先级
{
Timer2_Stop(); // 停止计数
if (TIMx->TIM_Interrupt == ENABLE)
Timer2_InterruptEnable(); // 允许中断
else
Timer2_InterruptDisable(); // 禁止中断
if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
return 2;
if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
Timer2_12T(); // 12T
if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
Timer2_1T(); // 1T
if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
Timer2_AsCounter(); // 对外计数或分频
else
Timer2_AsTimer(); // 定时
if (TIMx->TIM_ClkOut == ENABLE)
Timer2_CLKO_Enable(); // 输出时钟
else
Timer2_CLKO_Disable(); // 不输出时钟
T2_Load(TIMx->TIM_Value);
if (TIMx->TIM_Run == ENABLE)
Timer2_Run(); // 开始运行
return 0; // 成功
}
if (TIM == Timer3) // Timer3,固定为16位自动重装, 中断无优先级
{
Timer3_Stop(); // 停止计数
if (TIMx->TIM_Interrupt == ENABLE)
Timer3_InterruptEnable(); // 允许中断
else
Timer3_InterruptDisable(); // 禁止中断
if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
return 2;
if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
Timer3_12T(); // 12T
if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
Timer3_1T(); // 1T
if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
Timer3_AsCounter(); // 对外计数或分频
else
Timer3_AsTimer(); // 定时
if (TIMx->TIM_ClkOut == ENABLE)
Timer3_CLKO_Enable(); // 输出时钟
else
Timer3_CLKO_Disable(); // 不输出时钟
T3_Load(TIMx->TIM_Value);
if (TIMx->TIM_Run == ENABLE)
Timer3_Run(); // 开始运行
return 0; // 成功
}
if (TIM == Timer4) // Timer3,固定为16位自动重装, 中断无优先级
{
Timer4_Stop(); // 停止计数
if (TIMx->TIM_Interrupt == ENABLE)
Timer4_InterruptEnable(); // 允许中断
else
Timer4_InterruptDisable(); // 禁止中断
if (TIMx->TIM_ClkSource > TIM_CLOCK_Ext)
return 2;
if (TIMx->TIM_ClkSource == TIM_CLOCK_12T)
Timer4_12T(); // 12T
if (TIMx->TIM_ClkSource == TIM_CLOCK_1T)
Timer4_1T(); // 1T
if (TIMx->TIM_ClkSource == TIM_CLOCK_Ext)
Timer4_AsCounter(); // 对外计数或分频
else
Timer4_AsTimer(); // 定时
if (TIMx->TIM_ClkOut == ENABLE)
Timer4_CLKO_Enable(); // 输出时钟
else
Timer4_CLKO_Disable(); // 不输出时钟
T4_Load(TIMx->TIM_Value);
if (TIMx->TIM_Run == ENABLE)
Timer4_Run(); // 开始运行
return 0; // 成功
}
return 2; // 错误
}
/************************ ?¨?±?÷???? ****************************/
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //?á???¨??
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //???¨?¤×÷????, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_Priority = Priority_0; //???¨??????????(??????) Priority_0,Priority_1,Priority_2,Priority_3
TIM_InitStructure.TIM_Interrupt = ENABLE; //??????·????í, ENABLE?òDISABLE
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //???¨?±????, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //??·?????????????, ENABLE?òDISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 100000UL); //????,
TIM_InitStructure.TIM_Run = ENABLE; //??·????????ó?????¨?±?÷, ENABLE?òDISABLE
Timer_Inilize(Timer0, &TIM_InitStructure); //??????Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //???¨?±????, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //??·?????????????, ENABLE?òDISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); //????,
TIM_InitStructure.TIM_Run = ENABLE; //??·????????ó?????¨?±?÷, ENABLE?òDISABLE
Timer_Inilize(Timer2, &TIM_InitStructure);
}

192
mycode/tm1650.c Normal file
View File

@ -0,0 +1,192 @@
#include "tm1650.h"
#include "delay.h"
#include "timer.h"
// 往一个指定的数码管位写入指定的显示数据
// 共阴数码管段码表:
// const unsigned char TUBE_TABLE_0[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴0~9的数字
const unsigned char TUBE_TABLE_0[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; // 共阴0~9~A~F
const unsigned char TUBE_TABLE_1[16]={0x01,0x21,0x30,0x18,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x0c,0x06,0x03};
// 产生IIC总线起始信号
static void TM1650_IIC_start(void)
{
scl = 1; // SCL=1
sda = 1; // SDA=1
Delay4us();
sda = 0; // SDA=0
Delay4us();
scl = 0; // SCL=0
}
// 产生IIC总线结束信号
static void TM1650_IIC_stop(void)
{
scl = 0; // SCL=0
sda = 0; // SDA=0
Delay4us();
scl = 1; // SCL=1
Delay4us();
sda = 1; // SDA=1
}
// 通过IIC总线发送一个字节
static void TM1650_IIC_write_byte(unsigned char dat)
{
unsigned char i;
scl = 0;
for (i = 0; i < 8; i++)
{
do
{
if (dat & 0x80)
sda = 1; // SDA=1
else
sda = 0;
} while (0);
dat <<= 1;
Delay2us();
scl = 1;
Delay2us();
scl = 0;
Delay2us();
}
}
// 通过IIC总线接收从机响应的ACK信号
static unsigned char TM1650_IIC_wait_ack(void)
{
unsigned char ack_signal = 0;
sda = 1; // SDA=1
Delay2us();
ack_signal = sda;
scl = 1;
Delay2us();
// if(sda == 0)
// ack_signal = 1; //如果读取到的是NACK信号
scl = 0;
Delay2us();
return ack_signal;
}
// 作用:设置显示参数
// 备注:这个操作不影响显存中的数据
// 用例:
// 设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
// 关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
static void TM1650_cfg_display(unsigned char x)
{
TM1650_IIC_start();
TM1650_IIC_write_byte(0x48);
TM1650_IIC_wait_ack(); // 固定命令
TM1650_IIC_write_byte(x);
TM1650_IIC_wait_ack(); // 参数值
TM1650_IIC_stop();
}
// 在DIG1位上显示数字3: TM1650_print(TM1650_DIG1,TUBE_TABLE_0[3]);
void TM1650_print(unsigned char dig, unsigned char seg_data)
{
TM1650_IIC_start();
TM1650_IIC_write_byte(dig * 2 + 0x68);
TM1650_IIC_wait_ack(); // 显存起始地址为0x68
TM1650_IIC_write_byte(seg_data);
TM1650_IIC_wait_ack(); // 发送段码
TM1650_IIC_stop();
}
// 将显存数据全部刷为0清空显示
static void TM1650_clear(void)
{
unsigned char a;
for (a = TM1650_DIG1; a <= TM1650_DIG4; a++)
{
TM1650_print(a, 0); // 将显存数据刷为0
}
}
// TM1650初始化
void TM1650_init(void)
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_clear(); // 将显存内容清0
}
void TM1650_printpogrun(u8 set,u8 mode) // 显示run
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_print(TM1650_DIG1, TUBE_TABLE_1[mode]);
Delay4us();
TM1650_print(TM1650_DIG2, 0x73);
Delay4us();
TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set]);
Delay4us();
TM1650_print(TM1650_DIG4, TUBE_TABLE_1[mode+8]);
}
void TM1650_printpogstop(u8 set) // 显示run
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_print(TM1650_DIG1, 0x40);
Delay4us();
TM1650_print(TM1650_DIG2, 0x73);
Delay4us();
TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set]);
Delay4us();
TM1650_print(TM1650_DIG4, 0x40);
}
void TM1650_print_SMG1(u8 set) // 显示----页面0显示
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_print(TM1650_DIG1, 0x40);
Delay4us();
if (set > 99)
TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
else
TM1650_print(TM1650_DIG2, 0x00);
Delay4us();
if (set > 9)
TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
else
TM1650_print(TM1650_DIG3, 0x00);
Delay4us();
TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
}
void TM1650_print_SMG2(u16 set) // 显示----页面0显示
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_print(TM1650_DIG1, 0x48);
Delay4us();
if (set > 99)
TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
else
TM1650_print(TM1650_DIG2, 0x00);
Delay4us();
if (set > 9)
TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
else
TM1650_print(TM1650_DIG3, 0x00);
Delay4us();
TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
}
void TM1650_print_SMG3(u8 set) // 显示----页面0显示
{
sda = 1; // 释放SDA线
scl = 1; // 释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); // 初始化为5级亮度打开显示
TM1650_print(TM1650_DIG1, 0x49);
Delay4us();
if (set > 99)
TM1650_print(TM1650_DIG2, TUBE_TABLE_0[set / 100 % 10]);
else
TM1650_print(TM1650_DIG2, 0x00);
Delay4us();
if (set > 9)
TM1650_print(TM1650_DIG3, TUBE_TABLE_0[set / 10 % 10]);
else
TM1650_print(TM1650_DIG3, 0x00);
Delay4us();
TM1650_print(TM1650_DIG4, TUBE_TABLE_0[set % 10]);
}

55
myinc/EEPROM.h Normal file
View File

@ -0,0 +1,55 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __EEPROM_H
#define __EEPROM_H
#include "config.h"
#define STC8X1K08 8
#define STC8X1K16 16
#define STC8XxK32 32
#define STC8XxK60 60
// 选择MCU型号
#define MCU_Type STC8X1K08 //STC8X1K08, STC8X1K16, STC8XxK32, STC8XxK32, STC8XxK60
/************************** ISP/IAP *****************************
MOVC读偏移地址
STC8X1K08 4K 8 0x0000 ~ 0x0FFF 0x2000
STC8X1K16 12K 24 0x0000 ~ 0x2FFF 0x4000
STC8XxK32 32K 64 0x0000 ~ 0x7FFF 0x8000
STC8XxK60 4K 8 0x0000 ~ 0x0FFF 0xF000
*/
#if (MCU_Type == STC8X1K08)
#define MOVC_ShiftAddress 0x2000
#elif (MCU_Type == STC8X1K16)
#define MOVC_ShiftAddress 0x4000
#elif (MCU_Type == STC8XxK32)
#define MOVC_ShiftAddress 0x8000
#elif (MCU_Type == STC8XxK60)
#define MOVC_ShiftAddress 0xF000
#else
#define MOVC_ShiftAddress 0xC000 //用户自定义
#endif
void DisableEEPROM(void);
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_SectorErase(u16 EE_address);
#endif

63
myinc/GPIO.h Normal file
View File

@ -0,0 +1,63 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* <20><><EFBFBD>Ҫ<EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô˴<C3B4><CBB4><EFBFBD>,<2C><><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>STC<54><43><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD> */
/*---------------------------------------------------------------------*/
#ifndef __GPIO_H
#define __GPIO_H
#include "config.h"
#define GPIO_PullUp 0 //<2F><><EFBFBD><EFBFBD>׼˫<D7BC><CBAB><EFBFBD>
#define GPIO_HighZ 1 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GPIO_OUT_OD 2 //<2F><>©<EFBFBD><C2A9><EFBFBD>
#define GPIO_OUT_PP 3 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GPIO_Pin_0 0x01 //IO<49><4F><EFBFBD><EFBFBD> Px.0
#define GPIO_Pin_1 0x02 //IO<49><4F><EFBFBD><EFBFBD> Px.1
#define GPIO_Pin_2 0x04 //IO<49><4F><EFBFBD><EFBFBD> Px.2
#define GPIO_Pin_3 0x08 //IO<49><4F><EFBFBD><EFBFBD> Px.3
#define GPIO_Pin_4 0x10 //IO<49><4F><EFBFBD><EFBFBD> Px.4
#define GPIO_Pin_5 0x20 //IO<49><4F><EFBFBD><EFBFBD> Px.5
#define GPIO_Pin_6 0x40 //IO<49><4F><EFBFBD><EFBFBD> Px.6
#define GPIO_Pin_7 0x80 //IO<49><4F><EFBFBD><EFBFBD> Px.7
#define GPIO_Pin_All 0xFF //IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define GPIO_P0 0 //
#define GPIO_P1 1
#define GPIO_P2 2
#define GPIO_P3 3
#define GPIO_P4 4
#define GPIO_P5 5
#define GPIO_P6 6
#define GPIO_P7 7
#define k5 P10
#define k6 P37
#define k7 P36
#define k8 P35
#define k1 P15
#define k2 P16
#define k3 P17
#define k4 P54
#define DIR P12
#define PUL P13
#define EN P14
typedef struct
{
u8 Mode; //IOģʽ, GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
u8 Pin; //Ҫ<><D2AA><EFBFBD>õĶ˿<C4B6>
} GPIO_InitTypeDef;
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);
void GPIO_config(void);
#endif

141
myinc/PWM.h Normal file
View File

@ -0,0 +1,141 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __PWM_H
#define __PWM_H
#include "config.h"
#define ENO1P 0x01
#define ENO1N 0x02
#define ENO2P 0x04
#define ENO2N 0x08
#define ENO3P 0x10
#define ENO3N 0x20
#define ENO4P 0x40
#define ENO4N 0x80
#define ENO5P 0x01
#define ENO6P 0x04
#define ENO7P 0x10
#define ENO8P 0x40
#define PWMA 1
#define PWMB 2
#define PWM1_SW_P10_P11 0
#define PWM1_SW_P20_P21 1
#define PWM1_SW_P60_P61 2
#define PWM2_SW_P12_P13 0
#define PWM2_SW_P22_P23 (1<<2)
#define PWM2_SW_P62_P63 (2<<2)
#define PWM3_SW_P14_P15 0
#define PWM3_SW_P24_P25 (1<<4)
#define PWM3_SW_P64_P65 (2<<4)
#define PWM4_SW_P16_P17 0
#define PWM4_SW_P26_P27 (1<<6)
#define PWM4_SW_P66_P67 (2<<6)
#define PWM4_SW_P34_P33 (3<<6)
#define PWM5_SW_P20 0
#define PWM5_SW_P17 1
#define PWM5_SW_P00 2
#define PWM5_SW_P74 3
#define PWM6_SW_P21 0
#define PWM6_SW_P54 (1<<2)
#define PWM6_SW_P01 (2<<2)
#define PWM6_SW_P75 (3<<2)
#define PWM7_SW_P22 0
#define PWM7_SW_P33 (1<<4)
#define PWM7_SW_P02 (2<<4)
#define PWM7_SW_P76 (3<<4)
#define PWM8_SW_P23 0
#define PWM8_SW_P34 (1<<6)
#define PWM8_SW_P03 (2<<6)
#define PWM8_SW_P77 (3<<6)
typedef struct
{
u8 PWM1_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM2_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM3_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM4_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM5_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM6_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM7_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u8 PWM8_Mode; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
u16 PWM_Period; //周期时间, 0~65535
u16 PWM1_Duty; //PWM1占空比时间, 0~Period
u16 PWM2_Duty; //PWM2占空比时间, 0~Period
u16 PWM3_Duty; //PWM3占空比时间, 0~Period
u16 PWM4_Duty; //PWM4占空比时间, 0~Period
u16 PWM5_Duty; //PWM5占空比时间, 0~Period
u16 PWM6_Duty; //PWM6占空比时间, 0~Period
u16 PWM7_Duty; //PWM7占空比时间, 0~Period
u16 PWM8_Duty; //PWM8占空比时间, 0~Period
u8 PWM_DeadTime; //死区发生器设置, 0~255
u8 PWM_CC1Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC1NEnable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC2Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC2NEnable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC3Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC3NEnable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC4Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC4NEnable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC5Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC6Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC7Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_CC8Enable; //开启输入捕获/比较输出, ENABLE,DISABLE
u8 PWM_Reload; //输出比较的预装载使能, ENABLE,DISABLE
u8 PWM_Fast; //输出比较快速功能使能, ENABLE,DISABLE
u8 PWM1_SetPriority; //设置PWM1优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 PWM2_SetPriority; //设置PWM2优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 PWM3_SetPriority; //设置PWM3优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 PWM4_SetPriority; //设置PWM4优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 PWM5_SetPriority; //设置PWM4优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 PWM_EnoSelect; //输出通道选择, ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
u8 PWM_PreLoad; //预装载, ENABLE,DISABLE
u8 PWM_PS_SW; //切换端口, PWM1_SW_P10_P11,PWM1_SW_P20_P21,PWM1_SW_P60_P61
u8 PWM_CEN_Enable; //使能计数器, ENABLE,DISABLE
u8 PWM_BrakeEnable; //刹车输入使能, ENABLE,DISABLE
u8 PWM_MainOutEnable;//主输出使能, ENABLE,DISABLE
} PWMx_InitDefine;
typedef struct
{
u16 PWM1_Duty; //PWM1占空比时间, 0~Period
u16 PWM2_Duty; //PWM2占空比时间, 0~Period
u16 PWM3_Duty; //PWM3占空比时间, 0~Period
u16 PWM4_Duty; //PWM4占空比时间, 0~Period
u16 PWM5_Duty; //PWM5占空比时间, 0~Period
u16 PWM6_Duty; //PWM6占空比时间, 0~Period
u16 PWM7_Duty; //PWM7占空比时间, 0~Period
u16 PWM8_Duty; //PWM8占空比时间, 0~Period
} PWMx_Duty;
u8 PWM_Configuration(u8 PWM, PWMx_InitDefine *PWMx);
void UpdatePwm(u8 PWM, PWMx_Duty *PWMx);
void PWM_config(void);
#endif

2747
myinc/STC8xxxx.H Normal file

File diff suppressed because it is too large Load Diff

135
myinc/UART.h Normal file
View File

@ -0,0 +1,135 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __UART_H
#define __UART_H
#include "config.h"
#define UART1 1
//#define UART2 2
//#define UART3 3
//#define UART4 4
#ifdef UART1
#define COM_TX1_Lenth 32
#define COM_RX1_Lenth 32
#endif
#ifdef UART2
#define COM_TX2_Lenth 128
#define COM_RX2_Lenth 128
#endif
#ifdef UART3
#define COM_TX3_Lenth 128
#define COM_RX3_Lenth 128
#endif
#ifdef UART4
#define COM_TX4_Lenth 128
#define COM_RX4_Lenth 128
#endif
#define UART_ShiftRight 0 //同步移位输出
#define UART_8bit_BRTx (1<<6) //8位数据,可变波特率
#define UART_9bit (2<<6) //9位数据,固定波特率
#define UART_9bit_BRTx (3<<6) //9位数据,可变波特率
#define UART1_SW_P30_P31 0
#define UART1_SW_P36_P37 (1<<6)
#define UART1_SW_P16_P17 (2<<6)
#define UART1_SW_P43_P44 (3<<6)
#define UART2_SW_P10_P11 0
#define UART2_SW_P46_P47 1
#define UART3_SW_P00_P01 0
#define UART3_SW_P50_P51 2
#define UART4_SW_P02_P03 0
#define UART4_SW_P52_P53 4
#define TimeOutSet1 5
#define TimeOutSet2 5
#define TimeOutSet3 5
#define TimeOutSet4 5
#define BRT_Timer1 1
#define BRT_Timer2 2
#define BRT_Timer3 3
#define BRT_Timer4 4
typedef struct
{
u8 id; //串口号
u8 TX_read; //发送读指针
u8 TX_write; //发送写指针
u8 B_TX_busy; //忙标志
u8 RX_Cnt; //接收字节计数
u8 RX_TimeOut; //接收超时
u8 B_RX_OK; //接收块完成
} COMx_Define;
typedef struct
{
u8 UART_Mode; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
u8 UART_BRT_Use; //使用波特率, BRT_Timer1,BRT_Timer2
u32 UART_BaudRate; //波特率, ENABLE,DISABLE
u8 Morecommunicate; //多机通讯允许, ENABLE,DISABLE
u8 UART_RxEnable; //允许接收, ENABLE,DISABLE
u8 BaudRateDouble; //波特率加倍, ENABLE,DISABLE
u8 UART_Interrupt; //中断控制, ENABLE,DISABLE
u8 UART_Priority; //优先级, Priority_0,Priority_1,Priority_2,Priority_3
u8 UART_P_SW; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
} COMx_InitDefine;
#ifdef UART1
extern COMx_Define COM1;
extern u8 xdata TX1_Buffer[COM_TX1_Lenth]; //发送缓冲
extern u8 xdata RX1_Buffer[COM_RX1_Lenth]; //接收缓冲
#endif
#ifdef UART2
extern COMx_Define COM2;
extern u8 xdata TX2_Buffer[COM_TX2_Lenth]; //发送缓冲
extern u8 xdata RX2_Buffer[COM_RX2_Lenth]; //接收缓冲
#endif
#ifdef UART3
extern COMx_Define COM3;
extern u8 xdata TX3_Buffer[COM_TX3_Lenth]; //发送缓冲
extern u8 xdata RX3_Buffer[COM_RX3_Lenth]; //接收缓冲
#endif
#ifdef UART4
extern COMx_Define COM4;
extern u8 xdata TX4_Buffer[COM_TX4_Lenth]; //发送缓冲
extern u8 xdata RX4_Buffer[COM_RX4_Lenth]; //接收缓冲
#endif
u8 UART_Configuration(u8 UARTx, COMx_InitDefine *COMx);
#ifdef UART1
void TX1_write2buff(u8 dat); //写入发送缓冲,指针+1
void PrintString1(u8 *puts);
#endif
#ifdef UART2
void TX2_write2buff(u8 dat); //写入发送缓冲,指针+1
void PrintString2(u8 *puts);
#endif
#ifdef UART3
void TX3_write2buff(u8 dat); //写入发送缓冲,指针+1
void PrintString3(u8 *puts);
#endif
#ifdef UART4
void TX4_write2buff(u8 dat); //写入发送缓冲,指针+1
void PrintString4(u8 *puts);
#endif
void UART_config(void);
#endif

21
myinc/common.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef __common_H
#define __common_H
#include "config.h"
#define speedmax 100
#define speedmin 10
#define subdivisionmax 8
#define subdivisionmin 0
#define MYaddress 0004
#define speedstart 60
#define substart 4
extern u8 speedmode1, speedmode2, speedmode3, speedmode4, subdivision1, subdivision2, subdivision3, subdivision4;
extern u16 keytime;
extern u8 keyflag;
extern u8 sunmode, pog;
void getconfig();
void keyscan();
void display();
void shuju();
void setconfig();
void run();
#endif

34
myinc/config.h Normal file
View File

@ -0,0 +1,34 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* <20><><EFBFBD>Ҫ<EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô˴<C3B4><CBB4><EFBFBD>,<2C><><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>STC<54><43><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD> */
/*---------------------------------------------------------------------*/
#ifndef __CONFIG_H
#define __CONFIG_H
/*********************************************************/
//#define MAIN_Fosc 22118400L //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define MAIN_Fosc 12000000L //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// #define MAIN_Fosc 11059200L //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define MAIN_Fosc 5529600L //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define MAIN_Fosc 24000000L //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// #define STC8Hxx //STC8Hϵ<48><CFB5>
#define STC8Gxx //STC8Gϵ<47><CFB5>
/*********************************************************/
#include "STC8xxxx.H"
#endif

21
myinc/delay.h Normal file
View File

@ -0,0 +1,21 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* <20><><EFBFBD>Ҫ<EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô˴<C3B4><CBB4><EFBFBD>,<2C><><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>STC<54><43><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD> */
/*---------------------------------------------------------------------*/
#ifndef __DELAY_H
#define __DELAY_H
#include "config.h"
void delay_ms(unsigned char ms);
void Delay4us();
void Delay2us();
#endif

47
myinc/timer.h Normal file
View File

@ -0,0 +1,47 @@
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* <20><><EFBFBD>Ҫ<EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô˴<C3B4><CBB4><EFBFBD>,<2C><><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>STC<54><43><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD> */
/*---------------------------------------------------------------------*/
#ifndef __TIMER_H
#define __TIMER_H
#include "config.h"
#define Timer0 0
#define Timer1 1
#define Timer2 2
#define Timer3 3
#define Timer4 4
#define TIM_16BitAutoReload 0
#define TIM_16Bit 1
#define TIM_8BitAutoReload 2
#define TIM_16BitAutoReloadNoMask 3
#define TIM_CLOCK_1T 0
#define TIM_CLOCK_12T 1
#define TIM_CLOCK_Ext 2
typedef struct
{
u8 TIM_Mode; // <20><><EFBFBD><EFBFBD>ģʽ, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
u8 TIM_Priority; // <20><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD> Priority_0,Priority_1,Priority_2,Priority_3
u8 TIM_Interrupt; // <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD> ENABLE,DISABLE
u8 TIM_ClkSource; // ʱ<><CAB1>Դ TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
u8 TIM_ClkOut; // <20>ɱ<EFBFBD><C9B1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>, ENABLE,DISABLE
u16 TIM_Value; // װ<>س<EFBFBD>ֵ
u8 TIM_Run; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> ENABLE,DISABLE
} TIM_InitTypeDef;
extern u8 displaydata;
extern u32 timex;
u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx);
void Timer_config();
#endif

30
myinc/tm1650.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef TM1650_H_
#define TM1650_H_
#include "config.h"
// 显示参数
#define TM1650_BRIGHT1 0x11 /*一级亮度打开LED显示*/
#define TM1650_BRIGHT2 0x21 /*二级亮度打开LED显示*/
#define TM1650_BRIGHT3 0x31 /*三级亮度打开LED显示*/
#define TM1650_BRIGHT4 0x41 /*四级亮度打开LED显示*/
#define TM1650_BRIGHT5 0x51 /*五级亮度打开LED显示*/
#define TM1650_BRIGHT6 0x61 /*六级亮度打开LED显示*/
#define TM1650_BRIGHT7 0x71 /*七级亮度打开LED显示*/
#define TM1650_BRIGHT8 0x01 /*八级亮度打开LED显示*/
#define TM1650_DSP_OFF 0x00 /*关闭LED显示*/
// 数码管位选
#define TM1650_DIG1 0
#define TM1650_DIG2 1
#define TM1650_DIG3 2
#define TM1650_DIG4 3
#define sda P33
#define scl P32
void TM1650_init(void); // 初始化
void TM1650_print(unsigned char dig, unsigned char seg_data);
void TM1650_printpogrun(u8 set,u8 mode);// 显示----页面0显示
void TM1650_printpogstop(u8 set);// 显示----页面0显示
void TM1650_print_SMG1(u8 set);
void TM1650_print_SMG2(u16 set);
void TM1650_print_SMG3(u8 set) ;
#endif