tlc549_3.lst
来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 338 行
LST
338 行
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TLC549_3
OBJECT MODULE PLACED IN tlc549_3.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE tlc549_3.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #pragma ot(5,SIZE)
3 #include <reg51.h>
4 #include <intrins.h>
5 #define ERRORCOUNT 10
6 sbit SDA=P3^3;
7 sbit SCL=P3^5;
8 enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
9 enum eepromtype EepromType; /* 器件类型枚举变量取值为0-8 */
10
11 //定义显示数组d[4]以及一个变量n用于动态显示
12 unsigned char d[4],n;
13 //定义显示用的查找表
14 unsigned char code table[11]={0x3f,6,0x5b,0x4f,
15 0x66,0x6d,0x7d,7,0x7f,0x6f,0}; //0--9 最后再有一个空
16 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
17
18 //定义TLC549转换接口
19 sbit tlc549_cs=P1^6;
20 sbit tlc549_clk=P1^5;
21 sbit tlc549_data=P1^4;
22
23 //定义可位寻址的变量adc用于存放ad转换值,
24 //以及一个bit变量用于移位,它指示了ad的最最低一位
25 unsigned char bdata adc;
26 sbit adclow=adc^0;
27
28 //ad转换函数
29 unsigned char adconvert()
30 { unsigned char i;
31 1 tlc549_cs=1;
32 1 tlc549_cs=0;
33 1 tlc549_clk=0;
34 1 for(i=0;i<8;i++)
35 1 { tlc549_clk=1;
36 2 adclow=tlc549_data;
37 2 tlc549_clk=0;
38 2 if(i<7) adc=adc<<1;
39 2 }
40 1 tlc549_clk=0;
41 1 tlc549_cs=1;
42 1 return(adc);
43 1 }
44
45 /******将ad转换BCD码值显示出来**********/
46 vtobcd(unsigned int hexs)
47 {
48 1 d[0]=hexs/1000;
49 1 hexs=hexs % 1000;
50 1 d[1]=hexs/100;
51 1 hexs=hexs % 100;
52 1 d[2]=hexs/10;
53 1 hexs=hexs % 10;
54 1 d[3]=hexs;
55 1 }
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 2
56
57 /*******延时函数***********/
58 void delay(unsigned char dy)
59 {
60 1 while(--dy);
61 1 }
62
63 /***********************************************************************************/
64 bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
65 unsigned char ControlByte,enum eepromtype EepromType)
66 {
67 1 void Delay(unsigned char DelayCount);
68 1 void IICStart(void);
69 1 void IICStop(void);
70 1 bit IICRecAck(void);
71 1 void IICNoAck(void);
72 1 void IICAck(void);
73 1 unsigned char IICReceiveByte(void);
74 1 void IICSendByte(unsigned char sendbyte);
75 1 unsigned char data j,i=ERRORCOUNT;
76 1 bit errorflag=1; /* clr errorflag */
77 1 while(i--) /* 启动IIC总线并发送EEPROM从器件地址 */
78 1 {
79 2 IICStart(); /* 启动IIC总线 */
80 2 IICSendByte(ControlByte&0xfe); /* 发送EEPROM地址 */
81 2 if(IICRecAck()) /* 接收EEPROM应答信号 */
82 2 continue; /* 接收EEPROM应答信号,为1重新启动 */
83 2 if(EepromType>M2416) /* EEPROM为24C32以上器件内地址为2字节 */
84 2 {
85 3 IICSendByte((unsigned char)(Address>>8));/* 先发送高字节,参考硬件相关说明 */
86 3 if(IICRecAck())
87 3 continue;
88 3 }
89 2 IICSendByte((unsigned char)Address);/* 再发送低字节或单字节地址 */
90 2 if(IICRecAck())
91 2 continue;
92 2 if(!(ControlByte&0x01)) /* 以下为写操作 */
93 2 {
94 3 j=ByteQuantity; /* ByteQuantity为写入字节数 */
95 3 errorflag=0;
96 3 while(j--)
97 3 {
98 4 IICSendByte(*DataBuff++); /* DataBuff写操作缓冲区 */
99 4 if(!IICRecAck())
100 4 continue;
101 4 errorflag=1;
102 4 break;
103 4 }
104 3 if(errorflag==1)
105 3 continue;
106 3 break;
107 3 }
108 2 else /* 以下为读操作 */
109 2 {
110 3 IICStart(); /* 重新启动IIC总线并发送EEPROM从器件地址 */
111 3 IICSendByte(ControlByte);
112 3 if(IICRecAck())
113 3 continue;
114 3 while(--ByteQuantity) /* 每次读一字节,共ByteQuantity字节 */
115 3 {
116 4 *DataBuff++=IICReceiveByte(); /*读1字节并存入DataBuff为指针的存储单元 */
117 4 IICAck(); /* 发送应答信号 */
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 3
118 4 }
119 3 *DataBuff=IICReceiveByte(); /*read last byte data*/
120 3 IICNoAck(); /* 读入最后一字节无须发送应答信号 */
121 3 errorflag=0;
122 3 break;
123 3 }
124 2 }
125 1 IICStop(); /* 停止IIC总线信号 */
126 1 if(!(ControlByte&0x01)) /* 写入操作需延时,确保足够长写入时间 */
127 1 {
128 2 Delay(255);
129 2 Delay(255);
130 2 Delay(255);
131 2 Delay(255);
132 2 }
133 1 return(errorflag);
134 1 }
135
136 /*******************
137 以下是对IIC操作子程序
138 *******************/
139 /*******************
140 启动IIC
141 *******************/
142 void IICStart(void)
143 {
144 1 SCL=0;
145 1 SDA=1;
146 1 SCL=1;
147 1 _nop_();
148 1 _nop_();
149 1 _nop_();
150 1 SDA=0;
151 1 _nop_();
152 1 _nop_();
153 1 _nop_();
154 1 _nop_();
155 1 SCL=0;
156 1 SDA=1;
157 1 }
158 /*****************
159 停止IIC总线
160 *****************/
161 void IICStop(void)
162 {
163 1 SCL=0;
164 1 SDA=0;
165 1 SCL=1;
166 1 _nop_();
167 1 _nop_();
168 1 _nop_();
169 1 SDA=1;
170 1 _nop_();
171 1 _nop_();
172 1 _nop_();
173 1 SCL=0;
174 1 }
175 /**************
176 检查应答位
177 **************/
178 bit IICRecAck(void)
179 {
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 4
180 1 SCL=0;
181 1 SDA=1;
182 1 SCL=1;
183 1 _nop_();
184 1 _nop_();
185 1 _nop_();
186 1 _nop_();
187 1 CY=SDA; /* 应答位返回值在CY中,0有效 */
188 1 SCL=0;
189 1 return(CY);
190 1 }
191 /***************
192 对IIC总线产生应答
193 ***************/
194
195 void IICAck(void)
196 {
197 1 SDA=0;
198 1 SCL=1;
199 1 _nop_();
200 1 _nop_();
201 1 _nop_();
202 1 _nop_();
203 1 SCL=0;
204 1 _nop_();
205 1 SDA=1;
206 1 }
207
208 /*****************
209 不对IIC总线产生应答
210 *****************/
211 void IICNoAck(void)
212 {
213 1 SDA=1;
214 1 SCL=1;
215 1 _nop_();
216 1 _nop_();
217 1 _nop_();
218 1 _nop_();
219 1 SCL=0;
220 1 }
221
222 /*******************
223 向IIC总线写数据
224 *******************/
225 void IICSendByte(unsigned char sendbyte)
226 {
227 1 unsigned char data j=8;
228 1 for(;j>0;j--)
229 1 {
230 2 SCL=0;
231 2 sendbyte<<=1; /* 发送字节变量sendbyte左移1位,CY=sendbyte^7,并回存 */
232 2 SDA=CY;
233 2 SCL=1;
234 2 }
235 1 SCL=0;
236 1 }
237
238 /********************
239 从IIC总线读数据子程序
240 ********************/
241 unsigned char IICReceiveByte(void)
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 5
242 {
243 1 register receivebyte,i=8;
244 1 SCL=0;
245 1 while(i--)
246 1 {
247 2 SCL=1;
248 2 receivebyte=(receivebyte<<1)|SDA;
249 2 SCL=0;
250 2 }
251 1 return(receivebyte);
252 1 }
253
254 /*****定时器初始化函数********/
255 void Init_Timer (void)
256 {
257 1 TMOD=0X21;
258 1 TR0=1;
259 1 ET0=1;
260 1 EA=1;
261 1 }
262
263 /**********定时器0中断服务函数*****************/
264 void timer0() interrupt 1 using 1
265 {
266 1 TH0=(65536-1000)/256;
267 1 TL0=(65536-1000)%256;
268 1 n=n++;
269 1 if(n>3) n=0;
270 1 P0=0;
271 1 P2=digit[n];
272 1 P0=table[d[n]];
273 1 }
274
275 /******主函数main*************/
276 //效果就是多次测量求平均值然后显示测量的电压值;
277 //电压值用mv为单位,范围 0--5000mv
278 //由于测量值的范围为0--255,所以中间要乘一个系数19.6
279 //并且将测量的值存入24c64
280 /*****************************/
281 void main()
282 {
283 1 unsigned char ad,j;
284 1 unsigned int sum_ad=0;
285 1 unsigned int *adc=0x30;
286 1 Init_Timer();
287 1 //变量初始化
288 1 n=0;
289 1 while(1)
290 1 {
291 2 for(j=0;j<10;j++)
292 2 { ad=adconvert(); //ad转换
293 3 sum_ad=sum_ad+ad;
294 3 delay(250);
295 3 }
296 2 sum_ad=sum_ad/10;
297 2 vtobcd(sum_ad*19.6); //将ad转换BCD码
298 2 *adc=sum_ad*19.6;
299 2 RW24XX(0x30,2,0x0010,0xa0,6); /*把0x30开始的 待写入数据存储指针,写入字节数 */
300 2 for(j=0;j<200;j++) delay(250);
301 2 RW24XX(0x40,2,0x0010,0xa1,6);
302 2 for(j=0;j<200;j++) delay(250);
303 2 }
C51 COMPILER V7.20 TLC549_3 06/12/2007 13:59:46 PAGE 6
304 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 765 ----
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 18
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?