51单片机LCD1602电子时钟

51单片机LCD1602电子时钟

一.完成部分

基于51单片机用LCD1602实现时-分的显示
按键控制时-分的调整
能实现整时报时的功能(蜂鸣器响)
按键切换模式(模式一:时-分显示,模式二:60秒倒计时)
闹钟模式

二.未完成部分

电路板的焊接

三.从中学到了什么

1.新部分:首先我了解到了lcd1602的工作方式,其中:Vss接电源地,Vcc接5V电源,RS与WR为输入令与数据端口,D0~D7为输入数据口。以及可以选择地址进行输入。
2.单片机部分:进一步了解了各种外部中断的的应用,如:在考虑四种模式和按键的关系上,考虑相互的优先级和需求,进一步规划
3.同时要灵活应用已有的各种条件,如在整点报时上要求“不影响主程序的延时”首先计时器已经满足不影响主程序,并且每次运行都有一个比较固定的时间,只要设定好次数就可以做到

四.未来计划

1.争取了解多种解决问题的方法
2.尝试自己读懂每个原件的使用说明,做到深入了解每个原件
3.了解下载模块,在焊接上发挥
4.深入了解c51单片机的性能(此次存在内存超出的情况)

五.本次出现的问题

1.未合理分配内存,导致内存超出
解决方法:调整并在数组前加“code”
2.循环的失误导致闪屏
解决方法:调整初始化的位置
3.变量数据溢出
解决方法:考虑变量的内存大小,到达一定值后置初值

六.对本次要求的详细解读

1.首先,时钟显示模式需求的本质上还是数字的进位和显示的不断更新。再就是整点报时,这个可以通过位变化检测或者单纯的数字变化来确定蜂鸣器启动的时间点。
2.时钟调整模式要求对时分进行键位调整,当然,之后的时钟显示也应该是调整后的,可以采取先改变再对调,或者先暂停再改变。
3.再就是闹钟模式,闹钟模式调整上其实和调整模式差不多,关键就是设置一个值和时钟显示模式对应,让其能够再
对应的时间点使蜂鸣器启动。
4.倒计时其实关键并不在于显示和计时,因为这两点参考前面就行了,主要是可控性,也就是设置开关。

七.本次对自己个人觉得要注意的点

1.下面来满足这些需求,首先这里有四种模式,如果用两个外部中断肯定不够,况且0号口外度中断优先于计时器,
为了不干扰计时器,所以我将四种模式都置于主程序里,将中断作为一种改变判断的工具,并且尽量简短,以免影响主
程序的运行
2. 显示里面需要注意的是每次最好要重新标志好初始的输入点,避免输入错位

八.有关错误的查找

有些错误不一定会显示,如内存溢出这种就不会显示,这些还需要自己去了解,通过上网搜索等方式寻找解决方法

#include 
#include 

sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit BUZ=P1^0;
sbit IN=P2^0;
sbit DE=P2^1;
sbit BA=P2^2;

unsigned char code mod1[]=" workmod1:clock ";
unsigned char code mod2[]=" workmod2:setup ";
unsigned char code mod3[]=" workmod3:alarm ";
unsigned char code mod4[]=" workmod4:timer ";
unsigned int code timenumber[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0,1,2,3,4,5,6,7,8,9

unsigned int o,p;
unsigned char bs,i;
unsigned int c1,c2,c3,c4,c5,c6,z,i3;//mod1
unsigned int s;//mod2
long int a;
long int kk,k2;//mod4
long int t,k,i1,i2;//timer

void delay(int t)//50us
{
	unsigned int x;
    for(;t>0;t--)
    for(x=19;x>0;x--);
}

void writecom(unsigned char com)
{
    E=0;
    RS=0;
    RW=0;
    P0=com;
    delay(10);
    E=1;
    delay(20);
    E=0;
}

void writedate(unsigned char dat)
{
	E=0;
	RS=1;
	RW=0;
	P0=dat;
	delay(10);
	E=1;
	delay(20);
	E=0;
}

void innit()
{
	delay(30);
	writecom(0x38);
    delay(10);
    writecom(0x38);
    delay(10);
    writecom(0x38);
    writecom(0x38);
    writecom(0x08);
    writecom(0x01);
    writecom(0x06);
    writecom(0x0c);
}

void workmod1()
{
innit();
s=0;
while(bs==0)
{
	writecom(0x80);
	for(i=0;i<16;i++)
	{
		writedate(mod1[i]);
	}
	writecom(0x80+0x40);
	if(s==0)writedate('O'),writedate('F'),writedate('F');
	if(s==1)writedate('O'),writedate('N'),writedate(' ');
	c1=i1%10,c2=i1/10,c3=i2%60%10,c4=i2%60/10,c5=i2/60%24%10,c6=i2/60%24/10;
	writecom(0x80+0x45);
	writedate(timenumber[c6]);writedate(timenumber[c5]);
	writedate(':');
	writedate(timenumber[c4]);writedate(timenumber[c3]);
	writedate(':');
	writedate(timenumber[c2]);writedate(timenumber[c1]);
	i3=i2/60;
	if(i3!=z)//strike
	{
		o=1;	
		z=i3;
	}
	if(s==1&&a==i2)o=1;//alarm
    }
}

void workmod2()
{
innit();
s=0;
writecom(0x80);
for(i=0;i<16;i++)
{
	writedate(mod2[i]);
}
  while(bs==1)
{
	i1=0;
	writecom(0x80+0x4a);
	writedate(':');writedate('0');writedate('0');
	writecom(0x80+0x40);
	switch(s)
		{
			case 0:
				{
					writedate('M');
					if(IN==0)
						{
							delay(500);
							i2++;
							delay(500);
						}
						else if(DE==0)
							{
								delay(500);
								i2--;
								delay(500);
							}
				}break;
			case 1:
				{
					writedate('H');
					if(IN==0)
						{
							delay(500);
							i2=i2+60;
							delay(500);
						}
						else if(DE==0)
							{
								delay(500);
								i2=i2-60;
								delay(500);
							}
				}break;
		}
		c1=i1%10,c2=i1/10,c3=i2%60%10,c4=i2%60/10,c5=i2/60%24%10,c6=i2/60%24/10;
		writecom(0x80+0x45);
		writedate(timenumber[c6]);writedate(timenumber[c5]);
		writedate(':');
		writedate(timenumber[c4]);writedate(timenumber[c3]);
}
}

void workmod3()
{
innit();
s=0;
writecom(0x80);
for(i=0;i<16;i++)
{
	writedate(mod3[i]);
}
while(bs==2)
	{
		if(a==1440)a=0;
		writecom(0x80+0x40);
		switch(s)
			{
			case 0:
				{
					writedate('M');
					if(IN==0)
						{
							delay(500);
							a++;
							delay(500);
						}
						else if(DE==0)
							{
								delay(500);
								a--;
								delay(500);
							}
				}break;
			case 1:
				{
					writedate('H');
					if(IN==0)
						{
							delay(500);
							a=a+60;
							delay(500);
						}
						else if(DE==0)
							{
								delay(500);
								a=a+60;
								delay(500);
							}
				}break;
			}
			writecom(0x80+0x45);
			c3=a%60%10,c4=a%60/10,c5=a/60%10,c6=a/60/10;
			writedate(timenumber[c6]);writedate(timenumber[c5]);
			writedate(':');
			writedate(timenumber[c4]);writedate(timenumber[c3]);
	}
}

void workmod4()
{
innit();
kk=0;
writecom(0x80);
for(i=0;i<16;i++)
{
	writedate(mod4[i]);
}
while(bs==3)
	{
		k2=0;
		if(s==0)
			{
				writecom(0x80+0x45);
				writedate('R');
				writedate('E');
				writedate('A');
				writedate('D');
				writedate('Y');
			}
			else if(s==1)
				{
					writecom(0x80+0x45);
					for(i=0;i<5;i++)
					writedate(' ');
				while(kk!=60&&bs==3&&s==1)
					{
						kk=k2/20;
						writecom(0x80+0x47);
						writedate(timenumber[(60-kk)/10]);writedate(timenumber[(60-kk)%10]);
					}
					if(kk==60)o=1,s=0,kk=0;
				}
	}
}

void main()
{
innit();
TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;
EA=1;EX0=1;EX1=1;
IT0=1;IT1=1;
ET0=1;TR0=1;
k=0;bs=0;s=0;z=0;k2=0;i1=0;i2=0;kk=0;a=0;o=0;p=0;
while(1)
{
	switch(bs)
	{
		case 0:workmod1();break;
		case 1:workmod2();break;
		case 2:workmod3();break;
		case 3:workmod4();break;
	}
}
}

void int0 () interrupt 0//buttion:affirm
{
s++;s=s%2;
BUZ=1;
}

void timer0 () interrupt 1
{
for(t=0;t<20;t++)
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
}
k++;
if(k==20) i1++,k=0;
if(i1==60) i2++,i1=0;
if(i2==1440) i2=0;
k2++;//only mod4
if(o)BUZ=0,p++;
if(p==40)BUZ=1,o=0,p=0;
}

void int2 () interrupt 2//buttion:set up
{
kk=0;BUZ=1;
bs++;
bs=bs%4;
}

你可能感兴趣的:(c51)