|
楼主 |
发表于 2019-9-4 12:39:21
|
显示全部楼层
本帖最后由 spirndai 于 2019-9-4 12:58 编辑
51主控代码
- #include "stc15.h"
- /*
- #include "C:\Keil\C51\INC\STC\STC15.H"
- #include "intrins.h"
- */
- #include "tm1650.h"
- #include "ds1302.h"
- #define ESP12_EN P31
- #define ESP12 P35
- uchar dec2bcd(uchar dec){
- return (dec%10)+(dec/10)*16;
- }
- uchar bcd2dec(uchar num){
- return ((num/16 * 10) + (num % 16));
- }
- int fixtime = 1750 ;
- void powerdown()
- {
- WKTCL = fixtime&0xff; //about 500us for 1
- WKTCH = 0x80|(fixtime>>8); //最高位必须为1,0x80,即使能掉电唤醒控制位为1
- PCON = 0x02; //进入掉电模式
- _nop_();
- _nop_();
- }
- uchar int3_happend = 0 ;
- uchar time_rev_buf[8] ;
- void handle_ow(){
- uchar tmp = 0;
- uchar i;
- int3_happend = 0 ;
- while (ESP12==0 && ++tmp<0xff) ;
- if (tmp<150) goto endint;
- while (ESP12==0) ;
- for (i=0;i<64;i++){
- while (ESP12==1) ;
- tmp=39; while (--tmp) ; //15us
- tmp = i>>3 ;
- time_rev_buf[tmp] >>= 1;
- if (ESP12==1) time_rev_buf[tmp] |= 0x80 ;
- else while (ESP12==0) ;
- }
- tmp = 0 ;
- for (i=0;i<8;i++) tmp = tmp ^ time_rev_buf[i] ;
- if (tmp==0){
- for (i=0;i<7;i++) ds1302_timebuf[i] = time_rev_buf[i] ;
- write_ds1302_time();
- }
- endint:
- ESP12_EN = 0 ;
- }
- void main(){
- int tmp ;
- uchar point ;
- P3M0 = 0x02 ; // P31控制esp12,电流强一些也许比较好
- P3M1 = 0 ;
- get_ds1302_time();
- ESP12_EN = 0 ;
- while (ds1302_timebuf[4]==0){
- powerdown();
- ESP12_EN = 1 ;
- if (ESP12==0) handle_ow();
- }
- while(1)
- {
- if (((ds1302_timebuf[2]&0xf)==5) && ds1302_timebuf[1]==0x59 && ds1302_timebuf[0]<5){
- ESP12_EN = 1 ;
- }
- if (ds1302_timebuf[0]>0x55 ){
- ESP12_EN = 0 ;
- }
- if (ESP12==0) handle_ow();
- powerdown();
- if (ESP12==0) handle_ow();
- tmp = bcd2dec(ds1302_timebuf[0]);
- if (++tmp>=60){
- get_ds1302_time();
- tmp = bcd2dec(ds1302_timebuf[0]);
- if (tmp>50) fixtime += 20;
- else if (tmp>1) fixtime -= 10;
- else if (tmp==1) fixtime-=3;
- if (fixtime>2000 || fixtime<1500) fixtime=1750;
- }else{
- ds1302_timebuf[0] = dec2bcd(tmp);
- }
- if (ESP12==0) handle_ow();
- point = ds1302_timebuf[0]&1;
- point = point << 7 ;
- tmp = ds1302_timebuf[2];
- if (tmp<=0x8)
- LED_print(0x48,16,0); // level 3 bright
- else
- LED_print(0x48,18,0); // level 7 bright
- if (tmp>=0x10)
- LED_print (0x68, tmp>>4,0);
- else
- LED_print (0x68, 17,0); // close it
- LED_print (0x6a, tmp&0xf,point);
- tmp = ds1302_timebuf[1];
- LED_print (0x6c, tmp>>4,point);
- LED_print (0x6e, tmp&0xf,0);
-
- }
- }
复制代码
ds1302驱动
- #include "stc15.h"
- #include "ds1302.h"
- unsigned char ds1302_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写的地址
- unsigned char ds1302_timebuf[7]={0,0,0,0,0,0,0}; //秒分时 日月周年
- void writeByte(uchar dat){
- uchar i;
- for(i=0;i<8;i++) //传送8位地址,往哪里写
- {
- DS_CLK=0; //再置为低,以便实现上升沿
- _nop_(); DS_IO=dat&0x01; //先传送最低位
- dat>>=1; //向右移位,把8位数据依次写入
- DS_CLK=1; //数据在上升沿时,写入数据
- _nop_();
- }
- }
- void write(uchar addr,uchar dat) {
- DS_CLK=0; _nop_();
- DS_EN=0; _nop_(); DS_EN=1; //拉高,准备写地址读数据
- _nop_(); _nop_();
- writeByte(addr);
- writeByte(dat);
- DS_EN=0; //复位
- }
- uchar readByte(){
- uchar i,dat=0;
- for(i=0;i<8;i++) //读出8位数据
- {
- DS_CLK=1; //置为高,以便实现下降沿
- _nop_();
- dat>>=1; //向右移位,把8位数据依次读出
- DS_CLK=0; //读数据时,下降沿有效,这时可以读取数据
- if(DS_IO==1) dat=dat|0x80;
- _nop_();
- }
- return dat ;
- }
- uchar read(uchar addr) {
- uchar dat ;
- DS_CLK=0; _nop_();
- DS_EN=0; _nop_(); DS_EN=1; //拉高,准备写地址读数据
- _nop_(); _nop_();
- writeByte(addr);
- dat = readByte();
- DS_EN=0; //复位
- _nop_();
- DS_CLK = 1; _nop_(); DS_IO = 0; _nop_(); DS_IO = 1; _nop_();
- return dat; //返回读到的数据
- }
- void write_ds1302_time(){
- char n;
- write(0x8e,0);
- for(n=1;n<7;n++){
- write (ds1302_addr[n],ds1302_timebuf[n]);
- }
- write (ds1302_addr[0],ds1302_timebuf[0]);
- write(0x8e,0x80);
- }
- void get_ds1302_time(){
- uchar n;
- for(n=0;n<7;n++)
- ds1302_timebuf[n]=read(ds1302_addr[n]+1); //读取分秒时日月周年
- ds1302_timebuf[0] = ds1302_timebuf[0] & 0x7f ;
- }
复制代码
tm1650驱动
- #include "stc15.h"
- /*
- #include "C:\Keil\C51\INC\STC\STC15.H"
- #include "intrins.h"
- */
- #include "tm1650.h"
- #define Pt_TM1650_SDAM P3M1
- #define Pt_TM1650_SDA P34
- #define Pt_TM1650_SCL P30
- #define DIO P34
- #define SDA_TM1650_IN Pt_TM1650_SDAM=0x10 //
- #define SDA_TM1650_OUT Pt_TM1650_SDAM=0 //
- #define DIO_H Pt_TM1650_SDA=1 //
- #define DIO_L Pt_TM1650_SDA=0 //
- #define CLK_H Pt_TM1650_SCL=1 //
- #define CLK_L Pt_TM1650_SCL=0 //
- #define W5NOP _nop_();_nop_();_nop_();_nop_();_nop_();
- #define uint8 unsigned char
- void Delay_us(unsigned char k) //@11.0592MHz
- {
- _nop_();
- k <<= 1;
- while (--k);
- }
- void I2CStart(void)//开始信号
- {
- CLK_H;
- DIO_H;
- Delay_us(5);
- DIO_L;
- }
- void I2Cask(void) {
- uint8 timeout = 1;
- CLK_H;
- Delay_us(5);
- CLK_L;
- while((DIO)&&(timeout<=100))
- {
- timeout++;
- }
- Delay_us(5);
- CLK_L;
- }
- void I2CStop(void) //停止信号
- {
- CLK_H;
- DIO_L;
- Delay_us(5);
- DIO_H;
- }
- void I2CWrByte(uint8 oneByte) {
- uint8 i;
- CLK_L;
- Delay_us(1);
- for(i=0;i<8;i++)
- {
- oneByte = oneByte<<1;
- DIO = CY;
- CLK_L;
- Delay_us(5);
- CLK_H;
- Delay_us(5);
- CLK_L;
- }
- }
- unsigned char LED_0F[] =
- {
- //0 1 2 3 4 5 6 7 8 9 A b C d E F -
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x31,0,0x71
- };
- void LED_print(uint8 Address, uint8 dat,uint8 p) //数码管显示
- {
- //写显存必须从高地址开始写
- I2CStart();
- I2CWrByte(Address); //第一个显存地址
- I2Cask();
- I2CWrByte(LED_0F[dat] | p);
- I2Cask();
- I2CStop();
- }
复制代码 |
|