求单片机 数字钟 c语言代码注释

求单片机 数字钟 c语言代码注释,第1张

#include<reg51h>

unsigned char code su[11]={0x3f,0x06,0x5b,0X4F,0x66,0X6D,0x7d,0x07,0x7f,0x6f,0x40};//数码管显示

unsigned char xian[8]={0,0,10,0,0,10,0,0};

unsigned char sen=0,min=0,hou=0,sen2=0,min2=0,hou2=0,sen3=59,min3=59,hou3=23,num;//变量定义

//--------引脚定义

sbit ks=P1^4; //秒按键

sbit km=P1^5; //分按键

sbit kh=P1^6; //时按键

sbit ds=P1^7;

sbit bb=P3^4;

//-------8个数码管位显示接口

sbit P20=P2^0;

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P24=P2^4;

sbit P25=P2^5;

sbit P26=P2^6;

sbit P27=P2^7;

bit jp1,jp2,jp3;//位定义

int n=0,jp4;

//----演示程序

void daly()

{

unsigned char j;

for(j=60;j;j--);//for循环

}

//------数码管显示

void show()

{

xian[0]=hou/10; //时的十位

xian[1]=hou%10; //时的个位

xian[3]=min/10; //分的十位

xian[4]=min%10; //分的个位

xian[6]=sen/10; //秒的十位

xian[7]=sen%10; //秒的个位

P0=su[xian[7]]; //八段数码管显示秒的个位

P20=0; //动态显示,打开第一个数码管

daly(); //延时

P20=1; //动态显示,关闭第一个数码管

P0=su[xian[6]];//八段数码管显示秒的十位

P21=0;//动态显示,打开第二个数码管

daly();//延时

P21=1;//动态显示,打开第二个数码管

//--------------------

P0=su[xian[5]];//注:你xian[3]xian[5]都为从定义

P22=0;

daly();

P22=1;

//-------------分个位的显示

P0=su[xian[4]];

P23=0;

daly();

P23=1;

//-----------

P0=su[xian[3]];//注:你xian[3]xian[5]都为从定义

P24=0;

daly();

P24=1;

//------------分十位的显示

P0=su[xian[2]];

P25=0;

daly();

P25=1;

//-------------时个位的显示

P0=su[xian[1]];

P26=0;

daly();

P26=1;

//-----------时十位的显示

P0=su[xian[0]];

P27=0;

daly();

P27=1;

}

//---------按键程序

void key()

{

if((ks==0)&&(jp1==0))

{

jp1=1;//秒按键生效

daly();//消抖

if(ks==0) sen++; //秒加1

}

else if((ks==1)&&(jp1==1)) jp1=0;//秒按键未生效

if(sen==60)//等于60时

{

min++;//分加1

sen=0;//秒清零

}

if((km==0)&&(jp2==0))

{

jp2=1;//分按键生效

daly();//消抖

if(km==0) min++;//分加1

}

else if((km==1)&&(jp2==1)) jp2=0;//分按键未生效

if(min==60)//等于60时

{

hou++;//时加1

min=0;//分清零

}

if((kh==0)&&(jp3==0))

{

jp3=1;//时按键生效

daly(); //消抖

if(kh==0) hou++;//时加1

}

else if((kh==1)&&(jp3==1)) jp3=0;//时按键未生效

if(hou==24) hou=0;//时为24时,清零

if(ds==0)//定时 *** 作

{

daly();//消抖

while(ds==0);

daly();

if(ds==1) jp4++;//定时按键生效,加一

if(jp4>1) jp4=0;//JP4只能是一。

/注:就本人感觉而言这两句就是废话,一句就能完事:if(ds==1) jp4=1;/

}

}

//-------从功能上看这是定时

dings()

{

EA=0; //关闭中断

TR0=0;//T0停止计数

hou2=hou;//把现有的时分秒,保留储存在hou2,min2,sen2

min2=min;

sen2=sen;

hou=0; //清零

min=0;

sen=0;

while(jp4==1) //等待直到按键生效

{

hou3=hou; //把现有的时分秒,保留储存在hou3,min3,sen3

min3=min;

sen3=sen;

show(); //现实

key();//按键扫描

hou3=hou;//把按键后更改的时分秒,也就是定时时间,保留储存在hou3,min3,sen3

min3=min;

sen3=sen;

}

hou=hou2;//把远有的时间分别还原

min=min2;

sen=sen2;

EA=1;//开中断

TR0=1;//T0计数

}

void main()

{

TMOD=0x01;//定时器0方式1

TH0=45535>>8;//赋初值

TL0=45535;

EA=1; //允许中断

ET0=1;//T0中断使能

EX1=1;//外部中断1

TR0=1;//T0开始计数

hou3=99;

min3=99;

sen3=99;

while(1)

{

show();//显示

key();//按键程序

dings();//定时 *** 作

if(((hou60+min))60+sen>=((hou360+min3))60+sen3 )//判断是否到了定时时间

{

bb=0;//蜂鸣器鸣叫(也可能是其他音乐芯片)

num++;

if(num>=500) //鸣叫延时

{

bb=1; //蜂鸣器关闭

num=0; //延时计数清零

jp4=0;//位清零

hou3=99;//重新赋值

min3=99;

sen3=99;

}

}

}

}

void_time0_(void)interrupt 1

{

TL0=45535; //定时器0重新赋值

TH0=45535>>8;

if(++n==50) //1秒

{

n=0;

sen++; //秒加1

if(sen==60) //加到60

{

min++;

sen=0;

}//分加1

if(min==60)//加到60

{

hou++;

min=0;

}//时加1

if(hou==24) hou=0;//24时,时变成0

}

}

说实话,这个程序编写的很烂。

这是我以前写的一段程序,希望对你能有帮助

我的程序,首先有一点,肯定是调试通过的,不像我以前找的一些网络程序,貌似可以,就是不能执行结果。

/DS1302时钟芯片显示设置

功能:显示 时间 日期 星期

引脚说明:DS1302三引脚 CLK = P1^5; IO=P1^6; RST=P1^7;

设计整理:创达科技 陈仲库

技术服务:kuzi00@163com QQ:86828048

整理时间:2007年5月26日

/

#define uchar unsigned char

#define uint unsigned int

sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚

sbit DS1302_IO = P1^6; //实时时钟数据线引脚

sbit DS1302_RST = P1^7; //实时时钟复位线引脚

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__

{

uchar Second;

uchar Minute;

uchar Hour;

uchar Week;

uchar Day;

uchar Month;

uchar Year;

uchar DateString[9];

uchar TimeString[9];

}SYSTEMTIME; //定义的时间类型

void DS1302_WR_Byte(uchar d) //实时时钟写入一字节(内部函数)

{

uchar i;

ACC = d;

for(i=8; i>0; i--)

{

DS1302_IO = ACC0; //相当于汇编中的 RRC

DS1302_CLK = 1;

DS1302_CLK = 0;

ACC = ACC >> 1;

}

}

uchar DS1302_RD_Byte(void) //实时时钟读取一字节(内部函数)

{

uchar i;

for(i=8; i>0; i--)

{

ACC = ACC >>1; //相当于汇编中的 RRC

ACC7 = DS1302_IO;

DS1302_CLK = 1;

DS1302_CLK = 0;

}

return(ACC);

}

void DS1302_Write(uchar ucAddr, uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302_WR_Byte(ucAddr); // 地址,命令

DS1302_WR_Byte(ucDa); // 写1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

}

uchar DS1302_Read(uchar ucAddr) //读取DS1302某地址的数据

{

uchar ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302_WR_Byte(ucAddr|0x01); // 地址,命令

ucData = DS1302_RD_Byte(); // 读1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

return(ucData);

}

void DS1302_SetTime(uchar Address, uchar Value) // 设置时间函数

{

DS1302_Write(0x8E,0x00); //写保护

DS1302_Write(Address, ((Value/10)<<4 | (Value%10)));

}

void DS1302_GetTime(SYSTEMTIME Time)

{

uchar ReadValue;

ReadValue = DS1302_Read(0x80);

Time->Second = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x82);

Time->Minute = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x84);

Time->Hour = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x86);

Time->Day = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x8a);

Time->Week = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x88);

Time->Month = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = DS1302_Read(0x8c);

Time->Year = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

}

void DateToStr(SYSTEMTIME Time)

{

Time->DateString[0] = Time->Year/10 + '0';

Time->DateString[1] = Time->Year%10 + '0';

Time->DateString[2] = '-';

Time->DateString[3] = Time->Month/10 + '0';

Time->DateString[4] = Time->Month%10 + '0';

Time->DateString[5] = '-';

Time->DateString[6] = Time->Day/10 + '0';

Time->DateString[7] = Time->Day%10 + '0';

Time->DateString[8] = '\0';

}

void TimeToStr(SYSTEMTIME Time)

{

Time->TimeString[0] = Time->Hour/10 + '0';

Time->TimeString[1] = Time->Hour%10 + '0';

Time->TimeString[2] = ':';

Time->TimeString[3] = Time->Minute/10 + '0';

Time->TimeString[4] = Time->Minute%10 + '0';

Time->TimeString[5] = ':';

Time->TimeString[6] = Time->Second/10 + '0';

Time->TimeString[7] = Time->Second%10 + '0';

Time->DateString[8] = '\0';

}

void DS1302_Init(void)

{

uchar Second=DS1302_Read(0x80);

if(Second&0x80) DS1302_SetTime(0x80,0);

//时间设置初始化 秒 分 时

DS1302_SetTime(0x80,30);

DS1302_SetTime(0x82,59);

DS1302_SetTime(0x84,23);

DS1302_SetTime(0x8A,6); //周

DS1302_SetTime(0x86,26); //天

DS1302_SetTime(0x88,5); //月

DS1302_SetTime(0x8C,7); //年

}

/调用说明

DS1302_Init();初始化

DS1302_GetTime(&CurrentTime);//取得当前时间

DateToStr(&CurrentTime); //取得当前日期

TimeToStr(&CurrentTime); //取得当前时间

// 数据处理 CurrentTimeDateString 格式"07-05-26"

// CurrentTimeTimeString 格式"00;00;00"

/

以上就是关于求单片机 数字钟 c语言代码注释全部的内容,包括:求单片机 数字钟 c语言代码注释、单片机时钟程序:通过键设计当前时间,设定闹钟,时间一到,报警、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9270339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存