📄 11.lst
字号:
C51 COMPILER V8.08 11 10/28/2008 16:04:45 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 11
OBJECT MODULE PLACED IN 11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 11.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include <intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 unsigned char sec; //定义计数值,每过 1 秒,sec 加 1
6 unsigned int tcnt; //定时中断次数
7 bit write=0; //写 24C08 的标志;
8 sbit sda=P2^0; //IIC 接口 SDA 定义
9 sbit scl=P2^1; //IIC 接口 SCL 定义
10 sbit dula=P2^6;
11 sbit wela=P2^7;
12 unsigned char j,k;
13 void delay(unsigned char i) //延时程序
14 {
15 1 for(j=i;j>0;j--)
16 1 for(k=125;k>0;k--);
17 1 }
18 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
19 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
20 void display(uchar bai_c,uchar sh_c) //显示程序
21 {
22 1 dula=0;
23 1
24 1 P0=table[bai_c]; //显示百位
25 1 dula=1;
26 1 dula=0;
27 1 wela=0;
28 1 P0=0x7e;
29 1 wela=1;
30 1 wela=0;
31 1 delay(5);
32 1
33 1 P0=0; //------------
34 1 dula=1; //该部分仿真必须要。
35 1 dula=0; //因为每次下一位的段选打开后,码值会先赋值给上一位,
36 1 P0=0x7e; //从而改变上一位的显示。然后再打开下一位的位选。
37 1 wela=1; //
38 1 wela=0; //------------
39 1
40 1 dula=0;
41 1 P0=table[sh_c]; //显示十位
42 1 dula=1;
43 1 dula=0;
44 1 wela=0;
45 1 P0=0x7d;
46 1 wela=1;
47 1 wela=0;
48 1 delay(5);
49 1
50 1 P0=0; //------------
51 1 dula=1; //该部分仿真必须要。
52 1 dula=0; //因为每次下一位的段选打开后,码值会先赋值给上一位,
53 1 P0=0x7d; //从而改变上一位的显示。然后再打开下一位的位选。
54 1 wela=1; //
55 1 wela=0; //------------
C51 COMPILER V8.08 11 10/28/2008 16:04:45 PAGE 2
56 1 }
57
58 /////////24C02 读写驱动程序////////////////////
59 void delay1(unsigned char x) //延时子函数
60 {
61 1 unsigned int i;
62 1 for(i=0;i<x;i++);
63 1 }
64 void flash() //延时子函数
65 { ; ; }
66 void x24c08_init() //24c02 初始化子程序
67 { scl=1;
68 1 flash();
69 1 sda=1;
70 1 flash();
71 1 }
72 void start() //启动 I2C 总线
73 {
74 1 sda=1;
75 1 flash();
76 1 scl=1;
77 1 flash();
78 1 sda=0;
79 1 flash();
80 1 //scl=0;
81 1 //flash();
82 1 }
83 void stop() //停止 I2C 总线
84 {
85 1 sda=0;
86 1 flash();
87 1 scl=1;
88 1 flash();
89 1 sda=1;
90 1 flash();
91 1 }
92 void writex(unsigned char j) //写一个字节
93 { unsigned char i,temp;
94 1 temp=j;
95 1 for (i=0;i<8;i++)
96 1 {
97 2 temp=temp<<1;
98 2 scl=0;
99 2 flash();
100 2 sda=CY;
101 2 flash();
102 2 scl=1;
103 2 flash();
104 2 }
105 1 scl=0;
106 1 flash();
107 1 sda=1;
108 1 flash();
109 1 }
110 unsigned char readx() //读一个字节
111 {
112 1 unsigned char i,j,k=0;
113 1 scl=0;
114 1 flash();
115 1 sda=1;
116 1 for (i=0;i<8;i++)
117 1 {
C51 COMPILER V8.08 11 10/28/2008 16:04:45 PAGE 3
118 2 flash();
119 2 scl=1;
120 2 flash();
121 2 if (sda==1) j=1;
122 2 else j=0;
123 2 k=(k<<1)|j;
124 2 scl=0;
125 2 }
126 1 flash();
127 1 return(k);
128 1 }
129 void clock() //I2C总线应答子函数
130 {
131 1 unsigned char i=0;
132 1
133 1 sda=1; // 仿真增加语句
134 1 flash(); // 仿真增加语句
135 1
136 1 scl=1;
137 1 flash();
138 1 while ((sda==1)&&(i<255))i++;
139 1 scl=0;
140 1 flash();
141 1 }
142 ////////从 24c02 的地址 address 中读取一个字节数据/////
143 unsigned char x24c08_read(unsigned char address)
144 {
145 1 unsigned char i;
146 1 start();
147 1 writex(0xa0);
148 1 clock();
149 1 writex(address);
150 1 clock();
151 1 start();
152 1 writex(0xa1);
153 1 clock();
154 1 i=readx();
155 1 stop();
156 1 delay1(10);
157 1 return(i);
158 1 }
159 //////向 24c02 的 address 地址中写入一字节数据 info/////
160 void x24c08_write(unsigned char address,unsigned char info)
161 {
162 1 EA=0;
163 1 start();
164 1 writex(0xa0);
165 1 clock();
166 1 writex(address);
167 1 clock();
168 1 writex(info);
169 1 clock();
170 1 stop();
171 1 EA=1;
172 1 delay1(50);
173 1 }
174 void t0(void) interrupt 1 using 0 //定时中断服务函数
175 {
176 1 TH0=(65536-50000)/256; //对 TH0 TL0 赋值
177 1 TL0=(65536-50000)%256; //重装计数初值
178 1 tcnt++; //每过 250ust tcnt 加一
179 1 if(tcnt==20) //计满 20 次(1 秒)时
C51 COMPILER V8.08 11 10/28/2008 16:04:45 PAGE 4
180 1 {
181 2 tcnt=0; //重新再计
182 2 sec++;
183 2 write=1; //1 秒写一次 24C02
184 2 if(sec==100) //定时 100 秒,在从零开始计时
185 2 {sec=0;}
186 2 }
187 1 }
188
189 void main() //主函数
190 {
191 1 unsigned char i;
192 1 TMOD=0x01; //定时器工作在方式 1
193 1 ET0=1;
194 1 EA=1; //开中断
195 1 x24c08_init(); //初始化 24C08
196 1 sec=x24c08_read(2); //读出保存的数据赋于 sec
197 1 TH0=(65536-50000)/256; //对 TH0 TL0 赋值
198 1 TL0=(65536-50000)%256; //使定时器 0.05 秒中断一次
199 1 TR0=1; //启动定时器
200 1 while(1)
201 1 {
202 2 i=10;
203 2 while(i--)
204 2 { display(sec/10,sec%10); }
205 2 if(write==1) //判断计时器是否计时一秒
206 2 {
207 3 write=0; //清零
208 3 x24c08_write(2,sec); //在 24c02 的地址 2 中写入数据 sec
209 3 }
210 2 }
211 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 432 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -