心钟有你 | 单片机

心钟有你,单片机时钟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的捕捉/比较寄存器高字节
#endif

DS1302时钟芯片驱动程序.

#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;
        }
    }
}

   😝请欣赏!


   转载规则


《心钟有你 | 单片机》Bad-BoY 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
构建高性能Linux Xanmod内核 | Linux 构建高性能Linux Xanmod内核 | Linux
构建高性能Linux内核!!!📢硬件平台说明!!💗 平台 X86_64.💗 CPU AMD Ryzen 9 3900X.💗 GPU GTX1660Ti.💗 ODM模具 Clevo NH5xAx.💗 EC Firwmare XMG
2022-03-07
下一篇 
DIY BIOS Logo | 硬件 DIY BIOS Logo | 硬件
DIY BIOS LoGo.!!📢警告!!🚫 !!!!自行刷BIOS有风险!!!!.🚫 !!!!自行修改BIOS更加有风险!!!!.🚫 !!!!如果还掌握不了热风枪的温度和风速,请立即退出!!!!.🔧准备.🔧 拆机工具…🔧 S
2022-02-07
  目录