×
单片机 > 单片机程序设计 > 详情

51单片机1602、18B20电子钟--C51源代码

发布时间:2020-06-08 发布时间:
|

#include"REGx52.h"

#include"RICHMCU.H"

sbit a0 = ACC^0;

sbit a1 = ACC^1;

sbit a2 = ACC^2;

sbit a3 = ACC^3;

sbit a4 = ACC^4;

sbit a5 = ACC^5;

sbit a6 = ACC^6;

sbit a7 = ACC^7;

sbit DQ = P3^3 ; //18B20接口

sbit speaker = P3^6 ; //蜂鸣器

sbit MODE = P1^4 ; //模式键

sbit INC = P1^5 ; //增加键

sbit DEC = P1^6 ; //减少键

sbit OK = P1^7 ; //OK键

#define LCD1602_DATA P0 //8位数据并行口

#define LCD1602_RS P2_0 //指令OR数据寄存器选择

#define LCD1602_RW P2_1 //读写控制

#define LCD1602_EN P2_2 //使能控制

#define LCD1602_CLR 0x01 //清屏

#define LCD1602_MODE 0x38 //8位数据,双列显示,5*7字形

#define LCD1602_ON 0x0c //开显示,关光标,光标不闪烁

#define LCD1602_ADDR_MODE 0x06 //地址递增

#define DS1302_SCLK P1_0 //1302时钟线

#define DS1302_IO P1_1 //1302数据线

#define DS1302_RST P1_2 //1302复位线

 

volatile uint8 data timedata[7] ; //时间值

volatile uint8 data display_buffer1[16]; //显示缓冲区1

volatile uint8 data display_buffer2[16]; //显示缓冲区2

volatile uint8 data temdata[5] ; //存放温度值

volatile uint16 data tdat ; //温度值变量

volatile uint8 data tflag ; //温度正负值标志

volatile int8 self_pos = 0 ;//自定义三角形标志显示位置变量

volatile uint8 OK_VALUE = 0 ; //OK键键值变量

volatile bit bdata DIS_ON = 1 ; //显示开关位 1 == on 0 == off

volatile bit bdata SCAN_ON = 0 ; //按键扫描开关位,由定时器每20MS刷新

volatile data MODE_ON = 0 ; //模式键按下后显示菜单的开关位

volatile data INC_VALUE = 0 ;

volatile data DEC_VALUE = 0 ;

volatile bit bdata ALARM_VALUE = 0 ;//闹钟标志位

volatile bit bdata ALARM_ON = 1 ; //闹钟响时关闭标志位

volatile uint8 data read_1 = 1,read_2 = 1,read_3 = 1,read_4 = 1;

volatile uint8 data stopwatch_count = 0;

volatile uint8 data stopwatch_second = 0;

volatile uint8 data stopwatch_minute  = 0;

volatile bit bdata STOPWATCH_START = 0;

uint8 code self_table1[]={

    0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//

    0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月

    0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,//

    0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志

    0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };//三角形符号

 

 

/**********************************************************

蜂鸣器

************************************************************/

void delay_ms(uint16 count)        // 延时时间count*1ms

{

    uint16 i;

    for(;count>0;count--)

    {

        for(i=0;i<110;i++)

        {

            nop;

        }

    }

}

void speakers(uint8 speak_count)

{

    for(;speak_count>0;speak_count--)

    {

        speaker = 0 ;

        delay_ms(1) ;

        speaker = 1 ;

        delay_ms(3) ;

    }

}

/***********************************************************

忙检测

************************************************************/

void LCD1602_check_busy(void)

{

    LCD1602_DATA = 0xff;

    LCD1602_RS = 0 ;

    LCD1602_RW = 1 ;

    LCD1602_EN = 1 ;

    while(LCD1602_DATA & 0x80) ;

    LCD1602_EN = 0 ;

}

 

/**********************************************************

写指令

************************************************************/

 

void LCD1602_write_cmd(uint8 cmd)

{

    LCD1602_check_busy();

    LCD1602_RS = 0 ;

    LCD1602_RW = 0 ;

    LCD1602_DATA = cmd ;

    LCD1602_EN = 1 ;

    LCD1602_EN = 0 ;

}

 

/***********************************************************

写数据

*************************************************************/

void LCD1602_write_data(uint8 dat)

{

    LCD1602_check_busy();

    LCD1602_RS = 1 ;

    LCD1602_RW = 0 ;

    LCD1602_DATA = dat ;

    LCD1602_EN = 1 ;

    LCD1602_EN = 0 ;

}

 

 

