好文档 - 专业文书写作范文服务资料分享网站

基于51单片机的多功能数字时钟系统设计 (附完整程序版)

天下 分享 时间: 加入收藏 我要投稿 点赞

高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。

电路图如下:

P1.0口表示功能移位键,按键选择要调整的时十位、时个位、分十位或分个位。 P1.1口表示数字“+“键,按一下则对应的数字加1。 P1.2口表示数字“-”键,按一下则对应的数字减1。

P1.3口表示时间表的切换,程序默认为日常时间表,当按下该开关,使输入为低电平时,表示当前执行的是考试时间表,并有绿发光二极管显示。再按键,使键抬起,输入维高电平时,表示当前执行的是日常作息时间表,用红发光二级管显示。

6、温度采集部分

此部分选用DS18B20 传感器,主要由四部分组成:64 位ROM、温度传感器、非挥

发的温度报警触发器TH 和TL、配置寄存器。有三个管脚:DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端。

电源有两种接法:1)远端因入;2)寄生电源方式。它是支持“一线总线”接口的温度传感器,测量温度范围为-55°C~+125°C,在-10~+85°C 范围内,可编程为9 位—12 位A/D 转换精度,工作电压在3V—5V 之间。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

###软件设计:

#include #include //#include \//#include \#define uint unsigned int #define uchar unsigned char

sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚 sbit DS1302_IO = P1^6; //实时时钟数据线引脚 sbit DS1302_RST = P1^5; //实时时钟复位线引脚 sbit wireless_1 = P3^0; sbit wireless_2 = P3^1; sbit wireless_3 = P3^2; sbit wireless_4 = P3^3; sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数

sbit Set = P2^0; //模式切换键 sbit Up = P2^1; //加法按钮 sbit Down = P2^2; //减法按钮

sbit out = P2^3; //立刻跳出调整模式按钮 sbit DQ = P1^0; //温度传送数据IO口 char done,count,temp,flag,up_flag,down_flag; uchar temp_value; //温度值 uchar TempBuffer[5],week_value[2];

void show_time(); //液晶显示程序

/***********1602液晶显示部分子程序****************/

//Port Definitions********************************************************** sbit LcdRs sbit LcdRw sbit LcdEn sfr DBPort

//内部等待函数************************************************************************** unsigned char LCD_Wait(void) {

LcdRs=0;

= P2^5; = P2^6; = P2^7; = 0x80;

//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

}

LcdRw=1; _nop_(); LcdEn=1; _nop_();

LcdEn=0; return DBPort;

//向LCD写入命令或数据************************************************************ #define LCD_COMMAND #define LCD_DATA

0 // Command 1 // Data

0x02 // 光标返回原点

#define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING { }

//设置显示模式************************************************************ #define LCD_SHOW #define LCD_HIDE

#define LCD_CURSOR

#define LCD_FLASH

void LCD_SetDisplay(unsigned char DisplayMode) { }

//设置输入模式************************************************************ #define LCD_AC_UP

#define LCD_MOVE

0x01 // 画面可平移

0x00 //default

#define LCD_NO_MOVE

0x02

0x00 // default

#define LCD_AC_DOWN

LCD_Write(LCD_COMMAND, 0x08|DisplayMode);

0x01 //光标闪动 0x00 //光标不闪动

#define LCD_NO_FLASH

0x02

//显示光标

#define LCD_NO_CURSOR

0x00 //无光标

0x04 //显示开 0x00 //显示关

LcdEn=0; LcdRs=style; LcdRw=0; LcdEn=1; LcdEn=0; LCD_Wait();

_nop_();

_nop_();//注意顺序 _nop_();

DBPort=input; _nop_();//注意顺序 void LCD_Write(bit style, unsigned char input)

void LCD_SetInput(unsigned char InputMode) { }

//初始化LCD************************************************************ void LCD_Initial() { }

//液晶字符输入的位置************************ void GotoXY(unsigned char x, unsigned char y) { }

//将字符输出到液晶显示 void Print(unsigned char *str) { }

////////////////////////////////////////////////////////////////////////////////////////////////// /***********DS1302时钟部分子程序******************/ typedef struct __SYSTEMTIME__ {

unsigned char Second; while(*str!='\\0') { }

LCD_Write(LCD_DATA,*str); str++; if(y==0)

LCD_Write(LCD_COMMAND,0x80|x); LCD_Write(LCD_COMMAND,0x80|(x-0x40)); if(y==1) LcdEn=0;

LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 LCD_Write(LCD_COMMAND, 0x04|InputMode);

unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[11]; unsigned char TimeString[9];

//定义的时间类型

}SYSTEMTIME;

#define AM(X) X

SYSTEMTIME CurrentTime;

#define PM(X) (X+12) // 转成24小时制

#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR #define DS1302_WEEK #define DS1302_DAY #define DS1302_YEAR

void DS1302InputByte(unsigned char d) {

unsigned char i; ACC = d; for(i=8; i>0; i--) {

DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }

unsigned char DS1302OutputByte(void) {

unsigned char i; for(i=8; i>0; i--) {

ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0;

//相当于汇编中的 RRC //实时时钟读取一字节(内部函数) //实时时钟写入一字节(内部函数)

0x86

0x8C 0x84 0x8A

#define DS1302_MONTH 0x88

基于51单片机的多功能数字时钟系统设计 (附完整程序版)

高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。电路图如下:P1.0口表示功能移位键,按键选
推荐度:
点击下载文档文档为doc格式
1w93s3mdlm7f2vc1ug0p
领取福利

微信扫码领取福利

微信扫码分享