基于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_Arrary0);

LCD12864_Show_16_16(4,0,Title_Font_Arrary1);

LCD12864_Show_16_16(5,0,Title_Font_Arrary2);

}

else

{

LCD12864_Show_16_16(3,0,Title_Font_Arrary3+(display_flag-1)\*2);

LCD12864_Show_16_16(4,0,Title_Font_Arrary3+(display_flag-1)\*2+1);

LCD12864_Show_16_16(5,0,Title_Font_Arrary13);

}

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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
茯苓gao18 分钟前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉3 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者4 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间5 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious5 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng9 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计10 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试一、基本概念
嵌入式硬件·通信与接口协议
wuyk5551 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
☆cwlulu1 天前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu