概要
用51系列单片机设计一个数字时钟,要求在LCD1602显示屏的第一行显示学号;第二行显示时钟并有时、分按键校准功能。
预览图:
整体设计流程
先在proteus仿真软件画好仿真图,然后再到keil编程软件中实现功能代码的编写,最后将我们的代码进行编译、导出,然后下载到我们的仿真单片机中或者是实物的开发板中进行验证。
具体操作流程
top1:仿真图的绘制
实验用到的器件如图所示,找不到器件可以参考这张图下的标签来找:
查找的步骤如下图:
top2:keil编程代码
#include <REG52.H>//头文件
#define uchar unsigned char//无符号char数据类型的宏定义,用uchar替换unsigned char
#define uint unsigned int
sbit RS=P2^5; // 定义端口
sbit RW=P2^3;
sbit E=P2^4;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3; //定义端口
uchar code str[]="20210410B02xx"; // 学号
char hour=0,min=0,second=0;//时分秒
uchar con=0;
void delayms(uint ms)//ms延时函数
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void w_com(uchar com)//1602写命令函数(一般是写位置,清除等)
{
RS=0;
RW=0;
E=1;
P0=com;
E=0;
delayms(1);
}
void w_dat(uchar dat)//1602写数据函数()
{
RS=1;
RW=0;
E=1;
P0=dat;
E=0;
delayms(1);
}
void lcd_init()//1602初始化函数()
{
delayms(10);
w_com(0x38);
delayms(10);
w_com(0x0c);
delayms(10);
w_com(0x06);
delayms(10);
w_com(0x01);
delayms(10);
w_com(0x38);
delayms(10);
}
void T0_inti()//T0定时1s。默认时钟频率为12Mhz
{
TMOD=0x01;//方式一16位定时器
TH0=(65536-50000)/256;//设置初值为50ms中断一次
TL0=(65536-50000)%256;//设置初值为50ms中断一次
TR0=1;//开定时器
ET0=1;//开定时器的中断函数
EA=1;//开中中断
}
void KEY_can()//按键处理函数
{
if(key1==0||key2==0||key3==0||key4==0)
{
delayms(20);//消抖
if(key1==0||key2==0||key3==0||key4==0)
{
if(key1==0)//时+1
{
hour++;
if(hour>23)
hour=0;
while(key1==0);
}
else if(key2==0)//时-1
{
hour--;
if(hour<0)
hour=23;
while(key2==0);
}
else if(key3==0) //分+1
{
min++;
if(min>59)
min=0;
while(key3==0);
}
else if(key4==0) //分-1
{
min--;
if(min<0)
min=59;
while(key4==0);
}
}
}
}
void main()
{
uint i;
T0_inti();
lcd_init();
w_com(0x82);
for(i=0;str[i]!='\0';i++)
w_dat(str[i]);
while(1)
{
KEY_can();
w_com(0xc2);
w_dat(hour/10+0x30);
w_dat(hour%10+0x30);
w_dat(':');
w_dat(min/10+0x30);
w_dat(min%10+0x30);
w_dat(':');
w_dat(second/10+0x30);
w_dat(second%10+0x30);
}
}
void T0_EX0()interrupt 1//中断服务函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++con==20)//1s
{
con=0;
if(++second==60)//1min
{
second=0;
if(++min==60)//1hour
{ min=0;
if(++hour==24)//1day
hour=0;
}
}
}
}
top3:将程序写好后先进行编译,看是否有错误,如果没错误就可以编译导出HEX下载文件
流程如下:
*无错误无警告*
top4:最后将工程目录下的Hex文件下载到单片机中
流程如下: