单片机89c51的电子时钟课程设计

要详细的课程设计内容

#include <reg52.h>

#include<stddef.h>

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_FLAG

#define LCD1602_PORT P0


sbit lcd1602_rs=P2^0;

sbit lcd1602_e=P2^2;

sbit lcd1602_rw=P2^1;

sbit lcd1602_busy=P0^7;

sbit key_ch=P3^5;

sbit key_add=P3^6;

sbit key_minus=P3^7;


uchar i,sec,min,h,date,month,flag;

uint year;

uchar *chgstr[7]={"  ","sec","min","hour","date","min","year"};

uchar j,k,m,n,o,p;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar timestr[10],datestr[10];

void init();

void delay(uint);

void time_display();

void date_display();

void control();

void time();

/*

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

* 函数名称:lcd1602_CheckBusy()

* 函数功能:状态查询

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

*/


void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1;

lcd1602_rs=0;

lcd1602_rw=1;

lcd1602_e=0;

lcd1602_e=1;

}

while(lcd1602_busy);

}


/*

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

* 函数名称: lcd1602_WriteCmd()

* 函数功能:写命令

* 入口参数:命令字

* 出口参数:无

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

*/


void lcd1602_WriteCmd(const uchar cmd)

{

lcd1602_CheckBusy();

lcd1602_rs=0;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=cmd;

lcd1602_e=0;

}


/*

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

* 函数名称:lcd1602_WriteData()

* 函数功能:写数据

* 入口参数:c--待写数据

* 出口参数:无

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

*/


void lcd1602_WriteData(const uchar c)

{

lcd1602_CheckBusy();

lcd1602_rs=1;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=c;

lcd1602_e=0;

}


/*

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

* 函数名称:lcd1602_Init()

* 函数功能:初始化LCD

* 入口参数:无

* 出口参数:无

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

*/


void lcd1602_Init()

{

lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵

lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06); //flag move to right,screen don't move

lcd1602_WriteCmd(0x01); //clear screen

}


/*

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

* 函数名称:lcd1602_Display()

* 函数功能: 字符显示

* 入口参数:ptr--字符或字符串指针

* 出口参数:无

* 说    æ˜Žï¼šç”¨æˆ·å¯é€šè¿‡ä»¥ä¸‹æ–¹å¼æ¥è°ƒç”¨ï¼š

*           1)lcd1602_Display("Hello,world!");

*           2) INT8U 存储类型 txt[]="要显示的字符串";

*              æˆ–者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};

*              INT8U *ptr;

*              ptr=&txt;

*              lcd1602_Display(ptr);

*              æˆ– lcd1602_Display(txt);

*              æˆ– lcd1602_Display(&txt);

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

*/


void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)

{

uchar data i=0;

uchar *data q;


q=ptr;

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80+xaddr);

while(q!=NULL && (*q!='\0') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

case 1:

lcd1602_WriteCmd(0xc0+xaddr);

while(q!=NULL && (*q!='\0') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

}

}



void main()

{

lcd1602_Init();

init();

while(1)

{

time_display();

date_display();

control();

}

}

void init()

{

i=0;

sec=0;

min=30;

h=7;

date=17;

month=10;

year=2017;

flag=0;

EA=1;

ET0=1;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void time_display()

{

timestr[7]=0x30+sec%10;

timestr[6]=0x30+sec/10;

timestr[5]=':';

timestr[4]=0x30+min%10;

timestr[3]=0x30+min/10;

timestr[2]=':';

timestr[1]=0x30+h%10;

timestr[0]=0x30+h/10;

timestr[8]=0;

lcd1602_Display(timestr,1,3);

}

void date_display()

{

datestr[9]=0x30+date%10;

datestr[8]=0x30+date/10;

datestr[7]=':';

datestr[6]=0x30+month%10;

datestr[5]=0x30+month/10;

datestr[4]=':';

datestr[3]=0x30+year%10;

datestr[2]=0x30+year/10%10;

datestr[1]=0x30+year/100%10;

datestr[0]=0x30+year/1000;

lcd1602_Display(datestr,0,2);

}

void control()

{

if(!key_ch)

{

delay(5);

if(!key_ch)

{

flag++;

TR0=0;

if(flag==7)

{flag=0;TR0=1;lcd1602_Init();}

lcd1602_Display(chgstr[flag],1,12);

}

}

while(!key_ch);

if(flag==1&&key_add==0)

{

while(!key_add);

sec++;

if(sec==60)

sec=0;

}

if(flag==1&&key_minus==0)

{

while(!key_minus);

sec--;

if(sec==-1)

sec=59;

}


if(flag==2&&key_add==0)

{

while(!key_add);

min++;

if(min==60)

min=0;

}

if(flag==2&&key_minus==0)

{

while(!key_minus);

min--;

if(min==-1)

min=59;

}


if(flag==3&&key_add==0)

{

while(!key_add);

h++;

if(h==24)

h=0;

}

if(flag==3&&key_minus==0)

{

while(!key_minus);

h--;

if(h==-1)

h=23;

}


if(flag==4&&key_add==0)

{

while(!key_add);

date++;

if(date==29)

if((year%4!=0)&&(month==2))

date=1;

if(date==30)

if((year%4==0)&&(month==2))

date=1;

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

date=1;

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

date=1;

}


if(flag==4&&key_minus==0)

{

while(!key_minus);

if(date>1)date--;

}


if(flag==5&&key_add==0)

{

while(!key_add);

month++;

if(month==13)

month=1;

}

if(flag==5&&key_minus==0)

{

while(!key_minus);

month--;

if(month==0)

month=12;

}


if(flag==6&&key_add==0)

{

while(!key_add);

year++;

if(year==99)

year=1;

}

if(flag==6&&key_minus==0)

{

while(!key_minus);

year--;

if(year==0)

year=99;

}

}


void T0_rpt() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++;

time();

}


void time()

{

if(i==20)

{

i=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

h++;

if(h==24)

{

h=0;

min=0;

sec=0;

date++;

if(date==29)

if((year%4!=0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==30)

if((year%4==0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

}

}

}

}

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-16
一. 数码钟工作简介
  本作品采用Atmel公司的AT89C51单片机,以汇编语言为程序设计的基础,设计一个用四位数码管显示时、分的时钟。在实物图中,左边靠近电源的绿色发光二极管(长亮)是电源指示灯,表示的是5V稳定电源工作正常;单片机左下角红色发光二极管是秒灯,每闪烁一次表示时间走动一秒钟;按键正上方绿色发光二极管是设置灯,当时间正常走动时此时不亮,当第一次按下设置键(右键)时,此绿灯亮,同时秒时熄灭,且分钟的两位数码管出现闪烁,时间停止走动,进入校时状态,表示此时可以进行分钟的调整,当按一次加一键(左键)可实现分钟的加一功能,分钟以60分为极限,超出60分则返回数值0,从0再重新算起;如果再次按下设置键时,这时秒灯和设置灯仍旧保持熄灭和点亮状态,表示分钟的数码管停止闪烁,反过来表示小时的两位数码管则开始闪烁,此时可进行小时的调整,按加1键可实现小时的加1功能,小时调整以24为上限,同样超出24小时则从新回0;当第三次按下设置键时,数码管停止闪烁,设置灯熄灭,秒灯重新闪烁,时间以设定值计时。

单片机89c51的电子时钟课程设计
include <reg52.h> include<stddef.h> define uchar unsigned char define uint unsigned int define LCD1602_FLAG define LCD1602_PORT P0 sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;sbit key_ch=P3^5;sbit key_add=P3^6;sbit key_minus=P3...

89c51单片机的数字钟程序?
2011-11-24 求c51单片机电子钟程序(c语言) 13 2010-12-30 C语言 AT89C52数字钟的程序问题 9 2012-01-09 单片机89C51 电子时钟程序 4位数码管,有4个开关分别控... 5 2013-07-31

用89c51设计一个电子时钟电路图
(1)把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;(2)把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;(3)把“单片机系统”区域中的P0.0\/AD0、P0.1\/AD1、P0.2\/AD2端口分别用导线连...

求用C语言编写一个单片机89C51电子时钟程序,有时,分,秒,还有电路图_百 ...
0x00); W1302(address,time\/10*16+time%10); W1302(0x8e,0x80); } \/\/***DS1302读写程序***\/\/\/*** 函 数 名:RTInputByte()功 能:实时时钟写入一字节说 明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据 返 回 值:无 ***...

急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~_百度知...
用89C51控制3个HC595,前两个595接8段数码显示管,显示“0”~“9”每秒跳动一次.第3个HC595接8个LED灯,每隔1秒闪烁1次.include<at89x52.h> include<intrins.h> define uchar unsigned char define uint unsigned int uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90...

用89c51单片机和4位数码管做一个动态显示的时钟,程序怎么编写,求大神帮 ...
0x7f, 0x6f, 0x77, 0x7c,0x39, 0x53, 0x79, 0x71};void delayms(int k);void main(){ while (1){ char i = 0;for (P3 = 0xfe; P3 != 0xff; P3 = P3*2 + 1) \/\/ P3 位选 { P2 = table[i]; \/\/ P2 段码 delayms(2);++i;} } } void delayms(int ...

89c51单面机c语言时钟控制器编程
89c51单面机c语言时钟控制器编程、、、就是在数码管上每隔一秒钟显示该秒对应的数字、、当显示第60秒时、、蜂鸣器响一下、、、依次循环就是一个简易的分秒计时器用c语言怎么编程啊那... 89c51单面机c语言时钟控制器编程、、、就是在数码管上每隔一秒钟显示该秒对应的数字、、当显示第60秒时、、蜂鸣器响一下、...

89c51单片机课程设计,为什么仿真成功了,在开发板上不能运行
主要的几个地方,各IO口的地址定义准确没有,各地址的定义正确没有,外RAM区(没有就算)定义,...主要的就是各种仿真中的地址和你开发板上的是否相符,这是最容易出总裁题的地,再就是连线.多查一下去,如你程序大多个文件的,连接时的操作正确否.主要检查硬件是否和你程序中相符....

用单片机AT89C51制作电子秒表,需要用什么元器件。
元件:89c51,四位共阴极数码管,非自锁按键,10K电阻,10uf电解电容,30pf瓷片电容,10k排阻,晶振 留个邮箱,我把Proteus仿真图发给你,以下是程序,临时写的,Proteus测试正常,不知道符不符合你的要求,你可以自己再稍作修改。用的是12M晶振 include<reg51.h> define uchar unsigned char define uint...

单片机89c51的定时器时间怎么算!!
晶振频率和装入TH、TL的初始值 12Mhz晶振一个机器周期为1us,算法是一个机器周期=12 x 晶振频率的倒数 若使用定时器0,根据计数模式(四种)可以设置TH0、TL0的初始值 16计数模式,TL0=(65536-num)%256 TH0=(65536-num)\/256;能够定时num个us ...

相似回答