微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 实验7 利用51单片机的定时器设计一个时钟

实验7 利用51单片机的定时器设计一个时钟

时间:11-19 来源:互联网 点击:
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()

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top