您的位置 首页 方案

试验7 使用51单片机的定时器规划一个时钟

1.利用实验板和配件,设计一个时钟,时间显示在LCD1602上,并按秒更新,能够在实验板上设计3个按键调整时,分,秒。其功能为:功能选择键,…

1.使用试验板和配件,规划一个时钟,时刻显现在LCD1602上,并按秒更新,可以在试验板上规划3个按键调整时,分,秒。其功用为:功用选择键,数值增大和数值减小键。使用板上AT24C02规划完成断电维护显现数据的功用。
=============Clock.h=============
#ifndef __CLOCK_H__
#define __CLOCK_H__

//========全局变量区============================================
unsignedcharT_High_50ms=(65536-45872)/256;
unsignedintT_Low_50ms=(65536-45872)%256;
unsignedcharCount,Count_T1,Count_1s;//Count用来记载每50ms的计数,Count_T1用来记

//========全局变量区完毕============================================
#endif

=============I2C.H=============
#ifndef __I2C_H__
#define __I2C_H__
#include
sbit sda=P2^0;
sbit scl=P2^1;
//========函数区============================================
voidnop();
voidinitI2C();
externvoidI2C_start();//开端信号
externvoidI2C_stop();//中止
externvoidI2C_respons();//应对
externvoidI2C_write_byte(unsignedchardate);
externunsignedcharI2C_read_byte();
externvoidI2C_write_address(unsignedcharaddress,unsignedchardate);
externunsignedcharI2C_read_address(unsignedcharaddress);
//========函数区完毕============================================
#endif

=============OrphanKey.h=============
#ifndef __ORPHANKEY_H__
#define __ORPHANKEY_H__

sbit FUNCTION_KEY=P3^2;//功用键–按下暂停,再按开端
sbit Key_ADD=P3^3;//加1
sbit KEY_MINUS=P3^4;//减1
constbit PRESSED=0;//按下
bit SUSPEND=0;//0的时分运转,1的时分暂停

#endif

=============I2C.C=============
#include “head/I2C.h”
//=========全局变量区============================================

#define uchar unsigned char
#define uint unsigned int

bit I2C_write=0;//写24C02的标志;

unsignedcharsec,tcnt;

//=========全局变量区完毕============================================
voidnop()
{;;}

/***********************************************************
I2C的初始化
***********************************************************/
voidinitI2C(){
sda=1;
nop();
scl=1;
nop();

}
voidI2C_start()//开端信号
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
}
voidI2C_stop()//中止
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
voidI2C_respons()//应对
{
uchar i;
scl=1;
nop();
while((sda==1)&&(i<250))i++;
scl=0;
nop();
}

voidI2C_write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY;
nop();
scl=1;
nop();
}
scl=0;
nop();
sda=1;
nop();
}
uchar I2C_read_byte()
{
uchar i,k;
scl=0;
nop();
sda=1;
nop();
for(i=0;i<8;i++)
{
scl=1;
nop();
k=(k<<1)sda;
scl=0;
nop();
}
returnk;
}
voidI2C_write_address(uchar address,uchar date)
{
I2C_start();
I2C_write_byte(0xa0);
I2C_respons();
I2C_write_byte(address);
I2C_respons();
I2C_write_byte(date);
I2C_respons();
I2C_stop();
}
uchar I2C_read_address(uchar address)
{
uchar date;
I2C_start();
I2C_write_byte(0xa0);
I2C_respons();
I2C_write_byte(address);
I2C_respons();
I2C_start();
I2C_write_byte(0xa1);
I2C_respons();
date=I2C_read_byte();
I2C_stop();
returndate;
}

=============lab8_1.c=================
#include
#include “head/Clock.h”
#include “head/OrphanKey.h”
#include “head/I2C.H”
/*
1.使用试验板和配件,规划一个时钟,时刻显现在LCD1602上,并按秒更新,可以在试验板上规划3个按键调整时,分,秒。其功用为:功用选择键,数值增大和数值减小键。使用板上AT24C02规划完成断电维护显现数据的功用。
*/

/*
过程:
1、规划一个中止,用来计时
2、规划一个字符生成函数,用来生成所需的时刻
3、独立按键监测功用,用来监测按下了什么键
4、一个外部中止
5、一个断点维护的功用,其实便是经过I2C写入,读取数值
*/

//=========全局变量区============================================
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=”12:23:12″;
uchar code table1[]=”I am a boy!”;
sbit lcden=P2^7;//液晶使能端
sbit lcdrs=P2^6;//数据或指令操控(0代表指令,1代表数据)
sbit LCDWR=P2^5;//读写操控(0代表写,1代表读)
uchar num;
uchar FIRST_LINE=0x80;
uchar SECOND_LINE=0xc0;
uchar Current_Time[9];
uchar Hour,Minute,Second=0;//时、分、秒
sbit beer=P1^4;//蜂鸣器
// sbit led1=P1^3;

//=========全局变量区完毕============================================

//=========函数区============================================

