单片机电子时钟设计

单片机电子时钟设计,第1张

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>#define INT8U unsigned char

#define INT16U unsigned int

#define k1() ((PIND &(1<<PD0))==0x00)

#define k2() ((PIND &(1<<PD1))==0x00)

#define k3() ((PIND &(1<<PD2))==0x00)

#define k4() ((PIND &(1<<PD3))==0x00)

#define k5() ((PIND &(1<<PD4))==0x00)

#define k6() ((PIND &(1<<PD5))==0x00)

#define k7() ((PIND &(1<<PD6))==0x00)

#define k8() ((PIND &(1<<PD7))==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 yvoid hour1()

{

if (++h>23) {h=0day()}

seg11[0]=seg[h/10]

seg11[1]=seg[h%10]

} void minute1()

{

if (++m>59)

{m=0<br> hour1()<br> }

seg11[3]=seg[m/10]

seg11[4]=seg[m%10]

} void second1() {

if (++s>59)

{ 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 (++y>9999) 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 (++m1>12)

{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(++d>DAY)

{ 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=~(1<<ja)

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=~(1<<ja)

ja=(ja+1)&0x07

_delay_ms(3)

}

int main()

{ INT8U ja=0

DDRA=0xffPORTA=0xff

DDRB=0xffPORTB=0xff

DDRD=0x00PORTD=0xffPIND=0x00

MCUCR=0X0A//MCU 控制寄存器- MCUCR

GICR=0XC0 //通用中断控制寄存器- GICR ASSR=0x08

TCCR2=0x04

TCNT2=0

TIMSK=_BV(TOIE2)|_BV(TOIE0) d=26y=2000m1=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()

}

}

程序设计思路:1.利用单片机内部定时器作为计时器,调用timer函数;2、设计州隐一套按键子程序;(3)设计一套数码显示管子程序。下列提供一套程序供参考。

#include<iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}//0-9对应字符

const uchar key_value[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

uchar data[4]={0}//显示初始值为0

uint count=0  //初始计数值为0

uchar keynum

void port_init()  //端口初始化函数

{DDRA=0XFF    //端口A为推挽1输出

PORTA=0XFF

PORTB=0XFF //端口B为推挽1输出

DDRB=0XFF

DDRC=0XFF //端口C为不带上拉电阻的输入

PORTC=0XFF

DDRD=0XFF //端口D低4位为输出

PORTD=0X0F

}

void delay(uint j)   //延时函数

{uint k

while(j--)

{for(k=1000k>0k--) }

}

void display(uchar *p)   //显示函数

{uchar i,sel=0x01

for(i=0i<4i++)

{PORTA=sel      //选通最右边的数码管

PORTB=table[p[i]]//送字型码

delay(1)

sel=sel<<1 盯穗   //左移一位

}

}

uchar get_key(void)

{if((PIND&0X0F)!=0X0F) delay(3)

{

PORTD=0XEF

switch(PIND&0X0F)

{case 0x0e: keynum=key_value[0]break

 case 0x0d: keynum=key_value[4]break

 case 0x0b: keynum=key_value[8]break

 case 0x07: keynum=key_value[12]break

 default:break

}

PORTD=0xdf

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[1]break

 case 0x0d:keynum=key_value[5]break

 case 0x0b:keynum=key_value[9]break

 case 0x07:keynum=key_value[13]break

 default:break

}

PORTD=0xbf

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[2]break

 case 0x0d:keynum=key_value[6]break

 case 0x0b:keynum=key_value[10]break

 case 0x07:keynum=key_value[14]break

 default:break

}

PORTD=0x7f

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[3]break

 case 0x0d:keynum=key_value[7]break

 case 0x0b:keynum=key_value[11]break

 case 0x07:keynum=key_value[15]break

 default:break

}

while((PIND&0x0f)!=0x0f)

}

return keynum

}

void process(uint i,uchar *q) //拆分BCD码函数,显示千、百、十、个位

{  q[0]=i/1000

 凯迹卜i=i%1000

 q[1]=i/100

 i=i%100

 q[2]=i/10

 i=i%10

 q[3]=i

}

void main(void)

{port_init()

PORTB=0xff

PORTA=0X00

delay(50)

PORTA=0xff

while(1)

{get_key()

count=keynum

process(count,data)

display(data)

}

}


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

原文地址: http://outofmemory.cn/yw/12569928.html

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

发表评论

登录后才能评论

评论列表(0条)

保存