单片机电子时钟设计程序实验报告(单片机电子时钟实验总结)
本篇文章给大家谈谈单片机电子时钟设计程序实验报告,以及单片机电子时钟实验总结对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
利用单片机定时器制作数字时钟
下面是时间程序,直接下来用就行了.
/*******************************************************************************
********************************************************************************
* 描述: *
* 简易电子时钟,LED数码管显示 *
* K1---时调整 *
* K2---分调整 *
* *
* 上电时初始化显示: 12-00-00 *
* *
* * **** **** **** **** **** *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** ****** * * * * ****** * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** **** **** **** **** *
* *
* *
*******************************************************************************/
#include reg51.h
#include intrins.h
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;
sbit K1 = P3^2;
sbit K2 = P3^3;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);
void main(void)
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc;
TL1 = 0;
TH0 = 0xFC;
TL0 = 0x17;
hour = 12;
min = 00;
sec = 00;
sec100 = 0;
dis_buf[0] = dis_code[hour / 10]; // 时十位
dis_buf[1] = dis_code[hour % 10]; // 时个位
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
dis_buf[2] = 0xbf; // 显示"-"
dis_buf[5] = 0xbf; // 显示"-"
dis_digit = 0xfe;
dis_index = 0;
TCON = 0x01;
IE = 0x8a; // 使能timer0,1 中断
TR0 = 1;
TR1 = 1;
key_v = 0x03;
while(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
}
}
}
}
bit scan_key()
{
key_s = 0x00;
key_s |= K2;
key_s = 1;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
{
EA = 0;
if((key_v 0x01) == 0) // K1
{
inc_hour();
}
else if((key_v 0x02) == 0) // K2
{
min++;
if(min 59)
{
min = 0;
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}
EA = 1;
}
void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xFC;
TL0 = 0x17;
P2 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P2 = dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index = 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
void timer1() interrupt 3
{
TH1 = 0xdc;
sec100++;
if(sec100 = 100)
{
sec100 = 0;
inc_sec();
}
}
void inc_sec()
{
sec++;
if(sec 59)
{
sec = 0;
inc_min();
}
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
}
void inc_min()
{
min++;
if(min 59)
{
min = 0;
inc_hour();
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}
void inc_hour()
{
hour++;
if(hour 23)
{
hour = 0;
}
if(hour 9)
dis_buf[0] = dis_code[hour / 10]; // 时十位
else
dis_buf[0] = 0xff; // 当小时的十位为0时不显示
dis_buf[1] = dis_code[hour % 10]; // 时个位
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i 120; i++);
}
}
51单片机控制的电子时钟系统 毕业设计
可以用1302做
我有现成的
LCD1602
显示的,51做的
基本思路是用单片机读取1302里面的信息,处理,然后送LCD1602显示。
有兴趣可以去我博客看,里面还上传了之前我做的实物图片和PCB,可以照着做。
求单片机电子时钟程序设计
#include "../inc/DS1307.H"
#include "../inc/delay.H"
#include "../inc/i2c.H" unsigned char idata Sec,Min,Hr,Dy,Dt,Mn,Yr;
bit hour_mode=0;
/********************************************************************************
函数功能: 数码转换
bcd:BCD码 z:为1转换高位,否则转换低位 Data:二进制数
********************************************************************************/
unsigned char BCD_ASCII(unsigned char bcd,bit z) //把BCD码转换为ASCII码
{
unsigned char temp;
if(z)
temp=(bcd4)+'0'; //+48
else temp=(bcd0x0f)+'0'; //+48
return temp;
}
unsigned char CHAR_BCD(unsigned char Data) //把二进制数转换为BCD码
{
unsigned char bcd; if(Data100) Data=0;
bcd = Data/10;
bcd=4;
bcd = bcd+(Data%10);
return bcd;
}
/********************************************************************************
函数功能: 判断日期是否合法
a:年(00-99之间) b:月 d:日
********************************************************************************/
bit Leap_year(unsigned char n) //判断是否为闰年 计算范围2000-2099年
{
if((((2000+n)%4 == 0)((2000+n)%100 != 0)) || ((2000+n)%400 == 0))
return 0;
else return 1; //是闰年返回1
}
bit Valid_date(unsigned char a,unsigned char b,unsigned char c)
{
unsigned char flag=1; if((b=0)||(b12)||(c=0)||(c31)) flag=0;
if(((b==4)||(b==6)||(b==9)||(b==11))(c30)) flag=0;
if(Leap_year(a)) if((b==2)(c29)) flag=0;
else if(b==2c28) flag=0;
return flag; //合法返回1
}
/********************************************************************************
函数功能: 初始化时间和日期
********************************************************************************/
void RTC_init(void)
{
i2c_start();
i2c_sendbyte(ADDRTC); //写器件地址
i2c_waitACK();
i2c_sendbyte(0); // 地址指针置为 0
i2c_waitACK();
i2c_sendbyte(Sec0x7f); //CH(Sec^7)位置为 0,启动时钟
i2c_waitACK();
i2c_stop();
i2c_start();
i2c_sendbyte(ADDRTC);
i2c_waitACK();
i2c_sendbyte(2); // 地址指针置为 2
i2c_waitACK();
if(hour_mode)
i2c_sendbyte(Hr|0x40); // 12小时模式,Hr^6置1
else i2c_sendbyte(Hr0xbf); // 24小时模式,Hr^6置0
i2c_waitACK();
i2c_stop();
i2c_start();
i2c_sendbyte(ADDRTC);
i2c_waitACK();
i2c_sendbyte(7); // 地址指针置为 7
i2c_waitACK();
i2c_sendbyte(0x10); // sqwe引脚1Hz的输出
i2c_waitACK();
i2c_stop();
}
/********************************************************************************
函数功能: 写RTC寄存器
********************************************************************************/
void write_RTC_time(void)
{
i2c_start();
i2c_sendbyte(ADDRTC); // 写从机地址(器件地址)
i2c_waitACK();
i2c_sendbyte(0); // 地址指针置为 0
i2c_waitACK();
i2c_sendbyte(Sec); // Sec
i2c_waitACK();
i2c_sendbyte(Min); // Min
i2c_waitACK();
i2c_sendbyte(Hr); // Hr
i2c_waitACK();
i2c_sendbyte(Dy); // Dy
i2c_waitACK();
i2c_sendbyte(Dt); // Dt
i2c_waitACK();
i2c_sendbyte(Mn); // Mn
i2c_waitACK();
i2c_sendbyte(Yr); // Yr
i2c_waitACK();
i2c_stop();
}/********************************************************************************
********************************************************************************/
单片机电子时钟设计
#include avr/io.h
#include avr/interrupt.h
#include util/delay.h#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND (1PD0))==0x00)
#define k2() ((PIND (1PD1))==0x00)
#define k3() ((PIND (1PD2))==0x00)
#define k4() ((PIND (1PD3))==0x00)
#define k5() ((PIND (1PD4))==0x00)
#define k6() ((PIND (1PD5))==0x00)
#define k7() ((PIND (1PD6))==0x00)
#define k8() ((PIND (1PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};
INT8U ja;
INT8U key=0xff;
INT8U h,m,s,m1,d;
INT16U y; void hour1()
{
if (++h23) {h=0;day();}
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
} void minute1()
{
if (++m59)
{m=0;br hour1();br }
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
} void second1() {
if (++s59)
{ s=0;
minute1();
}
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
} const INT8U Days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const INT8U Days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
void year()
{if (++y9999) y=0;br br seg11[0]=seg[y/1000];br seg11[1]=seg[y%1000/100];br seg11[2]=seg[y%100/10];br seg11[3]=seg[y%10];br } void month1()
{
if (++m112)
{m1=0;br year();br }
seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
} void day()
{ INT8U DAY;
DAY=(( y%4==0 y%100!=0 )||( y%400==0 ) ) ? Days1[m1]:Days2[m1];//判断闰年
if(++dDAY)
{ d=0;
month1();
}
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
} //时间函数
void time()
{
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
PORTA=0x00;
PORTA=seg11[ja]; PORTB=~(1ja);
ja=(ja+1)0x07;
_delay_ms(5); }
//日期
void date()
{ seg11[0]=seg[y/1000];
seg11[1]=seg[y%1000/100];
seg11[2]=seg[y%100/10];
seg11[3]=seg[y%10];
seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
//seg11[2]=seg11[5]=0x00;
PORTA=0x00;
PORTA=seg11[ja];
PORTB=~(1ja);
ja=(ja+1)0x07;
_delay_ms(3);
}
int main()
{ INT8U ja=0;
DDRA=0xff; PORTA=0xff;
DDRB=0xff; PORTB=0xff;
DDRD=0x00; PORTD=0xff;PIND=0x00;
MCUCR=0X0A;//MCU 控制寄存器- MCUCR
GICR=0XC0; //通用中断控制寄存器- GICR ASSR=0x08;
TCCR2=0x04;
TCNT2=0;
TIMSK=_BV(TOIE2)|_BV(TOIE0); d=26;y=2000;m1=2;
h=m=s=12;
sei();
while(1)
{ time();
if(k1())
/{ while(k1()); hour1(); }
if(k8())
{ while(k8());
while(2)//日期循环
{
date();
if(k8())
{while(k8());break;} }
}
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00;
}
else
{ seg11[2]=seg11[5]=0x40;
second1();
}
}
单片机电子时钟设计程序实验报告的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于单片机电子时钟实验总结、单片机电子时钟设计程序实验报告的信息别忘了在本站进行查找喔。