心钟有你,单片机时钟Linux内核!
文章尾部有彩蛋.
原理图.

焊接元件.


焊接完毕.


最终的效果.

写程序.
爱心时钟头文件.
#ifndef __STC15F2K_H__
#define __STC15F2K_H__
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
sfr P_SW2 = 0xBA; //xxxx,x000 外设端口切换寄存器
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
#endifDS1302时钟芯片驱动程序.
#include "STC15F2K.h" //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
// ds1302 内部RAM RAM0 1100 000R/W 1读 0写
// RAM1 1100 001R/W
//
// .......
//
// RAM30 1111 110R/W
sbit clk = P3^2; //ds1302时钟线定义
sbit io = P3^1; //数据线
sbit rst = P5^5; //复位线
//秒 分 时 日 月 年 星期
uchar code write_add[]={0x80,0x82,0x84}; //写地址,0x86,0x88,0x8c,0x8a
//uchar code read_add[] ={0x81,0x83,0x85}; //读地址,0x87,0x89,0x8d,0x8b
uchar code init_ds[] ={0x55,0x17,0x15,0x01,0x01,0x13,0x13};
uchar miao,fen,shi;//,ri,yue,week,nian=0x20;
uchar nfen=0;
uchar nshi=0;
//写一个数据到对应的地址里;
void write_ds1302(uchar add,uchar dat)
{
uchar i;
rst = 1; //把复位线拉高;
for(i=0;i<8;i++)
{ //低位在前;
clk = 0; //时钟线拉低开始写数据;
io = add & 0x01;
add >>= 1; //把地址右移一位;
clk = 1; //时钟线拉高;
}
for(i=0;i<8;i++)
{
clk = 0; //时钟线拿低开始写数据
io = dat & 0x01;
dat >>= 1; //把数据右移一位
clk = 1; //时钟线拿高
}
rst = 0; //复位线合低
clk = 0;
io = 0;
}
//从对应的地址读一个数据出来;
uchar read_ds1302(uchar add)
{
uchar value,i;
rst = 1; //把复位线拉高;
for(i=0;i<8;i++)
{ //低位在前;
clk = 0; //时钟线拉低开始写数据;
io = add & 0x01;
add >>= 1; //把地址右移一位;
clk = 1; //时钟线拉高;
}
for(i=0;i<8;i++)
{
clk = 0; //时钟线拉低开始读数据;
value >>= 1;
if(io == 1)
value |= 0x80;
clk = 1; //时钟线拉高;
}
rst = 0; //复位线拉低;
clk = 0;
io = 0;
return value; //返回读出来的数据;
}
//把要的时间 年月日 都读出来;
void read_time()
{
miao = read_ds1302(0x81); //读秒
fen = read_ds1302(0x83); //读分
shi = read_ds1302(0x85); //读时
// ri = read_ds1302(read_add[3]); //读日
// yue = read_ds1302(read_add[4]); //读月
// nian = read_ds1302(read_add[5]); //读年
// week = read_ds1302(read_add[6]); //读星期
}
//把要写的时间 年月日 都写入ds1302里;
void write_time()
{
write_ds1302(0x8e,0x00); //打开写保护
// write_ds1302(write_add[0],miao); //写秒
write_ds1302(0x82,fen); //写分
write_ds1302(0x84,shi); //写时
// write_ds1302(write_add[3],ri); //写日
// write_ds1302(write_add[4],yue); //写月
// write_ds1302(write_add[5],nian); //写年
// write_ds1302(write_add[6],week); //写星期
write_ds1302(0xc2,nshi); //写时
write_ds1302(0xc4,nfen); //写分
write_ds1302(0x8e,0x80); //关闭写保护
}
void read_nao()
{
nshi = read_ds1302(0xc3); //读闹钟时
nfen = read_ds1302(0xc5); //读闹钟分
}
//把数据保存到ds1302 RAM中0-31;
void write_ds1302ram(uchar add,uchar dat)
{
add <<= 1; //地址是从第二位开始的
add &= 0xfe; //把最低位清零 是写的命令
add |= 0xc0; //地址最高两位为 1
write_ds1302(0x8e,0x00);
write_ds1302(add,dat);
write_ds1302(0x8e,0x80);
}
//把数据从ds1302 RAM读出来0-31;
uchar read_ds1302ram(uchar add)
{
add <<= 1; //地址是从第二位开始的
add |= 0x01; //把最高位置1 是读命令
add |= 0xc0; //地址最高两位为 1
return(read_ds1302(add));
}
//初始化ds1302时间;
void init_ds1302()
{
uchar i;
rst = 0; //第一次读写数据时要把IO品拿低
clk = 0;
io = 0;
i = read_ds1302ram(30);
if(i != 3)
{
i = 3;
write_ds1302ram(30,i);
write_ds1302(0x8e,0x00); //打开写保护
for(i=0;i<3;i++)
write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作
write_ds1302(0x8e,0x80); //关写保护
}
}
void init_ds1302_io()
{
rst = 0; //第一次读写数据时要把IO品拿低
clk = 0;
io = 0;
}主程序.
#include "STC15F2K.h"
#include "intrins.h"
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sbit S1=P3^3;
sbit S2=P3^4;
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
sbit S6=P1^2;
sbit S7=P1^3;
sbit S8=P1^4;
sbit S9=P1^5;
sbit S10=P1^6;
sbit S11=P1^7;
sbit S12=P5^4;
sbit bell=P3^0;
sbit set=P1^0;
sbit jia=P1^1;
uchar dat1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0X80,0X90,0xff,0xc6};
uchar dat2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0X00,0X10,0xff};//有小数点
uchar dat3[9]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//
uchar dat4[9]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//
uchar t_led0[8]={0};
uchar t_led1[8]={0};
uchar table[4]={1,2,3,4};
uchar xg=0;
char t=0;
int t1;
char ps=0;
char flag=1;
int sudu1=0,sudu2=0;
unsigned int temp[2];
int ld;
extern void init_ds1302_io();
extern void init_ds1302();
extern void read_time();
extern void write_time();
extern void read_nao();
extern uchar miao;
extern uchar fen;
extern uchar shi;
extern uchar nfen;
extern uchar nshi;
void Delayms(uint t)
{
uchar i;
while(t--)
for(i=0;i<100;i++);
}
void display()
{
S12=0;S1=1;
P2=dat1[table[0]];
Delayms(2);
S1=0;S2=1;
if(flag==0)P2=dat2[table[1]];
if(flag==1)P2=dat1[table[1]];
Delayms(2);
S2=0;S3=1;
P2=dat1[table[2]];
Delayms(2);
S3=0;S4=1;
P2=dat1[table[3]];
Delayms(2);
P2=0xff;
S4=0;S5=1;
P2=dat3[t_led0[0]]&dat4[t_led1[0]];
Delayms(2);
P2=0xff;
S5=0;S6=1;
P2=dat3[t_led0[1]]&dat4[t_led1[1]];
Delayms(2);
P2=0xff;
S6=0;S7=1;
P2=dat3[t_led0[2]]&dat4[t_led1[2]];
Delayms(2);
P2=0xff;
S7=0;S8=1;
P2=dat3[t_led0[3]]&dat4[t_led1[3]];
Delayms(2);
P2=0xff;
S8=0;S9=1;
P2=dat3[t_led0[4]]&dat4[t_led1[4]];
Delayms(2);
P2=0xff;
S9=0;S10=1;
P2=dat3[t_led0[5]]&dat4[t_led1[5]];
Delayms(2);
P2=0xff;
S10=0;S11=1;
P2=dat3[t_led0[6]]&dat4[t_led1[6]];
Delayms(2);
P2=0xff;
S11=0;S12=1;
P2=dat3[t_led0[7]]&dat4[t_led1[7]];
Delayms(2);
S1=S2=S3=S4=S5=S6=S7=S8=S9=S10=S11=S12=1;
P2=0xff;
S1=S2=S3=S4=S5=S6=S7=S8=S9=S10=S11=S12=0;
Delayms(2);
}
void init()
{
TMOD= 0x01;
TL0 = (65536-20000)/256; //设置定时初值
TH0 = (65536-20000)%256; //设置定时初值
ET0 = 1;
TR0 = 1;
EA = 1;
}
char menu=0;
bit nf=0;
bit gk=0;
void key()
{
uchar i;
if(jia==0 && menu==0)
{
while(jia==0);
xg++;
nf=0;
if(xg==2){dat4[0]=0XFF;dat4[1]=0XFF;dat4[2]=0XFF;dat4[3]=0XFF;dat4[4]=0XFF;dat4[5]=0XFF;dat4[6]=0XFF;dat4[7]=0XFF;dat4[8]=0XFF;}
if(xg==3){dat3[0]=0xFE;dat3[1]=0xFC;dat3[2]=0xF8;dat3[3]=0xF0;dat3[4]=0xE0;dat3[5]=0xC0;dat3[6]=0x80;dat3[7]=0x00;dat3[8]=0xFF;}
if(xg==5)
{
sudu1=0;sudu2=0;
for(i=0;i<9;i++)
{
//dat3[i]=0XFF;
dat4[i]=0XFE;
}
dat3[0]=0X01;dat3[1]=0X03;dat3[2]=0X07;dat3[3]=0X0F;dat3[4]=0X1F;dat3[5]=0X3F;dat3[6]=0X7F;dat3[7]=0XFF;dat3[8]=0x00;
}
if(xg==6)
{
sudu1=0;sudu2=0;
for(i=0;i<9;i++)
{
dat3[i]=0XFF;
dat4[i]=0XFC;
}
for(i=0;i<8;i++){t_led0[i]=8;}
for(i=0;i<8;i++){t_led1[i]=0;}
}
if(xg==7)
{
sudu1=0;sudu2=0;
for(i=0;i<9;i++)
{
dat3[i]=0XFF;
dat4[i]=0XFF;
}
for(i=0;i<8;i++){t_led0[i]=i;}
for(i=0;i<8;i++){t_led1[i]=i;}
}
if(xg==8)
{
sudu1=0;sudu2=0;
for(i=0;i<9;i++)
{
dat3[i]=0XFF;
dat4[i]=0XFF;
}
}
if(xg==9)
{
sudu1=0;sudu2=0;
for(i=0;i<9;i++)
{
dat3[i]=0XFF;
dat4[i]=0XFF;
}
}
if(xg==10){xg=0;for(i=0;i<9;i++)dat4[i]=0XFF;}
}
if(set==0)
{
bell=0;
menu++;
if(menu==3){read_nao();}
if(menu==7){menu=0;ET1 = 1;write_time();}
while(set==0);
bell=1;
}
if(menu==1)
{
if(jia==0)
{
bell=0;
if(fen >= 0x60)
fen = 0;
fen=fen+0x01;
if((fen & 0x0f) >= 0x0a)
fen = (fen & 0xf0) + 0x10;
while(jia==0);
bell=1;
}
}
if(menu==2)
{
if(jia==0)
{
bell=0;
shi+=0x01;
if((shi & 0x0f) >= 0x0a)
shi = (shi & 0xf0) + 0x10;
if(shi >= 0x24)
shi = 0;
while(jia==0);
bell=1;
}
}
if(menu==3) //闹钟
{
if(jia==0)
{
bell=0;
if(nfen >= 0x60)
nfen = 0;
nfen=nfen+0x01;
if((nfen & 0x0f) >= 0x0a)
nfen = (nfen & 0xf0) + 0x10;
while(jia==0);
bell=1;
}
}
if(menu==4)
{
if(jia==0)
{
bell=0;
nshi+=0x01;
if((nshi & 0x0f) >= 0x0a)
nshi = (nshi & 0xf0) + 0x10;
if(nshi >= 0x24)
nshi = 0;
while(jia==0);
bell=1;
}
}
if(menu==5)
{
if(jia==0)
{
while(jia==0);
nf=!nf;
}
}
if(menu==6)
{
if(jia==0)
{
while(jia==0);
gk=!gk;
}
}
}
void InitADC()
{
P1ASF = 0x03; //Open channels ADC function 0100 0000 p1.6使用AD功能
ADC_RES = 0; //Clear previous result
ADC_LOW2 = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
}
void GetADCResult(unsigned char ch,unsigned int *value)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
_nop_(); //Must wait before inquiry
_nop_();
while(!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC
*value = 0;
*value = ADC_RES;
*value = ((*value)*4 + ADC_LOW2); //Return ADC result.×¢êíμ?′????ò·μ??8??ADC?á1?
}
void ADC_convert(void)
{
GetADCResult(0,&temp[0]);
temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 278.15) * 100 );
}
void main()
{
uchar i;
init();
InitADC();
init_ds1302_io();
init_ds1302();
read_nao();
P3M0=0xf8;P3M1=0x00;
P2M0=0xff;P2M1=0x00;
P1M0=0xff;P1M1=0x00;
P5M0=0x10;P5M1=0x00;
while(1)
{
P1ASF = 0x00;
key();
P1ASF = 0x03;
if(menu==0)
{
read_time();
if(t1>25 && t1<30)
{
ADC_convert();
flag=1;
table[0]=10;
table[1]=temp[0]/1000;
table[2]=temp[0]%1000/100;
table[3]=11;
}
if(t1>0 && t1<25)
{
table[0]=shi/16;
table[1]=shi%16;
table[2]=fen/16;
table[3]=fen%16;
}
if(t1>30)t1=0;
if(xg==0)
{
dat3[0]=0xFE;dat3[1]=0xFD;dat3[2]=0xFB;dat3[3]=0xF7;dat3[4]=0xEF;dat3[5]=0xDF;dat3[6]=0xBF;dat3[7]=0x7F;dat3[8]=0xFF;
for(i=0;i<8;i++)t_led0[i]=8;
for(i=0;i<8;i++)t_led1[i]=8;
}
if(xg==1)
{
dat4[0]=0XEF;dat4[1]=0XBD;dat4[2]=0XF7;dat4[3]=0XDE;dat4[4]=0X7B;dat4[5]=0XEF;dat4[6]=0XBD;dat4[7]=0X07;
for(i=0;i<8;i++)t_led1[i]=i;
dat3[0]=0xFE;dat3[1]=0xFD;dat3[2]=0xFB;dat3[3]=0xF7;dat3[4]=0xEF;dat3[5]=0xDF;dat3[6]=0xBF;dat3[7]=0x7F;dat3[8]=0xFF;
for(i=0;i<8;i++)t_led0[i]=8;
}
if(xg==2)
{
dat3[0]=0x01;dat3[1]=0x02;dat3[2]=0x04;dat3[3]=0x08;dat3[4]=0x10;dat3[5]=0x20;dat3[6]=0x40;dat3[7]=0x80;dat3[8]=0x00;
for(i=0;i<8;i++)t_led0[i]=8;
}
if(xg==3)
{
if(miao==0x01)for(i=0;i<8;i++){t_led0[i]=8;}
if(miao>0x08){t_led0[0]=7;}
if(miao>0x16){t_led0[1]=7;}
if(miao>0x24){t_led0[2]=7;}
if(miao>0x32){t_led0[3]=7;}
if(miao>0x40){t_led0[4]=7;}
if(miao>0x48){t_led0[5]=7;}
if(miao>0x56){t_led0[6]=7;}
}
if(xg==4)
{
dat4[0]=0XEF;dat4[1]=0XBD;dat4[2]=0XF7;dat4[3]=0XDE;dat4[4]=0X7B;dat4[5]=0XEF;dat4[6]=0XBD;dat4[7]=0X07;
}
if(xg==5)
{
if(miao==0x01)for(i=0;i<8;i++){t_led0[i]=8;}
if(miao>0x08){t_led0[0]=7;}
if(miao>0x16){t_led0[1]=7;}
if(miao>0x24){t_led0[2]=7;}
if(miao>0x32){t_led0[3]=7;}
if(miao>0x40){t_led0[4]=7;}
if(miao>0x48){t_led0[5]=7;}
if(miao>0x56){t_led0[6]=7;}
}
if(xg<6)
{
if(miao==0x01)t_led0[0]=0;
if(miao==0x02)t_led0[0]=1;
if(miao==0x03)t_led0[0]=2;
if(miao==0x04)t_led0[0]=3;
if(miao==0x05)t_led0[0]=4;
if(miao==0x06)t_led0[0]=5;
if(miao==0x07)t_led0[0]=6;
if(miao==0x08)t_led0[0]=7;
if(miao==0x09)t_led0[1]=0;
if(miao==0x10)t_led0[1]=1;
if(miao==0x11)t_led0[1]=2;
if(miao==0x12)t_led0[1]=3;
if(miao==0x13)t_led0[1]=4;
if(miao==0x14)t_led0[1]=5;
if(miao==0x15)t_led0[1]=6;
if(miao==0x16)t_led0[1]=7;
if(miao==0x17)t_led0[2]=0;
if(miao==0x18)t_led0[2]=1;
if(miao==0x19)t_led0[2]=2;
if(miao==0x20)t_led0[2]=3;
if(miao==0x21)t_led0[2]=4;
if(miao==0x22)t_led0[2]=5;
if(miao==0x23)t_led0[2]=6;
if(miao==0x24)t_led0[2]=7;
if(miao==0x25)t_led0[3]=0;
if(miao==0x26)t_led0[3]=1;
if(miao==0x27)t_led0[3]=2;
if(miao==0x28)t_led0[3]=3;
if(miao==0x29)t_led0[3]=4;
if(miao==0x30)t_led0[3]=5;
if(miao==0x31)t_led0[3]=6;
if(miao==0x32)t_led0[3]=7;
if(miao==0x33)t_led0[4]=0;
if(miao==0x34)t_led0[4]=1;
if(miao==0x35)t_led0[4]=2;
if(miao==0x36)t_led0[4]=3;
if(miao==0x37)t_led0[4]=4;
if(miao==0x38)t_led0[4]=5;
if(miao==0x39)t_led0[4]=6;
if(miao==0x40)t_led0[4]=7;
if(miao==0x41)t_led0[5]=0;
if(miao==0x42)t_led0[5]=1;
if(miao==0x43)t_led0[5]=2;
if(miao==0x44)t_led0[5]=3;
if(miao==0x45)t_led0[5]=4;
if(miao==0x46)t_led0[5]=5;
if(miao==0x47)t_led0[5]=6;
if(miao==0x48)t_led0[5]=7;
if(miao==0x49)t_led0[6]=0;
if(miao==0x50)t_led0[6]=1;
if(miao==0x51)t_led0[6]=2;
if(miao==0x52)t_led0[6]=3;
if(miao==0x53)t_led0[6]=4;
if(miao==0x54)t_led0[6]=5;
if(miao==0x55)t_led0[6]=6;
if(miao==0x56)t_led0[6]=7;
if(miao==0x57)t_led0[7]=0;
if(miao==0x58)t_led0[7]=1;
if(miao==0x59)t_led0[7]=2;
if(miao==0x00)t_led0[7]=3;
}
}
if(menu==1)
{
if(flag>0)
{
table[2]=fen/16;
table[3]=fen%16;
}
else
{
table[2]=10;
table[3]=10;
}
table[0]=shi/16;
table[1]=shi%16;
}
if(menu==2)
{
table[2]=fen/16;
table[3]=fen%16;
if(flag>0)
{
table[0]=shi/16;
table[1]=shi%16;
}
else
{
table[0]=10;
table[1]=10;
}
}
if(menu==3)
{
if(flag>0)
{
table[2]=nfen/16;
table[3]=nfen%16;
}
else
{
table[2]=10;
table[3]=10;
}
table[0]=nshi/16;
table[1]=nshi%16;
}
if(menu==4)
{
table[2]=nfen/16;
table[3]=nfen%16;
if(flag>0)
{
table[0]=nshi/16;
table[1]=nshi%16;
}
else
{
table[0]=10;
table[1]=10;
}
}
if(menu==5)
{
table[0]=nf;
table[1]=nf;
table[2]=nf;
table[3]=nf;
}
if(menu==6)
{
table[0]=gk;
table[1]=gk;
table[2]=gk;
table[3]=gk;
}
if(gk==1)//开光控
{
GetADCResult(1,&temp[1]);
if( temp[1]<100)ld=8;
if( temp[1]>100 && temp[1]<300)ld=10;
if( temp[1]>300 && temp[1]<500)ld=30;
if( temp[1]>500 && temp[1]<600)ld=90;
if( temp[1]>600 && temp[1]<700)ld=120;
if( temp[1]>700 && temp[1]<800)ld=150;
if( temp[1]>800 && temp[1]<900)ld=180;
if( temp[1]>900)ld=200;
}
else ld=8;
display();
Delayms(ld);
}
}
char count=10,bc=0;
void InitTimer1() interrupt 1 // 1毫秒@11.0592MHz
{
TL0 = (65536-20000)/256; //设置定时初值
TH0 = (65536-20000)%256; //设置定时初值
t++;
if(t==40)
{
t=0;
t1++;
if(menu==0){if(t1>0 && t1<25)flag=!flag;else flag=1;}
if(menu==1 || menu==2 || menu==3 || menu==4) flag=!flag;
if(menu==5 || menu==6)flag=1;
if(nf==1)if(shi==nshi && fen==nfen)bell=!bell;
else bell=1;
}
if(xg==5)
{
sudu2++;
if(sudu2==7)
{
sudu2=0;
sudu1++;
dat4[0]=(dat4[0]>>1)|0x80;
dat4[1]=(dat4[1]>>1)|0x80;
dat4[2]=(dat4[2]>>1)|0x80;
dat4[3]=(dat4[3]>>1)|0x80;
dat4[4]=(dat4[4]>>1)|0x80;
dat4[5]=(dat4[5]>>1)|0x80;
dat4[6]=(dat4[6]>>1)|0x80;
dat4[7]=(dat4[7]>>1)|0x80;
if(sudu1==8){sudu1=0;dat4[0]=0X7F;dat4[1]=0X7F;dat4[2]=0X7F;dat4[3]=0X7F;dat4[4]=0X7F;dat4[5]=0X7F;dat4[6]=0X7F;dat4[7]=0X7F;}
}
}
if(xg==6)
{
sudu2++;
if(sudu2==4)
{
sudu2=0;
sudu1++;
dat4[0]=(dat4[0]<<1)|0x01;
dat4[1]=(dat4[1]<<1)|0x01;
dat4[2]=(dat4[2]<<1)|0x01;
dat4[3]=(dat4[3]<<1)|0x01;
dat4[4]=(dat4[4]<<1)|0x01;
dat4[5]=(dat4[5]<<1)|0x01;
dat4[6]=(dat4[6]<<1)|0x01;
dat4[7]=(dat4[7]<<1)|0x01;
if(sudu1==8){sudu1=0;dat4[0]=0XFC;dat4[1]=0XFC;dat4[2]=0XFC;dat4[3]=0XFC;dat4[4]=0XFC;dat4[5]=0XFC;dat4[6]=0XFC;dat4[7]=0XFC;}
}
}
if(xg==7)
{
sudu2++;
if(sudu2==count)
{
sudu2=0;
sudu1++;
if(sudu1==1){dat4[0]=0xfe;dat4[7]=0xfb;}
if(sudu1==2){dat4[0]=0xfd;dat4[7]=0xfd;}
if(sudu1==3){dat4[0]=0xfb;dat4[7]=0xfe;}
if(sudu1==4){dat4[0]=0xf7;dat4[7]=0xff;dat4[6]=0x7f;}
if(sudu1==5){dat4[0]=0xef;dat4[6]=0xbf;}
if(sudu1==6){dat4[0]=0xdf;dat4[6]=0xdf;}
if(sudu1==7){dat4[0]=0xbf;dat4[6]=0xef;}
if(sudu1==8){dat4[0]=0x7f;dat4[6]=0xf7;}
if(sudu1==9){dat4[0]=0xff;dat4[1]=0xfe;dat4[6]=0xfb;}
if(sudu1==10){dat4[1]=0xfd;dat4[6]=0xfd;}
if(sudu1==11){dat4[1]=0xfb;dat4[6]=0xfe;}
if(sudu1==12){dat4[1]=0xf7;dat4[6]=0xff;dat4[5]=0x7f;}
if(sudu1==13){dat4[1]=0xef;dat4[5]=0xbf;}
if(sudu1==14){dat4[1]=0xdf;dat4[5]=0xdf;}
if(sudu1==15){dat4[1]=0xbf;dat4[5]=0xef;}
if(sudu1==16){dat4[1]=0x7f;dat4[5]=0xf7;}
if(sudu1==17){dat4[1]=0xff;dat4[2]=0xfe;dat4[5]=0xfb;}
if(sudu1==18){dat4[2]=0xfd;dat4[5]=0xfd;}
if(sudu1==19){dat4[2]=0xfb;dat4[5]=0xfe;}
if(sudu1==20){dat4[2]=0xf7;dat4[5]=0xff;dat4[4]=0x7f;}
if(sudu1==21){dat4[2]=0xef;dat4[4]=0xbf;}
if(sudu1==22){dat4[2]=0xdf;dat4[4]=0xdf;}
if(sudu1==23){dat4[2]=0xbf;dat4[4]=0xef;}
if(sudu1==24){dat4[2]=0x7f;dat4[4]=0xf7;}
if(sudu1==25){dat4[2]=0xff;dat4[3]=0xfe;dat4[4]=0xfb;}
if(sudu1==26){dat4[3]=0xfd;dat4[4]=0xfd;}
if(sudu1==27){dat4[3]=0xfb;dat4[4]=0xfe;}
if(sudu1==28){dat4[3]=0x77;dat4[4]=0xff;}
if(sudu1==29){dat4[3]=0xaf;}
if(sudu1==30){dat4[3]=0xff;sudu1=0;if(count==1){bc++;if(bc==10)count=10;}else count--;}
}
}
if(xg==8)
{
sudu2++;
if(sudu2==5)
{
sudu2=0;
sudu1++;
if(sudu1==1){dat4[0]=0x55;dat4[1]=0x55;dat4[2]=0x55;dat4[3]=0x55;dat4[4]=0x55;dat4[5]=0x55;dat4[6]=0x55;dat4[7]=0x55;}
if(sudu1==2){dat4[0]=0xaa;dat4[1]=0xaa;dat4[2]=0xaa;dat4[3]=0xaa;dat4[4]=0xaa;dat4[5]=0xaa;dat4[6]=0xaa;dat4[7]=0xaa;}
if(sudu1==3)sudu1=0;
}
}
if(xg==9)
{
sudu2++;
if(sudu2==10)
{
sudu2=0;
sudu1++;
if(sudu1==1){dat4[7]=0xf9;dat4[5]=0xf3;dat4[3]=0xe7;dat4[1]=0xcf;}
if(sudu1==2){dat4[7]=0xfe;dat4[6]=0x7f;dat4[5]=0xfc;dat4[3]=0xf9;dat4[1]=0xf3;}
if(sudu1==3){dat4[7]=0xff;dat4[6]=0x9f;dat4[5]=0xff;dat4[4]=0x3f;dat4[3]=0xfe;dat4[2]=0x7f;dat4[1]=0xfc;}
if(sudu1==4){dat4[6]=0xe7;dat4[4]=0xcf;dat4[3]=0xff;dat4[2]=0x9f;dat4[1]=0xff;dat4[0]=0x3f;}
if(sudu1==5){dat4[6]=0xf9;dat4[4]=0xf3;dat4[2]=0xe7;dat4[1]=0xff;dat4[0]=0xcf;}
if(sudu1==6){dat4[6]=0xfe;dat4[5]=0x7f;dat4[4]=0xfc;dat4[2]=0xf9;dat4[0]=0xf3;}
if(sudu1==7){dat4[6]=0xff;dat4[5]=0x9f;dat4[4]=0xff;dat4[3]=0x3f;dat4[2]=0xfe;dat4[1]=0x7f;dat4[0]=0xfc;}
if(sudu1==8){dat4[6]=0xfe;dat4[5]=0x7f;dat4[4]=0xfc;dat4[3]=0xff;dat4[2]=0xf9;dat4[1]=0xff;dat4[0]=0xf3;}
if(sudu1==9){dat4[6]=0xf9;dat4[5]=0xff;dat4[4]=0xf3;dat4[2]=0xe7;dat4[0]=0xcf;}
if(sudu1==10){dat4[6]=0xe7;dat4[4]=0xcf;dat4[2]=0x9f;dat4[0]=0x3f;}
if(sudu1==11){dat4[6]=0x9f;dat4[4]=0x3f;dat4[3]=0xfe;dat4[2]=0x7f;dat4[1]=0xfc;dat4[0]=0xff;}
if(sudu1==12){dat4[7]=0xfe;dat4[6]=0x7f;dat4[5]=0xfc;dat4[4]=0xff;dat4[3]=0xf9;dat4[2]=0xff;dat4[1]=0xf3;}
if(sudu1==13){dat4[7]=0xf9;dat4[6]=0xff;dat4[5]=0xf3;dat4[3]=0xe7;dat4[1]=0xcf;}
if(sudu1==14)sudu1=0;
}
}
}

