📄 ninbo.lst
字号:
C51 COMPILER V7.50 NINBO 02/20/2009 23:58:25 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE NINBO
OBJECT MODULE PLACED IN ninbo.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ninbo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*本程序由陈永飞同志开发,信箱:baiyni888@163.com QQ:49204743
2 地址:江苏省仪征市新集镇凌东村 电话:13584016200
3 晶振用12MHz,数码管用共阳的*/
4
5 #include<reg52.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8 #include"DS1302.h"
9 #include"DS18B20.h"
10 #define sec 0x80
11 #define min 0x82
12 #define hou 0x84
13 #define read 0x01
14 unsigned char hour,minute,second,id=0,timecount,re_disp=0,p,n0,n1;
15 bit flag;
16 #define leddata P0 //定义数码管的段选
17 sbit ssw=P2^7; //小时十位
18 sbit sw=P2^6; //小时个位
19 sbit sfw=P2^5; //分十位
20 sbit fw=P2^4; //分个位
21 sbit wdsw=P2^3; //温度十位
22 sbit wdgw=P2^2; //温度个位
23 sbit DOWN=P2^1; //加按键
24 sbit UP=P2^0; //减按键
25 //sbit DQ=P3^0; //DS18B20信号端
26 //sbit T_CLK=P3^1; //DS1302的时钟端
27 //sbit T_IO=P3^2; //DS1302的数据端
28 //sbit T_RES=P3^3; //DS1302的复位端
29 sbit SET=P3^4; //时间设定键
30
31 unsigned int ok;
32 unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};
33 unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};
34 // 秒 分钟 小时 日 月 年 星期
35
36 void Set_id(unsigned char sel,unsigned char sel_1);
37
38 void delays(unsigned char k)
39 {
40 1 unsigned char i,j;
41 1 for(i=0;i<k;i++)
42 1 for(j=0;j<50;j++);
43 1 }
44
45 void display(void)
46 {
47 1 if(flag&hour) //为真时是设定时间
48 1 {
49 2 ssw=0;leddata=0xff;delays(10);ssw=1;
50 2 sw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sw=1;
51 2 }
52 1 else //为假时为正常走时
53 1 {
54 2 leddata=tab[Read1302(hou+1)/16];ssw=0;delays(10);ssw=1;
55 2 leddata=tab[Read1302(hou+1)%16]&~((unsigned char)~flag<<6);sw=0;delays(10);sw=1;
C51 COMPILER V7.50 NINBO 02/20/2009 23:58:25 PAGE 2
56 2 }
57 1 if(flag&minute)
58 1 {
59 2 sfw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sfw=1;
60 2 fw=0;leddata=0xff;delays(10);fw=1;
61 2 }
62 1 else
63 1 {
64 2 leddata=tab[Read1302(min+1)/16]&~((unsigned char)~flag<<6);sfw=0;delays(10);sfw=1;
65 2 leddata=tab[Read1302(min+1)%16];fw=0;delays(10);fw=1;
66 2 }
67 1 TR0=0; //关定时器
68 1 ok=Read_Temperature(); //调用读温度函数
69 1 TR0=1; //开定时器
70 1 p=(unsigned char)(ok>>4); //温度数据转换
71 1 wdsw=0;leddata=tab[p%100/10];delays(10);wdsw=1; //温度显示十位
72 1 wdgw=0;leddata=tab[p%10];delays(10);wdgw=1; //温度显示个位
73 1 }
74
75 void id_case1_key(void) //按键加减子程序
76 {
77 1 display();
78 1 if (!DOWN) //减少
79 1 {
80 2 while(!DOWN)display();
81 2 re_disp=0;
82 2 Set_id(id,0);
83 2 }
84 1 if (!UP) //增加
85 1 {
86 2 while(!UP)display();
87 2 re_disp=0;
88 2 Set_id(id,1);
89 2 }
90 1 }
91
92 void Scan_Key(void) //按键扫描程序
93 {
94 1 display();
95 1 if(!SET)
96 1 {
97 2 while(!SET)display();
98 2 re_disp=0;
99 2 id++;if(id>2)id=0;
100 2 }
101 1 if(id==0){hour=0;minute=0;second=0;}
102 1 if(id==1){hour=1;id_case1_key();}
103 1 if(id==2){hour=0;minute=1;id_case1_key();}
104 1 // if(id==3){minute=0;second=1;id_case1_key();}
105 1 }
106
107
108
109 //根据选择调整相应项目并写入DS1302
110 void Set_id(unsigned char sel,unsigned char sel_1)
111 {
112 1 signed char max,mini,address,item;
113 1 if(sel==1) {address=hou; max=23;mini=0;} //小时
114 1 if(sel==2) {address=min; max=59;mini=0;} //分钟
115 1 // if(sel==3) {address=sec; max=0;mini=0;} //秒
116 1 item=Read1302(address+1)/16*10+Read1302(address+1)%16;
117 1 if (sel_1==0) item--; else item++;
C51 COMPILER V7.50 NINBO 02/20/2009 23:58:25 PAGE 3
118 1 if(item>max) item=mini;
119 1 if(item<mini) item=max;
120 1 Write1302(0x8e,0x00);//允许写操作
121 1 Write1302(address,item/10*16+item%10);
122 1 Write1302(0x8e,0x80);//写保护,禁止写操作
123 1 }
124
125 void main()
126 { TMOD=0x01;
127 1 TH0=(65535-50000)/256;
128 1 TL0=(65535-50000)%256;
129 1 EA=1;
130 1 ET0=1;
131 1 TR0=1;
132 1 Write1302(0x90,0xa5);//打开充电二级管 一个二级管串联一个2K电阻
133 1 Write1302(0x8e,0x80);//写保护,禁止写操作
134 1 if(!UP&!DOWN)Set1302(inittime);
135 1 adjust_res(0x7f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125; 0x7f:0.0625
136 1 while(1)
137 1 {
138 2 Scan_Key(); //调用按键扫描程序
139 2 display(); //调用数码管显示程序
140 2
141 2
142 2 }
143 1 }
144
145 void t0(void) interrupt 1 using 0
146 {
147 1 TH0=(65535-50000)/256; //50ms定时
148 1 TL0=(65535-50000)%256;
149 1 timecount++;re_disp++;
150 1 if(timecount>9)
151 1 {
152 2 timecount=0;
153 2 flag=~flag;
154 2 }
155 1 if(re_disp>200){re_disp=0;if(id)id=0;}
156 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 896 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 3
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 + -