📄 chengxu.lst
字号:
C51 COMPILER V9.00 CHENGXU 03/05/2012 10:22:22 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE CHENGXU
OBJECT MODULE PLACED IN chengxu.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE chengxu.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 汇诚科技
3
4 实现功能:定时定次催款应用程序
5 使用芯片:STC15F104E
6 晶振:12MHZ
7 编译环境:Keil
8 作者:zhangxinchunleo
9 网站:www.ourhc.cn
10 淘宝店:汇诚科技 http://shop36330473.taobao.com
11 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
12
13 *********************************************************************/
14 /********************************************************************/
15 #include "reg52.h"
16 #include <intrins.H>
17 #define uchar unsigned char //宏定义字符型变量
18 #define uint unsigned int //宏定义整型变量
19 /********************************************************************
20 寄存器设置
21 *********************************************************************/
22 sfr IAP_DATA =0xc2; //数据寄存器
23 sfr IAP_ADDRH =0xc3; //地址寄存器
24 sfr IAP_ADDRL =0xc4; //地址寄存器
25 sfr IAP_CMD =0xc5; //命令寄存器
26 sfr IAP_TRIG =0xc6; //触发寄存器
27 sfr IAP_CONTR =0xc7; //擦除寄存器
28
29 sbit P33=P3^3; //定义继电器控制输出脚
30 /********************************************************************
31 命令定义
32 *********************************************************************/
33 #define CMD_IDLE 0 //EEPROM无操作
34 #define CMD_READ 1 //读取字节
35 #define CMD_PROGRAM 2 //写入字节
36 #define CMD_ERASE 3 //擦除字节
37 /********************************************************************
38 编程周期由晶振决定
39 *********************************************************************/
40 //#define ENABLE_IAP 0X80 //编程周期由晶振决定(如果<30MHZ选用此项)
41 //#define ENABLE_IAP 0X81 //编程周期由晶振决定(如果<24MHZ选用此项)
42 //#define ENABLE_IAP 0X82 //编程周期由晶振决定(如果<20MHZ选用此项)
43 #define ENABLE_IAP 0X83 //编程周期由晶振决定(如果<12MHZ选用此项)
44 //#define ENABLE_IAP 0X84 //编程周期由晶振决定(如果<6MHZ选用此项)
45 //#define ENABLE_IAP 0X85 //编程周期由晶振决定(如果<3MHZ选用此项)
46 //#define ENABLE_IAP 0X86 //编程周期由晶振决定(如果<2MHZ选用此项)
47 //#define ENABLE_IAP 0X87 //编程周期由晶振决定(如果<1MHZ选用此项)
48
49 #define IAP_ADDRESS 0X0000 //内部EEPROM地址
50 /********************************************************************
51 开机最大次数和最长时间定义
52 *********************************************************************/
53 #define C 10 //开机最大次数(次)
54 #define T 1 //开机最长时间(小时)
55 /********************************************************************
C51 COMPILER V9.00 CHENGXU 03/05/2012 10:22:22 PAGE 2
56 初始定义
57 *********************************************************************/
58 #define DUAN P0 //P0口控制段
59 #define WEI P2 //P2口控制位
60 uchar Count,days;
61 uint fen,cnt;
62 sbit jdq=P3^3;
63 sbit key=P3^5;
64 /********************************************************************
65 函数初始化
66 *********************************************************************/
67 void IapIdle(); //操作函数
68 uchar IapReadByte(uint addr); //读取函数
69 void IapProgramByte(uint addr,uchar dat); //写入函数
70 void IapEraseSector(uint addr); //擦除函数
71 void cshh();
72 //============================================================
73 //延时程序
74 void delayms(unsigned int x)
75 {
76 1 int i,j;
77 1 for(i=0;i<x;i++)
78 1 {
79 2 for(j=0;j<260;j++);
80 2 }
81 1 }
82
83 /********************************************************************
84 主函数
85 *********************************************************************/
86 void main()
87 {
88 1 delayms(600);
89 1 Count=IapReadByte(0);
90 1 days=IapReadByte(1);
91 1 Count++;
92 1 IapEraseSector(0); //擦除扇区 //34us
93 1 IapProgramByte(0,Count); //写入数据//38us
94 1
95 1 cshh(); //定时器中断初始化
96 1 if(Count<C)
97 1 TR0=1;
98 1
99 1 if(Count>=C||days==T)
100 1 {
101 2 TR0=0;
102 2 jdq=1;
103 2 IapEraseSector(0); //擦除扇区
104 2 IapProgramByte(0,C+2); //写入数据
105 2 }
106 1 while(1)
107 1 { if(key==0)
108 2 {
109 3 while(!key);
110 3 IapEraseSector(0); //擦除扇区
111 3 }
112 2 }
113 1
114 1 }
115
116 /********************************************************************
117 操作函数
C51 COMPILER V9.00 CHENGXU 03/05/2012 10:22:22 PAGE 3
118 *********************************************************************/
119 void IapIdle()
120 {
121 1 IAP_CONTR=0;
122 1 IAP_CMD=0;
123 1 IAP_TRIG=0;
124 1 IAP_ADDRH=0X80;
125 1 IAP_ADDRL=0;
126 1 }
127 /********************************************************************
128 读取一个字节函数
129 *********************************************************************/
130 uchar IapReadByte(uint addr)
131 {
132 1 uchar dat;
133 1 IAP_CONTR=ENABLE_IAP;
134 1 IAP_CMD=CMD_READ;
135 1 IAP_ADDRL=addr;
136 1 IAP_ADDRH=addr>>8;
137 1 IAP_TRIG=0X5A;
138 1 IAP_TRIG=0XA5;
139 1 _nop_();
140 1 _nop_();
141 1 _nop_();
142 1 dat=IAP_DATA;
143 1 IapIdle();
144 1 return dat;
145 1 }
146
147 /********************************************************************
148 写入一个字节函数
149 *********************************************************************/
150 void IapProgramByte(uint addr,uchar dat)
151 {
152 1
153 1 IAP_CONTR=ENABLE_IAP;
154 1 IAP_CMD=CMD_PROGRAM;
155 1 IAP_ADDRL=addr;
156 1 IAP_ADDRH=addr>>8;
157 1 IAP_DATA=dat;
158 1 IAP_TRIG=0X5A;
159 1 IAP_TRIG=0XA5;
160 1 _nop_();
161 1 _nop_();
162 1 _nop_();
163 1 IapIdle();
164 1 }
165 /********************************************************************
166 擦除一个字节函数
167 *********************************************************************/
168 void IapEraseSector(uint addr)
169 {
170 1 IAP_CONTR=ENABLE_IAP;
171 1 IAP_CMD=CMD_ERASE;
172 1 IAP_ADDRL=addr;
173 1 IAP_ADDRH=addr>>8;
174 1 IAP_TRIG=0X5A;
175 1 IAP_TRIG=0XA5;
176 1 _nop_();
177 1 _nop_();
178 1 _nop_();
179 1 IapIdle();
C51 COMPILER V9.00 CHENGXU 03/05/2012 10:22:22 PAGE 4
180 1 }
181
182 /********************************************************************
183 定时器中断初始化
184 *********************************************************************/
185 void cshh()
186 {
187 1 TMOD|=0X01;//定义定时器工作方式
188 1 TH0=(65536-60000)/256;
189 1 TL0=(65536-60000)%256;
190 1 ET0=1;
191 1 EA=1; //开中断
192 1 }
193
194 /********************************************************************
195 定时器中断函数
196 *********************************************************************/
197 void timer1(void)interrupt 1
198 {
199 1 TH0=(65536-60000)/256; //60ms
200 1 TL0=(65536-60000)%256;
201 1 cnt++;
202 1 if(cnt==1000)//1000次一分钟
203 1 {
204 2 cnt=0;
205 2 fen++;
206 2 if(fen==60) //60次为一小时
207 2 {
208 3 fen=0;
209 3 days++;
210 3 IapEraseSector(1); //擦除扇区
211 3 IapProgramByte(1,Count); //写入数据
212 3
213 3 }
214 2 if(days==T)
215 2 {
216 3 jdq=1;
217 3 TR0=0;
218 3 }
219 2 }
220 1 }
221
222 /********************************************************************
223 结束
224 *********************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 315 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -