有人会写数字钟的C语言程序吗?要用LCD的,而且要用AT89C51的单片机呢
发布网友
发布时间:2022-05-13 11:09
我来回答
共3个回答
热心网友
时间:2023-10-09 00:29
DS1302时钟子程序
#define uchar unsigned char
sbit DS1302_CLK = P2^5; //实时时钟时钟线引脚
sbit DS1302_IO = P2^4; //实时时钟数据线引脚
sbit DS1302_RST = P2^3; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
char done,count,temp,flag,up_flag,down_flag;
uchar temp_value; //温度值
uchar TempBuffer[5],week_value[2];
/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{
unsigned char Second;
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; //定义的时间类型
SYSTEMTIME CurrentTime;
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
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; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(hide_year<2)
{
Time->DateString[0] = '2';
Time->DateString[1] = '0';
Time->DateString[2] = Time->Year/10 + '0';
Time->DateString[3] = Time->Year%10 + '0';
}
else
{
Time->DateString[0] = ' ';
Time->DateString[1] = ' ';
Time->DateString[2] = ' ';
Time->DateString[3] = ' ';
}
Time->DateString[4] = '/';
if(hide_month<2)
{
Time->DateString[5] = Time->Month/10 + '0';
Time->DateString[6] = Time->Month%10 + '0';
}
else
{
Time->DateString[5] = ' ';
Time->DateString[6] = ' ';
}
Time->DateString[7] = '/';
if(hide_day<2)
{
Time->DateString[8] = Time->Day/10 + '0';
Time->DateString[9] = Time->Day%10 + '0';
}
else
{
Time->DateString[8] = ' ';
Time->DateString[9] = ' ';
}
if(hide_week<2)
{
week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
}
else
{
week_value[0] = ' ';
}
week_value[1] = '\0';
Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}
void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{ if(hide_hour<2)
{
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
}
else
{
Time->TimeString[0] = ' ';
Time->TimeString[1] = ' ';
}
Time->TimeString[2] = ':';
if(hide_min<2)
{
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
}
else
{
Time->TimeString[3] = ' ';
Time->TimeString[4] = ' ';
}
Time->TimeString[5] = ':';
if(hide_sec<2)
{
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
}
else
{
Time->TimeString[6] = ' ';
Time->TimeString[7] = ' ';
}
Time->DateString[8] = '\0';
}
void Initial_DS1302(void) //时钟芯片初始化
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80) //判断时钟芯片是否关闭
{
Write1302(0x8e,0x00); //写入允许
Write1302(0x8c,0x09); //以下写入初始化时间 日期:09/04/01.星期: 3. 时间: 23:59:59
Write1302(0x88,0x04);
Write1302(0x86,0x01);
Write1302(0x8a,0x07);
Write1302(0x84,0x23);
Write1302(0x82,0x59);
Write1302(0x80,0x59);
Write1302(0x8e,0x80); //禁止写入
}
}
void show_time() //液晶显示程序
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
DateToStr(&CurrentTime); //日期数据转换液晶字符
}
热心网友
时间:2023-10-09 00:30
在www.verycd.com上输入“单片机”,会出现很多资料,里面有一套视频,专门介绍51单片机的,可以下来看看
热心网友
时间:2023-10-09 00:30
学单片机操作,学LCD显示操作,难度不大的…
用C语言编写AT89C51单片机程序,设计一个智能数字钟。
这是我的课程设计,6个数码管,显示时分秒,三个按钮P0.0、P0.1、P0.2可以调时,有8个彩灯(可以不要),没闹钟、倒计时之类的。呵呵。include<AT89X52.H> define uchar unsigned char int i;//***时钟的 uchar one[10]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,0x07,0xff,0xef}...
用C语言编写AT89C51单片机程序,设计一个智能数字钟。
//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//0-F,-,共阴 uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //0~9数组,带小数点 uchar table1[]={31,3...
以at89c51为核心,制作一个LED显示的智能电子钟。用C语言或Keil编程,Pro...
我这里有但是和你的功能有差别,你可以看看,在改改!我用的at89c52单片机 程序:include<reg52.h> include<intrins.h> define uchar unsigned char define uint unsigned int sbit T_RST=P1^0; //ds1302复位引脚 sbit T_CLK=P1^1; //ds1302时钟引脚 sbit T_IO=P1^2; //ds1302数据引...
请教AT89C51单片机的数字时钟程序带闹钟的功能 用C语言编写
include"reg52.h"define uchar unsigned char define uint unsigned int sbit wela=P2^7;sbit dula=P2^6;sbit s1=P3^4;//模式的选择 sbit s2=P3^5;//调高 sbit s3=P3^6;//调低 sbit s4=P3^7;//选择是否开启闹铃 sbit beep=P2^3;uchar tt,num,t1,settime,bi;uchar flag; //至位...
at89c51单片机怎么用汇编语言写“多个延时程序”
单片机汇编语言中要使一个延时程序可以被不同情况下调用而延时不同的时间,可以通过类似于C语言中传递参数的方式来实现,举例如下:ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV P0,#5AH ;P0上的LED灯间隔点亮 MOV R7,#50 ;R7是延时传递参数 LCALL DELAY ;调用延时函数 MOV P0,#0A5H ...
以AT89C51单片机为核心,制作一个LCD显示的智能电子钟
给你一个例子供你参考下,我对STM8S稍微熟悉一点,我也是初学者。/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */#include "lcd12864.h"#include "stm8s207r.h"#include "stm8s207rb.h"#define sbi(io,bit)(io|=(1<<bit))//1#define cbi(io,bit)(io&=~(1<...
用AT89C51单片机控制LED数码管能够显示时间和日期,求电路图和程序代码...
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();void delay(uint);void second_display();void minute_display();void hour_display();void date_display();void month_display();void year_display();void control();void time();...
急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~_百度知...
//T0中断子程序 /***/ void Timer0Int(void) interrupt 1 using 0 { count++;if(count==50)count=0; //中断计时间 if(count==10) //这的count值不能为零,否则显示不准 { cycle++; //根据中断计的时间来决定时间加的快慢 } if(cycle==10){ cycle=0; //cycle为个位 cycle1++; ...
求助!有谁比较懂硬件技术基础,AT89C51,单片机,帮我写个控制信号灯的程序...
流水灯呀:你把单片机的P0口就是左上角的32~39号引脚接上拉电阻(10K排阻)后,分别与1K电阻和发光二级管串联另一端接地,因为P0口带负载能力比较强所以用它。硬件连好了就可以编程了(最小系统你会吧我就不说了)C语言是根据硬件编程的程序如下:include<reg52.h> define uint unsigned int defin...
用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?
1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus7Professional、ISIS7Professional”打开PROTEUS。2、单击图中的P,添加单片机等元件。3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。4、把元件排列放好,再放一个电源...