一、系统方案
1、本设计采用STC15单片机作为主控器。
2、液晶1602显示电子时钟。
3、串口显示电子时钟。
4、按键控制开启暂停清零。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
uint count=0;
uint8 strPhoto[8];
uint wendu=0;
P3M0 = 0x00;
P3M1 = 0x00;
lcd_init(); //LCD1602初始化
delay_ms(10); //初始化后延时
DisplayListChar(0, 0, table1); //在LCD1602屏第一行显示table1内容
EA = 1; //开总中断
TMOD = 0X21; //定时器0、工作方式1
ET0 = 1; //开定时器0中断
TR0 = 0; //允许定时器0定时
TH0 = 0X3C;
TL0 = 0XB0; //50ms
2、液晶显示程序
/**************************************
功能描述:LCD1602写命令函数
入口参数int8 com
返回值:无
***************************************/
void lcd_wcom(uint8 com)
{
lcd1602_rs=0; //选择指令寄存器
lcd1602_rw=0; //选择写
P0=com; //把命令字送入P0
delay_ms(1); //延时一小会儿,让1602准备接收数据
lcd1602_en=1; //使能线电平变化,命令送入1602的8位数据口
lcd1602_en=0;
}
/**************************************
功能描述:LCD1602写数据函数
入口参数:uint8 dat
返回值:无
***************************************/
void lcd_wdat(uint8 dat)
{
lcd1602_rs=1; //选择数据寄存器
lcd1602_rw=0; //选择写
P0=dat; //把要显示的数据送入P0
delay_ms(1); //延时一小会儿,让1602准备接收数据
lcd1602_en=1; //使能线电平变化,数据送入1602的8位数据口
lcd1602_en=0;
}
/**************************************
功能描述:LCD1602初始化函数
入口参数:无
返回值:无
**************************************/
void lcd_init(void)
{
lcd_wcom(0x38); //8位数据,双列,5 7字形
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}
/**************************************
功能描述:LCD1602按指定位置显示一个字符
入口参数:uint8 X, uint8 Y, uint8 DData
返回值:无
***************************************/
void DisplayOneChar(uint8 X, uint8 Y, uint8 DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
lcd_wcom(X); //发命令字
lcd_wdat(DData); //发数据
}
/**************************************
功能描述:LCD1602按指定位置显示一串字符
入口参数:uint8 X, uint8 Y, uint8 DData X代表第X+1列,Y代表第Y+1行
返回值:无
***************************************/
void DisplayListChar(uint8 X, uint8 Y, uint8 code *DData)
{
uint8 ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
3、按键程序
void key() //键盘扫描函数
{
if(key10)
{
delay_ms(10);
if(key10)
{
while(!key1);
TR0=1;
}
}
if(key20)
{
delay_ms(10);
if(key20)
{
while(!key2);
TR0=0;
}
}
if(key30)
{
delay_ms(10);
if(key30)
{
while(!key3);
TR0=0;hour=0;minute=0;second=0;
}
}
}
4、核心算法程序
/定时器0中断程序 ***/
void time0() interrupt 1
{
TH0 = 0X3C;
TL0 = 0XB0; //50ms
count++ ;
if(count==20) //20次50毫秒即一秒
{
count=0;
second++;
if(second==60) //秒加到60时分进位
{
second=0;
minute++;
if(minute==60) //分加到60时时进位
{
minute=0;
hour++;
if(hour==24) //时加到24时清0
{
hour=0;
}
}
}
}
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。