基于51单片机的LCD1602电子时钟显示

本项目基于51单片机和LCD1602实现了分秒计时功能,包括按键控制调整、满分钟报时及PCB绘制。学习了LCD1602工作原理、Altium Designer使用、单片机定时器应用及程序设计技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、考核内容完成度
完成部分:基于51单片机控制的LCD1602实现分-秒计时的程序书写;实现按键分别控制分和秒的调整;实现满一分钟的报时功能;完成PCB板的绘制与焊接。
未完成部分:发挥部分(按键切换模式)。

二、从中学到了什么
1、LCD1602的工作方式:
(1)LCD602上十六个引脚对应的功能:Vss与Vcc分别接电源地与5V电源,V0为调节屏幕亮度的功能,RS与WR为输入指令与数据端口,D0~D7为输入数据口,A与K为LCD背光电源的正、负极。
(2)LCD的运行:
读状态:RS=L,RW=H,E=H;
写指令:RS=L,RW=L,D0~D7=指令码,E=高脉冲;
读数据:RS=H,RW=H,EH;
写数据:RS=H,RW=L,D0~D7=数据,E=高脉冲。
(3)LCD接入单片机时注意:
注意LCD各引脚与单片机连接时候相应程序的对应;
3号引脚口需连接滑动变阻器,特别注意滑动变阻器的封装图与设计的原理图相符合;
在1号引脚与2号引脚、15号引脚与16号引脚分别连接104pf的电容。
2、Altium designed的应用:
能够根据设计的电路图所需要的元器件建立自己的库以及绘制出所需要的器件的sch与pcb样子;
能够独立绘制出电路并生成PCB电路图。
3、单片机部分:
对单片机的认识应用更加深入,尤其是定时器/计数器的应用和下载电路TXD、RXD端口掌握用法。
4、对题目的思考与程序构思:
1)接手到题目时候,查看题目中所应用的东西的资料,尽量先了解透彻其工作原理以后,再对题目进行一个构思,想一想该怎么写出相应的程序来实现功能。
2)在写程序时应该有一个明确的框架,在大框架之下还要有清晰的各部分的功能的构思。各部分功能之间的联系也要明确。
3)写程序时候不能忽略ascall码的存在,特别是在输出字母数字特殊符号的时候。

三、觉得不足的地方
1)在这次写程序时候,对按键的消抖只局限于一种办法,没有真正了解透彻不同的消抖程序对硬件的要求高低;
2)程序里写出自己思考出来的很少,很大一部分是改编网上的程序;
3)对于原理图的设计LCD的连线盲目抄袭网上的图,导致最后打印出来板子后更改线路,使板子不够美观;
4)在进行PCB的连线时候完全是按照软件里的白线来,没有很仔细的对照原理图,导致电位器的连接错误和六脚开关的连线错误。

四、掌握查找错误的方法
1) 在做完电路板的焊接后进行调试先从VCC和GND两条主要的线路开始着手,一步一步的排查电源电路、蜂鸣器电路、LCD电路等,一部分一部分的检查;
2)排查错误时候也不应该只考虑是不是硬件出的问题,程序也需要进行排查。两个方面同时入手才能更好更快的解决问题。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit E = P2^7;
sbit RS = P2^5;
sbit RW = P2^6;
sbit keydj = P3^1;
sbit keyf = P3^2;
sbit keym = P3^3;
sbit beep = P1^5;

uint miao,fen,shi,ge,k,jishu,count,m,mr,biaozhi,dd;
uchar table[] = "      00:00     ";


void delay_ms(uint n)                  
{
    uint i=0,j=0;
    for(i=0;i<n;i++)
    for(j=0;j<123;j++);
}


void write_order(uint ord)            
{
  	E=0;
		RS=0;
		RW=0;
	  P0 = ord;
	  delay_ms(1);
	  E=1;
		delay_ms(1);
	  E=0;
}


void write_data(uint date)          
{
  	E=0;
		RS=1;
		RW=0;
	  P0 = date;
	  delay_ms(1);
	  E=1;
		delay_ms(1);
	  E=0;  
}


void chushihua()
{
   delay_ms(15);
   write_order(0x38);
	 delay_ms(5);
   write_order(0x38);
	 delay_ms(15);
   write_order(0x38);
   write_order(0x38);            
	 write_order(0x38);              
	 write_order(0x01);             
	 write_order(0x06);        
	 write_order(0x0c); 	           
		
	write_order(0x80);         
	for(k=0;k<16;k++)
	{
		write_data(table[k]);           
		delay_ms(2);
	}

	 TMOD = 0x01;              
	 TH0 = (65536-50000)/256;    
	 TL0 = (65536-50000)%256;
	 EA = 1;              
	 ET0 = 1;             
	 TR0 = 1;                   

}

void display(uint dizhi,uint number)     
{
	shi=number/10;                       
	ge =number%10;  
	write_order(0x80+dizhi);              
	write_data(0x30+ge); 	
	write_order(0x80+dizhi-1);            
	write_data(0x30+shi); 	

}


void ajhxs()                    
{
	if(keym==0)                
	{ 	
		delay_ms(50);
		if(keym==0)
		{ 
			biaozhi=1;
				if(biaozhi==1)
				{
				TR0=0;
				}
		  miao++;
			if(miao==60)
			{
				miao=0;
			  fen++;
				if(fen==60)
				{
					fen=0;
				}
				display(0x07,fen);          
			write_order(0x80+0x07);  
     	}
			display(0x0a,miao);
		  write_order(0x80+0x0a); 
          biaozhi=0;
         if(biaozhi==0)
				 {
              TR0=1;
				 }					 
		}
		while(!keym);
		delay_ms(50);	
	 }
	if(keyf==0)                        
	 {
		delay_ms(50);
		if(keyf==0)
		{
			fen++;
			if(fen==60)
			{
				fen=0;
			}
			display(0x07,fen);
	    write_order(0x80+0x07);  
		}
		while(!keym);
		delay_ms(50);	
	}

}
	 void main()
{
		chushihua();          

	while(1)
	{
		ajhxs();                   
	}
}


void timing() interrupt 1         
{
	 TH0 = (65536-50000)/256;    
	 TL0 = (65536-50000)%256;
	 jishu++;                       
	if(jishu==20)                 
	 {
		 jishu=0;
	   miao++;
		 if(miao==60)
		 {
        mr=1;
			 while(mr==1)               
			 {
				 while(1)
				 {
					 for(m=0;m<20;m++)
					 {
						 beep=~beep;      
						 delay_ms(3);
					 }
					 mr=0;
					 if(mr==0)
					 break;
				 }
				 beep=1;                 
			 }
			 miao=0;
			 fen++;
			 if(fen==60)
			 {
				 fen=0;
			 }
			 display(0x07,fen);	 
		 }
		 display(0x0a,miao);	 
	 }
 }
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值