1//多功能时钟, 精确到小数0.01秒, 即10ms
2//功能: 时钟, 秒表, 温度计
3
4/**//*
5S5键为功能选择键, 上电默认使用时钟功能
6功能顺序为: 时钟, 温度计, 秒表
7
8mode = 1. 时钟(每次掉电后都要重新设置时间)
91)当选中时钟功能时, 具体按键功能如下:
10
112)可设置时分秒, 时利用发光二极管显示, 分秒用数码管显示
12
133)时钟: 采用定时器0计时, 工作方式1
14
15mode = 2. 时钟设置模式
16当选中时钟设置模式
17S2为位选, S3为增加选中位的值
18S4确定更改, S5放弃更改, 进入秒表模式
19
20mode = 3. 秒表
211)当选中秒表功能时, 具体按键功能如下:
22S2为开始/暂停, S3为清零
23
242)采用定时器1计时, 工作方式1
25
26mode = 4. 温度计
271)利用DS18B20检测环境温度;
282)最小温度值为0.01℃, 可表示温度范围: -55℃~+125℃
29
30*/
31
32#include <reg52.H>
33#include <intrins.H>
34#include <math.h>
35
36//0-F数码管的编码(共阴极)
37unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
38 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
39//0-9数码管的编码(共阴极), 带小数点
40unsigned char code tableWidthDot[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,
41 0x87, 0xff, 0xef};
42
43sbit wela = P2^7; //数码管位选
44sbit dula = P2^6; //数码管段选
45sbit ds = P2^2;
46unsigned char th, tl, mode = 1; //mode存放功能模式, 默认在模式1 时钟
47unsigned char clockPosition = 0; //时钟设置模式下, 光标所在的位置; 默认在0
48unsigned char clockTmp = 0; //用于时钟模式下临时计数
49bit clockTmpBit = 0; //用于时钟模式下临时标志位
50
51//秒4字节, 分2字节, 时1字节
52unsigned char datas[] = {0, 0, 0, 0, 0, 0, 0};//保存计时器数据
53unsigned char clockDatas[] = {0, 0, 0, 0, 0, 0, 0};//保存时钟数据
54unsigned char * values = clockDatas; //根据mode选择适当的数据数组指针
55int tempValue; //存放温度值
56unsigned char tempCount = 0; //用于记录显示了多少次温度值, 用于定时
57
58sbit S2 = P3^4; //键S2, 作开始/暂停
59sbit S3 = P3^5; //键S3, 清零
60sbit S4 = P3^6; //键S4
61sbit S5 = P3^7; //键S5
62unsigned char tmpDatas[] = {0, 0, 0, 0, 0, 0, 0}; //存放临时设置值
63unsigned char icount;
64
65//延时函数, 对于11.0592MHz时钟, 例i=5,则大概延时5ms.
66void delay(unsigned int i)
67{
68 unsigned int j;
69 while(i--)
70 {
71 for(j = 0; j < 125; j++);
72 }
73}
74 |