📄 7455.lst
字号:
C51 COMPILER V8.08 7455 01/22/2011 09:43:35 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 7455
OBJECT MODULE PLACED IN 7455.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE 7455.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************/
2 /*程序功能:飞思卡尔加速度传感器MMA7455娱乐仪*/
3 /*程序模块:1、LED阵列显示模块 */
4 /* 2、1602显示模块 */
5 /* 3、I2C通信模块 */
6 /* 4、按键控制模块 */
7 /*程序最后修改日期:2010年11月8日星期一 */
8 /*作者:山西太原瑞生嵌入式 */
9 /*联系方式:QQ: 253057617 */
10 /* 旺旺:qq253057617 */
11 /* E-mail:richgood@163.com */
12 /*********************************************/
13
14 #include <reg52.h>
15 #include <intrins.h> //要用到_nop_();函数
16
17 #define uchar unsigned char
18 #define uint unsigned int
19 /***************************************************************************/
20 /*********** 单片机引脚定义 ************/
21 /***************************************************************************/
22 sbit set_key =P3^2; //设置按钮
23 sbit jia_key =P1^7; //加按钮
24 sbit jian_key=P1^6; //减按钮
25 sbit sda=P2^3; //I2C 数据传送位
26 sbit scl=P2^4; //I2C 时钟传送位
27 sbit rs=P2^5; //1602RS控制位
28 sbit rw=P2^6; //1602RW控制位
29 sbit e =P2^7; //1602E 控制位
30
31 /******************************************************************************/
32 /********** 数据部分 ***********/
33 /******************************************************************************/
34 #define IIC_READ 0x1D //定义读指令
35 #define IIC_WRITE 0x1D //定义写指令
36
37 uchar set_key_sign; //是否在设置状态标志
38 uchar delaysign; //视觉停留标志
39
40 uchar xposivalue; //x正方向满格显示g值
41 uchar xnegavalue; //x反方向满格显示g值
42 uchar yposivalue; //y正方向满格显示g值
43 uchar ynegavalue; //y反方向满格显示g值
44 //11111111 11111110 11111100 --- 10000000 00000000 led_ma[i]:i为亮灯数量
45 uchar led_ma[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
46 uchar xposiupstate; //x正方向上8个LED显示状态
47 uchar xposidownstate; //x正方向下8个LED显示状态
48 uchar xnegaupstate; //x反方向上8个LED显示状态
49 uchar xnegadownstate; //x反方向下8个LED显示状态
50 uchar yupstate; //y方向上8个LED显示状态
51 uchar ydownstate; //y方向下8个LED显示状态
52 uchar xposilightnum; //x正方向亮灯数量(1——16)
53 uchar xnegalightnum; //x反方向亮灯数量(1——16)
54 uchar yposilightnum; //y正方向亮灯数量(1——8)
55 uchar ynegalightnum; //x正方向亮灯数量(1——8)
C51 COMPILER V8.08 7455 01/22/2011 09:43:35 PAGE 2
56
57 uchar ack_sign; //I2C 应答标志
58 uchar table1[16]=" hello! X= 0.00"; //1602显示数据
59 uchar table2[16]=" Y= 0.00 Z= 0.00";
60 uchar table3[16]="No acceleration!";
61 uchar table4[10]="0123456789";
62 uchar table5[8] ="Warning!";
63 uchar table7[16]="value: X=0.50 ";
64
65 /**************************************************************************/
66 /************ 各延时程序 **************/
67 /**************************************************************************/
68 void iic_delay() //5us延时
69 {
70 1 _nop_();
71 1 _nop_();
72 1 _nop_();
73 1 _nop_();
74 1 }
75
76 void delay() //消除按键抖动
77 {
78 1 unsigned int i;
79 1 for(i=0;i<20000;i++);
80 1 }
81 void delay_50us(uint t)
82 {
83 1 uchar j;
84 1 for(;t>0;t--)
85 1 for(j=19;j>0;j--);
86 1 }
87 void delay_50ms(uchar t)
88 {
89 1 uint j;
90 1 for(;t>0;t--)
91 1 for(j=6245;j>0;j--);
92 1 }
93 /************************************************************************/
94 /************** 1602显示部分 *****************/
95 /************************************************************************/
96 void write_com(uchar com) //函数功能:写指令
97 {
98 1 e=0;
99 1 rs=0;
100 1 rw=0;
101 1 P0=com;
102 1 delay_50us(10);
103 1 e=1;
104 1 delay_50us(20);
105 1 e=0;
106 1 }
107 void write_date(uchar dat) //函数功能:写数据
108 {
109 1 e=0;
110 1 rs=1;
111 1 rw=0;
112 1 P0=dat;
113 1 delay_50us(10);
114 1 e=1;
115 1 delay_50us(20);
116 1 e=0;
117 1 }
C51 COMPILER V8.08 7455 01/22/2011 09:43:35 PAGE 3
118
119 void init1602(void) //函数功能:初始化1602
120 {
121 1 delay_50us(300);
122 1 write_com(0x38);
123 1 delay_50us(100);
124 1 write_com(0x38);
125 1 delay_50us(100);
126 1 write_com(0x38);
127 1 write_com(0x38);
128 1 write_com(0x01);
129 1 write_com(0x01);
130 1 write_com(0x06);
131 1 write_com(0x0c);
132 1 }
133 /*********************************************************************/
134 /************** I2C通信部分 ***************/
135 /*********************************************************************/
136 void iic_start() //函数功能:I2C通信开始
137 {
138 1 sda=1;
139 1 iic_delay();
140 1 scl=1;
141 1 iic_delay();
142 1 sda=0;
143 1 iic_delay();
144 1
145 1 }
146
147 void iic_stop() //函数功能:I2C通信停止
148 {
149 1 sda=0;
150 1 iic_delay();
151 1 scl=1;
152 1 iic_delay();
153 1 sda=1;
154 1 iic_delay();
155 1
156 1 }
157
158 void iic_ack() //函数功能:I2C通信查应答位
159 {
160 1 sda=1;
161 1 scl=1;
162 1 iic_delay();
163 1 ack_sign=sda;
164 1 scl=0;
165 1 }
166
167 void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
168 {
169 1 uchar i,temp,temp1;
170 1
171 1 temp1=wdata;
172 1 for(i=0;i<8;i++)
173 1 {
174 2 scl = 0;
175 2 iic_delay();
176 2 temp=temp1;
177 2 temp=temp&0x80;
178 2 if(temp==0x80)
179 2 sda=1;
C51 COMPILER V8.08 7455 01/22/2011 09:43:35 PAGE 4
180 2 else
181 2 sda=0;
182 2 iic_delay();
183 2 scl=1;
184 2 iic_delay();
185 2 scl=0;
186 2 iic_delay();
187 2 temp1=temp1<<1;
188 2
189 2 }
190 1
191 1 }
192 char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节
193 {
194 1 uchar x;
195 1 char data_data;
196 1 for(x=0;x<8;x++)
197 1 {
198 2 data_data=data_data<<1;
199 2 sda=1;
200 2 iic_delay();
201 2 scl=0;
202 2 iic_delay();
203 2 scl=1;
204 2 iic_delay();
205 2 if(sda==1)
206 2 data_data|=0x01;
207 2 //else
208 2 // data_data&=0xfe;
209 2 }
210 1 return data_data;
211 1 }
212 void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
213 {
214 1 uchar t;
215 1 t=(IIC_WRITE<<1);
216 1 iic_start();
217 1 iic_write_byte(t);
218 1 iic_ack();
219 1 iic_write_byte(byte_add);
220 1 iic_ack();
221 1 iic_write_byte(wdata);
222 1 iic_ack();
223 1 iic_stop();
224 1 }
225 char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据
226 {
227 1 uchar t;
228 1 char x;
229 1 t=(IIC_WRITE<<1);
230 1 iic_start();
231 1 iic_write_byte(t);
232 1 iic_ack();
233 1 iic_write_byte(byte_add);
234 1 iic_ack();
235 1 t=((IIC_READ<<1)|0x01);
236 1 iic_start();
237 1 iic_write_byte(t);
238 1 iic_ack();
239 1 x=iic_read_byte();
240 1 iic_ack();
241 1 iic_stop();
C51 COMPILER V8.08 7455 01/22/2011 09:43:35 PAGE 5
242 1 return x;
243 1 }
244 /************************************************************************/
245 /************* LED显示阵列部分 **************/
246 /************************************************************************/
247 void led_send(unsigned char t) //函数功能:8051单片机串行通信发送
248 {
249 1 SBUF=t;
250 1 while(!TI);
251 1 TI=0;
252 1 }
253
254 void led_show() //函数功能:LED面板显示输出
255 {
256 1 led_send(xnegaupstate);
257 1 led_send(xnegadownstate);
258 1 led_send(xposiupstate);
259 1 led_send(xposidownstate);
260 1 led_send(yupstate );
261 1 led_send(ydownstate);
262 1
263 1 }
264 void led_init() //函数功能:初始化LED面板
265 {
266 1 SCON=0x00;
267 1 xposiupstate =led_ma[0];
268 1 xposidownstate=led_ma[1];
269 1 xnegaupstate =led_ma[0];
270 1 xnegadownstate=led_ma[1];
271 1 yupstate =led_ma[1];
272 1 ydownstate =led_ma[0];
273 1 led_show();
274 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -