📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 08/29/2008 23:45:11 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************************************************
2 *此程序是以51单片机为控制核心,通过IIC记录,以数码管显示的数字钟*
3 *数码管驱动芯片:595,两片 *
4 *定时单元通过单片机内部定时器完成,定时存在一定误差 *
5 *按键调整模块还未加上 *
6 *作者:王发修 *
7 *时间:2008年8月29日 *
8 *此程序与勤奋的人分享,愿大家共同进步 *
9 ***************************************************************/
10 #include <AT89X52.H>
11 #include<intrins.h>
12 #include <absacc.h>
13
14 unsigned char sec,minite=30,hour=12; //定义计数值,每过1秒,sec加1
15 unsigned int tcnt; //定时中断次数
16 unsigned char extint0_count=0;
17 bit write=0; //写24C08的标志;
18
19 sbit MPX_DAT=P1^4;
20 sbit MPX_CLK=P1^5;
21 sbit MPX_OE =P1^6;
22
23 sbit IIC_SCL = P3^6; // 24c08 IIC_SCL
24 sbit IIC_SDA = P3^5; // 24c08 IIC_SDA
25
26 code unsigned char MPX[]={0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10};//位选信号
27 // 1 2 3 4 5 6 7 8
28 code unsigned char Seg7Code[] =
29 {//定义数码管字型数据
30 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, //0123456789
31 // 0x77,0x7C,0x39,0x5E,0x79,0x71, //AbCdEF
32 0x40, //-
33 0x00 //空白
34 };
35
36 unsigned char data buffer[8]={0,0,10,0,0,10,0,0};
37
38 void delay_ms(unsigned int n)
39 {
40 1 unsigned char i;
41 1 while(n--)
42 1 for(i=0;i<125;i++);
43 1 }
44 void MPX_Clear()//清除显示
45 {
46 1 unsigned char i;
47 1 for(i=25;i>0;i--)
48 1 {
49 2 MPX_CLK=0;
50 2 _nop_();
51 2 MPX_CLK=1;
52 2 _nop_();
53 2 MPX_DAT=1;
54 2 _nop_();
55 2 }
C51 COMPILER V7.50 MAIN 08/29/2008 23:45:11 PAGE 2
56 1 MPX_CLK=0;
57 1 }
58
59 void MPX_WriteData(unsigned char j)//向595写入8位数据
60 {
61 1 unsigned char c=8;
62 1 while(c--)
63 1 {
64 2 MPX_DAT=j&0x80;
65 2 MPX_CLK=0;
66 2 j=j<<1;
67 2 _nop_();
68 2 MPX_CLK=1;
69 2 _nop_();
70 2 }
71 1 }
72
73 void MPX_Display(unsigned char mybit,unsigned char mydata)
74 {
75 1 MPX_WriteData(~MPX[mybit]);
76 1 if(mybit>3)
77 1 {
78 2 MPX_WriteData(0x00);
79 2 MPX_WriteData(Seg7Code[mydata]);
80 2 }
81 1 else if(mybit<4)
82 1 {
83 2 MPX_WriteData(Seg7Code[mydata]);
84 2 MPX_WriteData(0x00);
85 2 }
86 1 MPX_CLK=0;
87 1 _nop_();
88 1 MPX_CLK=1;
89 1 _nop_();
90 1 }
91
92
93 /////////24C08读写驱动程序////////////////////
94
95 void shortdelay(unsigned char x)
96 { unsigned int i;
97 1 for(i=0;i<x;i++);
98 1 }
99 void flash()
100 { ; ; }
101
102 void IIC_Init() //24c08初始化子程序
103 {IIC_SCL = 1; flash(); IIC_SDA = 1; flash();}
104
105 void IIC_Start() //启动I2C总线
106 {IIC_SDA = 1; flash(); IIC_SCL = 1; flash(); IIC_SDA = 0; flash(); IIC_SCL = 0; flash();}
107
108 void IIC_Stop() //停止I2C总线
109 {IIC_SDA = 0; flash(); IIC_SCL = 1; flash(); IIC_SDA = 1; flash();}
110
111 void IIC_WriteByte(unsigned char dat) //写一个字节
112 { unsigned char i,uc_tmp;
113 1 uc_tmp=dat;
114 1 for (i=0;i<8;i++)
115 1 {uc_tmp=uc_tmp<<1; IIC_SCL=0; flash(); IIC_SDA=CY; flash(); IIC_SCL=1; flash();}
116 1 IIC_SCL=0; flash(); IIC_SDA=1; flash();
117 1 }
C51 COMPILER V7.50 MAIN 08/29/2008 23:45:11 PAGE 3
118 unsigned char IIC_ReadByte() //读一个字节
119 {
120 1 unsigned char i,j,uc_tmp=0;
121 1 IIC_SCL=0; flash(); IIC_SDA=1;
122 1 for (i=0;i<8;i++)
123 1 {
124 2 flash(); IIC_SCL=1; flash();
125 2 if (IIC_SDA==1) j=1;
126 2 else j=0;
127 2 uc_tmp=(uc_tmp<<1)|j;
128 2 IIC_SCL=0;
129 2 }
130 1 flash();
131 1 return(uc_tmp);
132 1 }
133 void IIC_Clock() // I2C总线时钟
134 {
135 1 unsigned char i=0;
136 1 IIC_SCL = 1; flash();
137 1 while ((IIC_SDA==1)&&(i<255))i++;
138 1 IIC_SCL = 0; flash();
139 1 }
140 ////////从24c02的地址address中读取一个字节数据/////
141 unsigned char X24C08_ReadByte(unsigned char address)
142 {
143 1 unsigned char uc_tmp;
144 1 IIC_Start(); IIC_WriteByte(0xa0);
145 1 IIC_Clock(); IIC_WriteByte(address);
146 1 IIC_Clock(); IIC_Start();
147 1 IIC_WriteByte(0xa1); IIC_Clock();
148 1 uc_tmp=IIC_ReadByte(); IIC_Stop();
149 1 shortdelay(10);
150 1 return(uc_tmp);
151 1 }
152 //////向24c02的address地址中写入一字节数据info/////
153 void X24C08_WriteByte(unsigned char address,unsigned char info)
154 {
155 1 EA=0;
156 1 IIC_Start(); IIC_WriteByte(0xa0);
157 1 IIC_Clock(); IIC_WriteByte(address);
158 1 IIC_Clock(); IIC_WriteByte(info);
159 1 IIC_Clock(); IIC_Stop();
160 1 EA=1;
161 1 shortdelay(50);
162 1 }
163 /////////////24C08读写驱动程序完/////////////////////
164
165 /*****************以上是IIC的底层协议*******************/
166
167 void t0(void) interrupt 1 using 0 //定时中断服务函数
168 {
169 1 TH0=(65536-50000)/256; //对TH0 TL0赋值
170 1 TL0=(65536-50000)%256; //重装计数初值
171 1 tcnt++; //每过250ust tcnt加一
172 1 if(tcnt==20) //计满20次(1秒)时
173 1 {
174 2 tcnt=0; //重新再计
175 2 sec++;
176 2 write=1; //1秒写一次24C08
177 2 if(sec==60) //定时100秒,在从零开始计时
178 2 {
179 3 {
C51 COMPILER V7.50 MAIN 08/29/2008 23:45:11 PAGE 4
180 4 sec=0;
181 4 minite++;
182 4 if(minite==60)
183 4 {
184 5 minite=0;
185 5 hour++;
186 5 if(hour==24)
187 5 hour=0;
188 5 }
189 4 }
190 3 }
191 2 }
192 1 }
193 void Timer0_Display()
194 {
195 1 unsigned char i;
196 1 buffer[0]=hour/10;buffer[1]=hour%10;
197 1 buffer[3]=minite/10;buffer[4]=minite%10;
198 1 buffer[6]=sec/10;buffer[7]=sec%10;
199 1 for(i=0;i<8;i++)
200 1 {
201 2 MPX_OE =1;
202 2 MPX_Display(i,buffer[i]);
203 2 MPX_OE=0;
204 2 delay_ms(1);
205 2 }
206 1 /*
207 1 MPX_OE =1;
208 1 MPX_Display(0,sec/100);
209 1 MPX_OE=0;
210 1 delay_ms(5);
211 1 MPX_OE =1;
212 1 MPX_Display(1,sec/10%10);
213 1 MPX_OE=0;
214 1 delay_ms(5);
215 1 MPX_OE =1;
216 1 MPX_Display(2,sec%10);
217 1 MPX_OE=0;
218 1 delay_ms(5);
219 1 */
220 1 }
221 void main(void)
222 {
223 1 TMOD=0x01; //定时器工作在方式1
224 1 ET0=1; EA=1;
225 1 MPX_Clear();
226 1 IIC_Init(); //初始化24C08
227 1 /*
228 1 X24C08_WriteByte(6,12);
229 1 delay_ms(11);
230 1 X24C08_WriteByte(4,30);
231 1 delay_ms(11);
232 1 X24C08_WriteByte(2,30); //在24c08的地址2中写入数据sec
233 1 delay_ms(11);
234 1 */
235 1 sec=X24C08_ReadByte(2);//读出保存的数据赋于sec
236 1 minite=X24C08_ReadByte(4);
237 1 hour=X24C08_ReadByte(6);
238 1 delay_ms(500);
239 1 TH0=(65536-50000)/256; //对TH0 TL0赋值
240 1 TL0=(65536-50000)%256; //使定时器0.05秒中断一次
241 1 TR0=1; //开始计时
C51 COMPILER V7.50 MAIN 08/29/2008 23:45:11 PAGE 5
242 1 while(1)
243 1 {
244 2 Timer0_Display();
245 2 if(write==1) //判断计时器是否计时一秒
246 2 {
247 3 write=0; //清零
248 3 X24C08_WriteByte(6,hour);
249 3 delay_ms(11);
250 3 X24C08_WriteByte(4,minite);
251 3 delay_ms(11);
252 3 X24C08_WriteByte(2,sec); //在24c08的地址2中写入数据sec
253 3 }
254 2 }
255 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 587 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 ----
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 + -