📄 0838.lst
字号:
C51 COMPILER V7.20 0838 07/19/2007 10:17:26 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE 0838
OBJECT MODULE PLACED IN 0838.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 0838.c BROWSE DEBUG OBJECTEXTEND
line level source
1 ///////////////////////////////////////////////////////////////////////////////////////////////
2 //
3 // H.C.H
4 // NNU(南京师范大学通信工程)
5 // TLC0838驱动程序TLC0838_II.c
6 // uchar adc_tlc0838(uchar channel);
7 // 函数说明:channel为通道的选择:0……CH0 1……CH1 2……CH2 3……CH3
8 // 当error=0时,返回的值为有效值,当error=1时,返回值无效
-
9 ///////////////////////////////////////////////////////////////////////////////////////////////
10
11 #include<reg51.h>
12 #include<intrins.h>
13 #define uchar unsigned char
14 #define uint unsigned int
15
16
17 sbit CLK=P1^6; //TLC0838---PIN16
18 sbit DI=P1^5; //TLC0838---PIN17
19 sbit DO=P1^7; //TLC0838---PIN14
20 sbit CS=P1^4; //TLC0838---PIN18
21 //SE接成低电平
22
23 //1602 数据口定义
24 #define lcd_bus P0
25
26 //1602引脚定义
27 sbit rs=P2^5;
28 sbit rw=P2^6;
29 sbit e=P2^7;
30
31 //ASCII码表
32 /**********0---9**************/
33 unsigned int code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
34 /**********a---z**************/
35 unsigned int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
36 0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
37 /***********A---Z*************/
38 unsigned int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
39 0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};
40
41 //基本变量定义
42 //uchar cnt;
43 unsigned int d[3];
44
45 bit error=1;
46
47
48
49 uint adc_tlc0838(uchar channel)
50 {
51 1 uchar t,i;
52 1 uint Temp1=0,Temp2=0;
53 1 if (channel==0) t=0;
54 1 else if(channel==1) t=1;
C51 COMPILER V7.20 0838 07/19/2007 10:17:26 PAGE 2
55 1 else if(channel==2) t=4;
56 1 else if(channel==3) t=5;
57 1 else if(channel==4) t=2;
58 1 else if(channel==5) t=3;
59 1 else if(channel==6) t=6;
60 1 else if(channel==7) t=7;
61 1
62 1 CS=1;
63 1 _nop_();_nop_();_nop_();_nop_();
64 1
65 1
66 1 CLK=0;
67 1 CS=0; //使AD通道打开
68 1 DI = 1; //Start bit=1
69 1 CLK = 1;
70 1 _nop_();
71 1 _nop_();
72 1
73 1 CLK=0;
74 1 CS=0;
75 1 DI = 1;
76 1 CLK = 1;
77 1 _nop_();
78 1 _nop_();
79 1
80 1
81 1 for(i=0;i<3;i++)
82 1 {
83 2 CLK = 0;
84 2 _nop_();
85 2 _nop_();
86 2 if(t&1)DI=1;
87 2 else DI=0;
88 2 t=t>>1;
89 2 CLK = 1;
90 2 _nop_();
91 2 _nop_();
92 2 }
93 1
94 1
95 1 CLK=0;
96 1 _nop_();
97 1 _nop_();
98 1 CLK=1;
99 1 _nop_();
100 1 _nop_();
101 1
102 1
103 1 for(i=0;i<=6;i++)
104 1 {
105 2 CLK = 0; //时钟为低电平
106 2 if(DO)
107 2 { //如果采集到的位为1
108 3 Temp1=Temp1+1; //给临时存储Temp1加1
109 3 Temp1=Temp1<<1;
110 3 } //临时存储器左移一位
111 2 else
112 2 Temp1=Temp1<<1; //如果采集到的数位为0,临时存储器左移一位
113 2 _nop_();
114 2 _nop_();
115 2 _nop_();
116 2 _nop_();
C51 COMPILER V7.20 0838 07/19/2007 10:17:26 PAGE 3
117 2 CLK = 1;
118 2 } //时钟为高电平,完成一个时钟周期数据采集
119 1 CLK = 0;
120 1 if(DO) Temp1=Temp1+1;
121 1 if(DO) Temp2=0x80;
122 1
123 1 CLK = 1;
124 1 //采集数据校验
125 1
126 1 for(i=0;i<=6;i++)
127 1 {
128 2 CLK=0;
129 2 if(DO){
130 3 Temp2=Temp2>>1;
131 3 Temp2=Temp2+0x80; }
132 2 else
133 2 Temp2=Temp2>>1;
134 2 CLK = 1;
135 2 }
136 1 CS = 1;
137 1 if(Temp1==Temp2) //判断数据采集是否有效
138 1 {
139 2 error=0;
140 2 return Temp1;
141 2 }
142 1 else
143 1 {
144 2 error=1;
145 2 return 0;
146 2 }
147 1 }
148
149
150
151 /*
152 hexstoascii2(unsigned int hex)
153 {
154 d[0]=table[hex/10];
155 hex=hex%10;
156 d[1]=table[hex];
157 }
158 */
159
160 hexstoascii3(unsigned int hex)
161 {
162 1 d[0]=table[hex/100];
163 1 hex=hex%100;
164 1 d[1]=table[hex/10];
165 1 hex=hex%10;
166 1 d[2]=table[hex];
167 1 }
168
169
170
171 /*********延时子程序**********/
172 void delay(uchar dy)
173 {
174 1 while(--dy);
175 1 }
176
177 /***********忙判断标志,返回一个位BF********************/
178 bit lcd_busy(void)
C51 COMPILER V7.20 0838 07/19/2007 10:17:26 PAGE 4
179 {
180 1 uchar busy_flag;
181 1 rs=0;
182 1 rw=1;
183 1 _nop_();
184 1 e=1;
185 1 _nop_();
186 1 lcd_bus=0xff;
187 1 busy_flag=lcd_bus; //e在高电平时读
188 1 e=0;
189 1 return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
190 1 }
191
192
193 /********写命令,有两个参数,一个是要写的命令控制字,
194 第二个是用来控制是否进行忙标志的判断。
195 busyflag=1;
196 判断: 为0
197 ***************/
198 void lcd_wrcmd(unsigned char lcdcmd)
199 {
200 1 while(lcd_busy()); //等待空闲
201 1 lcd_bus=lcdcmd;
202 1 rs=0;
203 1 rw=0;
204 1 _nop_();
205 1 e=1;
206 1 _nop_();
207 1 _nop_();
208 1 e=0; //产生一个下沿
209 1 }
210
211
212
213 /***************向液晶写数据******************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -