单片机电子时钟设计程序实验报告(单片机电子时钟实验总结)

程序设计 913
本篇文章给大家谈谈单片机电子时钟设计程序实验报告,以及单片机电子时钟实验总结对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、利用单片机定时器制作数字时钟

本篇文章给大家谈谈单片机电子时钟设计程序实验报告,以及单片机电子时钟实验总结对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

利用单片机定时器制作数字时钟

下面是时间程序,直接下来用就行了.

/*******************************************************************************

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

* 描述: *

* 简易电子时钟,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();

}

}

单片机电子时钟设计程序实验报告的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于单片机电子时钟实验总结、单片机电子时钟设计程序实验报告的信息别忘了在本站进行查找喔。

扫码二维码