/***********************************************************

1602初始化

************************************************************/

void LCD1602_init(void)

{

    uint8 i  ;

    LCD1602_write_cmd(0x40);//CGRAM起始地址

    for(i=0;i<40;i++)

        LCD1602_write_data(self_table1[i]);//写入自定义字符

    LCD1602_write_cmd(LCD1602_MODE) ;

    LCD1602_write_cmd(LCD1602_ON) ;

    LCD1602_write_cmd(LCD1602_ADDR_MODE) ;

    LCD1602_write_cmd(LCD1602_CLR) ;

}

 

/************************************************************

设置显示坐标

************************************************************/

void LCD1602_set_postion(uint8 x , uint8 y)

{

    if(y<2)

    {

        y &= 0x01 ; //y值限定在0~1之间

        x &= 0x0f ; //x值限定在0~15之间

        if(y == 0)

            x |= 0x40 ; //如果显示是在第二行,则x的值加0x40

        x |= 0x80 ; //获得x的值

        LCD1602_write_cmd(x) ;//写入坐标值到LCD

    }

}

 

/************************************************************

指定位置写字符

*************************************************************/

void LCD1602_write_char(uint8 x , uint8 y , uint8 chardata)

{

    LCD1602_set_postion(x,y) ;

    LCD1602_write_data(chardata) ;

}

 

/************************************************************

指定位置写字符串

*************************************************************/

void LCD1602_write_string(uint8 x , uint8 y , uint8 *string)

{

    LCD1602_set_postion(x,y) ;

    while((*string) != '')

    {

        LCD1602_write_data(*string) ;

        string++ ;

    }

}

/***************************************************************

指定位置显示自定义字符

**************************************************************

uint8 LCD1602_display_self(uint8 count)

{

    switch(count)

    {

        case 0 : sele_count = 0 ; break ;

        case 1 : sele_count = 1 ; break ;

        case 2 : sele_count = 2 ; break ;

        case 3 : sele_count = 3 ; break ;

        default : break ;

    }

    return(self_count) ;

}*/

 

 

/****************************************************************

底层驱动函数(输入)

*****************************************************************/

void DS1302_input(uint8 inputdata)

{

    ACC = inputdata ;

    DS1302_IO = a0 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a1 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a2 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a3 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a4 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a5 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a6 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

    DS1302_IO = a7 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;

}

 

/****************************************************************

底层驱动函数(输出)控制位的第七位必须为1

*****************************************************************/

uint8 DS1302_output(void)

{

    DS1302_IO = 1 ;

    a0 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a1 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a2 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a3 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a4 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a5 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a6 = DS1302_IO ;

    DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a7 = DS1302_IO ;

    return(ACC);

}

 

/****************************************************************

底层驱动函数(指定地址写一个字节的数据)

*****************************************************************/

void DS1302_write_byte(uint8 cmd , uint8 dat)

{

    DS1302_SCLK = 0 ;

    DS1302_RST = 0 ;

    DS1302_RST = 1 ;

    DS1302_input(cmd) ;

    DS1302_input(dat) ;

    DS1302_RST = 0 ;

    DS1302_SCLK = 1 ;

}

 

/****************************************************************

底层驱动函数(指定地址读取一字节的数据)

*****************************************************************/

uint8 DS1302_read_byte(uint8 cmd)

{

    uint8 receivedata = 0 ;

    DS1302_SCLK = 0 ;

    DS1302_RST = 0 ;

    DS1302_RST = 1 ;

    DS1302_input(cmd) ;

    receivedata = DS1302_output() ;

    DS1302_RST = 0 ;

    DS1302_SCLK = 1 ;

    return(receivedata) ;

}

 

/********************************************************

设置1302的初始时间

*********************************************************/

void DS1302_init()

{

    if(DS1302_read_byte(0xc9) != 0xf0)

    {

        DS1302_write_byte(0x8e,0x00) ;//允许写操作

        DS1302_write_byte(0xc8,0xf0) ; //写入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一次。

        DS1302_write_byte(0x8c,0x08) ;//年

        DS1302_write_byte(0x8a,0x05) ;//星期

        DS1302_write_byte(0x88,0x09) ;//月

        DS1302_write_byte(0x86,0x19) ;//日

        DS1302_write_byte(0x84,0x12) ;//时

        DS1302_write_byte(0x82,0x00) ;//分


关键字:51单片机  1602  18B20  电子钟 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法