基于AVR128单片机世界电子时钟的设计

一、系统方案

上电初始化完成系统初始化,液晶滚动显示北京、莫斯科、东京、伦敦、巴黎、纽约等六个城市的标准时间,显示的内容包括地区名及相应地区的年、月、日、星期、时、分、秒。

使用K1按键控制滚动显示或稳定显示某个地区的时间。

使用K3、K4、K5按键可进行时间和日期的设定。在进行年、月、日、时、分、秒的调整时,被选中的调节对象能闪烁显示。

二、硬件设计

原理图如下:

三、单片机软件设计

1、首先是系统初始化

unsigned char set_mode=0;

short time_offset=0;

unsigned char last_display_flag;

unsigned char i =0,set_obj=0;

CLI(); //disable all interrupts

PORTA = 0xFF;

DDRA = 0x00;//输入

PORTB = 0xFF;//低电平

DDRB = 0x00;//输入

PORTC = 0xFF;//低电平

DDRC = 0xFF;//输出

PORTE = 0xFF;

DDRE = 0xff;//输出

PORTD = 0xff;

DDRD = 0xFF;//输出

PORTD = 0xff;

PORTF = 0xFF;

DDRF = 0xFF;//输出

PORTG = 0xFF;

DDRG = 0xFF;//输出

LCD12864_Init();
	
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
MCUCR = 0x00;
TCCR0 = (1<<CS02)|(1<<CS01);//T/C0工作于定时方式,系统时钟256分频
TCNT0 = 0x00;    //计数初值
TIMSK = 0x11; //timer interrupt sources
SEI();  //使能全局中断 


	
//initial_ds1302();

2、液晶显示程序

void SendCommand(unsigned char command)

{

CheckState();

LGM12864_CLR_RS;

LGM12864_CLR_RW;

LCDa_DO = command;

delay_nus(2);

LGM12864_SET_EN;

delay_nus(2);

LGM12864_CLR_EN;

}

unsigned char LCD12864_RecData()

{

unsigned char temp;

CheckState();

LGM12864_SET_RS;

LGM12864_SET_RW;

LGM12864_SET_EN;

temp=LCDa_DI;

LGM12864_CLR_EN;

return (temp);

}

3、按键程序

if((PINA&0x01) == 0x00)

{

delay_nms(50);

while((PINA&0x01) == 0x00);

work_mode++;

if(work_mode>2)

{

work_mode = 0;

}

}

else if((PINA&0x02) == 0x00)

{

delay_nms(50);

while((PINA&0x02) == 0x00);

display_flag++;

if(display_flag>7)

{

display_flag=0;

}

}

else if((PINA&0x04) == 0x00)

{

delay_nms(50);

while((PINA&0x04) == 0x00);

work_mode=2;

display_flag=1;

set_obj++;

if(set_obj>8)

{

//work_mode=0;

set_obj=0;

initial_ds1302();

}

}

else if((PINA&0x08) == 0x00)

{

delay_nms(50);

while((PINA&0x08) == 0x00);

set_mode++;

if(set_mode>=2)

{

set_mode=0;

}

}

4、核心算法程序

if((display_flag != last_display_flag)||(work_mode0x02)||(work_mode0x01))

{

last_display_flag = display_flag;

if(display_flag==0)

{

LCD12864_Show_16_16(3,0,Title_Font_Arrary[0]);

LCD12864_Show_16_16(4,0,Title_Font_Arrary[1]);

LCD12864_Show_16_16(5,0,Title_Font_Arrary[2]);

}

else

{

LCD12864_Show_16_16(3,0,Title_Font_Arrary[3+(display_flag-1)*2]);

LCD12864_Show_16_16(4,0,Title_Font_Arrary[3+(display_flag-1)*2+1]);

LCD12864_Show_16_16(5,0,Title_Font_Arrary[13]);

}

ds1302_dec_data.second = H_D(ds1302_data.second);

ds1302_dec_data.minute = H_D(ds1302_data.minute);

ds1302_dec_data.hour = H_D(ds1302_data.hour)+time_offset;

ds1302_dec_data.week = H_D(ds1302_data.week);

ds1302_dec_data.day = H_D(ds1302_data.day);

ds1302_dec_data.month = H_D(ds1302_data.month);

ds1302_dec_data.year = H_D(ds1302_data.year);

		LCD12864_Show_8_16(0,1,Number_Font_Arrary[2]);
		LCD12864_Show_8_16(1,1,Number_Font_Arrary[0]);
		for(i=0;i<3;i++)
		{
		LCD12864_Show_8_16(2+i*3,1,Number_Font_Arrary[(*(&ds1302_dec_data.year+i))/10%10]);
		LCD12864_Show_8_16(3+i*3,1,Number_Font_Arrary[(*(&ds1302_dec_data.year+i))%10]);
		if(i!=2)
		LCD12864_Show_8_16(4+i*3,1,TIME_Font_Arrary[0]);
		}

		for(i=0;i<3;i++)
		{
		LCD12864_Show_8_16(0+i*3,2,Number_Font_Arrary[(*(&ds1302_dec_data.hour+i))/10%10]);
		LCD12864_Show_8_16(1+i*3,2,Number_Font_Arrary[(*(&ds1302_dec_data.hour+i))%10]);
		if(i!=2)
		LCD12864_Show_8_16(2+i*3,2,TIME_Font_Arrary[0]);
		}
		
		LCD12864_Show_8_16(0,3,Number_Font_Arrary[ds1302_dec_data.week/10%10]);
		LCD12864_Show_8_16(1,3,Number_Font_Arrary[ds1302_dec_data.week%10]);
		if(set_obj>0)
		{
		delay_nms(200);
		if(set_obj<=0x03)
		{
		LCD12864_Show_Anti_White_8_16(2+(set_obj-1)*3,1,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))/10%10]); 
		LCD12864_Show_Anti_White_8_16(3+(set_obj-1)*3,1,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))%10]); 
		}
		else if(set_obj<=0x04)	
		{
		LCD12864_Show_Anti_White_8_16(0,3,Number_Font_Arrary[ds1302_dec_data.week/10%10]); 
		LCD12864_Show_Anti_White_8_16(1,3,Number_Font_Arrary[ds1302_dec_data.week%10]); 
		
		}
		else if(set_obj<=0x07)
		{
		LCD12864_Show_Anti_White_8_16(0+(set_obj-5)*3,2,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))/10%10]); 
		LCD12864_Show_Anti_White_8_16(1+(set_obj-5)*3,2,Number_Font_Arrary[(*((unsigned char*)&ds1302_dec_data.year+set_obj-1))%10]); 
		}
		}
		}
	//}

四、proteus仿真设计

Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
FreakStudio5 小时前
开源一款串口舵机驱动扩展板-FreakStudio多米诺系列
单片机·嵌入式·大学生·电子diy
艾格北峰6 小时前
STM32 物联网智能家居 (六) OLED显示设备
arm开发·stm32·单片机·嵌入式硬件·物联网·智能家居
weixin_535854228 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘
热爱嵌入式的小许9 小时前
STM32 HAL库&标准库+ESP8266+机智云
stm32·单片机·嵌入式硬件·stm32移植机智云·stm32连接机智云·hal库移植机智云·标准库移植机智云
无际单片机编程9 小时前
面对STM32的庞大体系,如何避免迷失在细节中?
java·stm32·单片机·嵌入式硬件·嵌入式开发
2301_7646022312 小时前
stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
stm32·单片机·嵌入式硬件
楼台的春风12 小时前
PWM(脉宽调制)技术详解:从基础到应用实践示例
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式
Jack1530276827914 小时前
芯谷D668:便携式录音机与耳机式盒式录音机的理想音频解决方案
嵌入式硬件·音视频·家庭影院·麦克风阵列处理器·便携式录音机·耳机式盒式录音机
深圳市青牛科技实业有限公司 小芋圆14 小时前
芯谷D2761:为扬声器保护而生的音频限幅器
人工智能·科技·单片机·嵌入式硬件·机器人·音视频
程序员JerrySUN14 小时前
树莓派 4B:AI 物联网完整部署方案
linux·人工智能·嵌入式硬件·物联网·分类·数据挖掘