/***********************************************************
延时函数
参数阐明:
z代表要延时z ms
***********************************************************/
voiddelay(uint z)
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
/***********************************************************
写指令或数据
参数阐明:
isRs=1代表写数据,isRs=0代表写指令
***********************************************************/
voidwrite(uchar mdata,uchar isRs)
{
lcdrs=isRs;
P0=mdata;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/***********************************************************
写指令
参数阐明:
data代表要写的指令
***********************************************************/
voidwrite_command(uchar com)
{
write(com,0);
}
/***********************************************************
写数据
参数阐明:
data代表要写的数据
***********************************************************/
voidwrite_data(uchar mdata)
{
write(mdata,1);
}

/***********************************************************
初始化时钟
***********************************************************/
voidInitTime(){
//时刻的转化
Current_Time[0]=Hour/10+0;
Current_Time[1]=Hour%10+0;
Current_Time[2]=:;
Current_Time[3]=Minute/10+0;
Current_Time[4]=Minute%10+0;
Current_Time[5]=:;
Current_Time[6]=Second/10+0;
Current_Time[7]=Second%10+0;
Current_Time[8]=\0;
}

/***********************************************************
保存时钟的值
***********************************************************/
voidKeepClockValue(){
I2C_write_address(2,Second);
delay(10);
I2C_write_address(3,Minute);
delay(10);
I2C_write_address(4,Hour);
}

/***********************************************************
改动时刻
***********************************************************/
voidchangeTime()
{
//时刻的转化
if(Second>=60){
Second=0;
Minute++;
}else{
++Second;
}

if(Minute==60){
Hour++;
Minute=0;
}
if(Hour==24){
Second=0;
Minute=0;
Hour=0;
}
KeepClockValue();
}
/**
初始化
**/
voidInitClockInterrupt(){//初始化中止

TMOD=0x11;//对TMOD赋值,以确认T0和T1的工作方式。
TH0=T_High_50ms;//核算初值,并将其写入TH0、TL0或TH1、TL1。
TL0=T_Low_50ms;
EA=1;//舱位中止总答应
ET0=1;
IT0=1;//舱位守时器0,1中止答应
TR0=1;//使TR0或TR1置位,发动守时/计数器守时或计数
Count=Count_T1=Count_1s=0;//计数
}
/***********************************************************
初始化按钮中止
***********************************************************/
voidinitButtonInterupt(){
IT0=0;
//EA = 1;//舱位中止总答应
EX0=1;//外部中止0答应位
}

voidinit()
{

InitTime();
lcden=0;
LCDWR=0;
write_command(0x38);//设置16X2显现,5X7点阵,8位数据接口
write_command(0x0c);//设置开显现,不显现光标
write_command(0x06);//写一个字符后地址指针加1
write_command(0x01);//显现清零,数据指针清零
}
voidWriteStringToLCD(uchar*dat)
{
while(*dat!=\0)
{
write_data(*dat);
dat++;
delay(5);
}
}
/***********************************************************
向LCD全体左移动
***********************************************************/
voidLCD_MoveToLeft(){
intnum;
for(num=0;num<16;num++)
{
write_command(0x18);
delay(200);
}
}

/***********************************************************
向LCD打印字符串
***********************************************************/
voidPrintToLCD(){

//write_command(FIRST_LINE);
//WriteStringToLCD(table);
write_command(SECOND_LINE);
WriteStringToLCD(Current_Time);

}

/***********************************************************
是否加1
***********************************************************/
voidIsAdd(){
if(PRESSED==Key_ADD){//当加1按键按下
delay(10);//去颤动
if(PRESSED==Key_ADD){//当加1按键按下
changeTime();
InitTime();
PrintToLCD();
while(!Key_ADD);
}
}
}
/***********************************************************
是否减1
***********************************************************/
voidIsMinus(){
if(PRESSED==KEY_MINUS){//当减1按键按下
delay(10);//去颤动
if(PRESSED==KEY_MINUS){//当减1按键按下
if(Second>0){//避免按下减1按钮的时分,被减成负数
Second–;
InitTime();
PrintToLCD();
while(!KEY_MINUS);
}
}
}
}
/***********************************************************
是否运转
***********************************************************/
voidIsRun(){
if(PRESSED==FUNCTION_KEY){//当减1按键按下
delay(10);//去颤动

if(PRESSED==FUNCTION_KEY){//当减1按键按下
SUSPEND=~SUSPEND;
// led1=SUSPEND;
while(!KEY_MINUS);
}
}
}
/***********************************************************
是否暂停
***********************************************************/
voidIsSuspend(){
IsRun();
IsMinus();//监测是否需求减1
IsAdd();//监测是否需求加1
}
/***********************************************************
从头计数
***********************************************************/
voidReCount(){
Count=0;//开端下一轮1s的计时
TH0=T_High_50ms;//核算初值,并将其写入TH0、TL0或TH1、TL1。
TL0=T_Low_50ms;
}
/***********************************************************
初始化时钟的值
***********************************************************/
voidinitClockValue(){
Second=I2C_read_address(2);//读出保存的数据赋于Second

Minute=I2C_read_address(3);
Hour=I2C_read_address(4);
}
voidmain()
{
init();
InitClockInterrupt();
initButtonInterupt();
initClockValue();
if(Second>100)//避免初次读取出过错数据
Second=0;

while(1){
IsSuspend();
if(Count>=20&&(!SUSPEND)){//守时器0 1s时刻到
ReCount();
changeTime();
InitTime();
PrintToLCD();
}
}

}
//=========函数区完毕============================================

//=========中止函数区============================================

/**
初始化按钮外部中止
**/
voidintButton()interrupt0//外部中止0
{

}

/**
用守时0完成8个发光二极管以1s距离业绩
**/
voidint0()interrupt1//守时/计数器T0中止
{
Count++;
}

//=========中止函数区完毕============================================

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/265480.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部