51单片机制作的电子时钟的proteus仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通过proteus仿真51单片机制作的电子钟

----------by lyz

这是一个利用proteus仿真简易电子钟的例子,通过c51单片机和一块1602液晶显示屏来工作,十分简单,这样的实践是初学者不错的练习。

第一步:

首先,点开isis.exe(切记不是ARES.EXE),如图1通过proteus把原理图布好。

单片机可以选用AT89c51,液晶显示可通过搜索关键字LM016L得到。由于本电路选用P0口,因此加上了RP1排阻作为上拉电阻。

图1

第二步:

编写程序如下,时间略有误差(us级),可通过keil中的debug调试地更为精确:#include

typedef unsigned char uchar;

typedef unsigned int uint;

sbit rs=P3^2;

sbit wr=P3^3;

sbit lcden=P3^4;

uchar timecount=0;

void delay(uint i)

{

uint a,b;

for(a=i;a>0;a--)

for(b=10;b>0;b--);

}

/********************1602*****************/ void write_com(uchar com)

{

P0=com;

rs=0;

lcden=0;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

void write_date(uchar date)

{

P0=date;

rs=1;

lcden=0;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

void init()

{

wr=0;

write_com(0x38);

delay(20);

write_com(0x0f);

delay(20);

write_com(0x06);

delay(20);

write_com(0x01);

delay(20);

}

/*********************************************************

主函数

**********************************************************/

void main()

{

uchar a,second=0,minute=0,hour=0;

uchar table[8];

TMOD|=0x01; //定时/计数器0工作于定时器模式,方式1

TH0=(65536-5000)/256;

TL0=(65536-5000)%256; //50ms定时常数

EA=1; //开总中断

ET0=1; //允许定时/计数器0 中断

TR0=1; //启动定时/计数器0 中断

P0=0;

P2&=0x1F;

init();

while(1)

{

if(timecount>19) //*****20乘50为1000ms {

timecount=0;

second++;

}

if(second==60)

{

second=0;

minute++;

}

if(minute==60)

{

minute=0;

hour++;

}

if(hour==24)

{

hour=0;

}

table[0]=hour/10+48; //***数字加上48对应的它的ascll码,用来显示在液晶上

table[1]=hour%10+48;

table[2]=58; //***58对应冒号

table[3]=minute/10+48;

table[4]=minute%10+48;

table[5]=0;

table[6]=second/10+48;

table[7]=second%10+48;

write_com(0x80);

delay(20);

for(a=0;a<8;a++)

{

write_date(table[a]);

delay(20);

}

}

}

/*********************************************************

中断服务函数

**********************************************************/

void Time0(void) interrupt 1 // using 0

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256; //50ms定时常数

timecount++;

}

/*********************************************************/

相关文档
最新文档