单片机实验报告9.docx

上传人:b****2 文档编号:18020174 上传时间:2023-04-24 格式:DOCX 页数:11 大小:171.30KB
下载 相关 举报
单片机实验报告9.docx_第1页
第1页 / 共11页
单片机实验报告9.docx_第2页
第2页 / 共11页
单片机实验报告9.docx_第3页
第3页 / 共11页
单片机实验报告9.docx_第4页
第4页 / 共11页
单片机实验报告9.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

单片机实验报告9.docx

《单片机实验报告9.docx》由会员分享,可在线阅读,更多相关《单片机实验报告9.docx(11页珍藏版)》请在冰豆网上搜索。

单片机实验报告9.docx

单片机实验报告9

洛阳理工学院实验报告

系别

计算机系

班级

B140505

学号

B14050414

姓名

史锦峰

课程名称

单片机原理及组成

实验日期

2016.5.30

实验名称

可调时钟

成绩

实验目的:

了解LCD1602的用法

实验条件:

计算机,KeiluVision4,ISIS7Professional,实验箱

实验内容:

实验过程

1.实验电路图

2.C51源程序

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitrs=P2^4;//定义液晶显示器控制端口

sbitrw=P2^5;

sbiten=P2^6;

sbits1=P1^0;//定义按键控制

sbits2=P1^1;

sbits3=P1^2;

sbits4=P1^3;

ucharshi,fen,miao,ri,yue,nin;

ucharcodetable[]={"Time"};

ucharcodetable1[]={"00:

00:

00"};

ucharnum,num1,count;

uinti,sh,ge,s,g;

voiddelay(uchartime)//延时

{

uintj;

for(;time>0;time--)

for(j=0;j<125;j++);

}

voidwrite_com(ucharcom)//写指令函数

{

en=0;

rs=0;

delay(5);

P0=com;

delay(5);

en=1;

delay(5);

en=0;

}

voidwrite_data(uchardat)//写数据函数

{en=0;

rs=1;

delay(5);

P0=dat;

delay(5);

en=1;

delay(5);

en=0;

}

voidinit()//初始化

{en=0;

rw=0;

write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口

write_com(0x0c);//设置开显示,不显示光标

write_com(0x06);//写一个字符后地址指针加1

write_com(0x01);//显示清零,数据指针清零

for(i=0;i<(sizeof(table)-1);i++)//第一行写

{

write_com(0x80+i);

write_data(table[i]);

}

for(i=0;i<(sizeof(table1)-1);i++)//第二行写

{write_com(0x80+0x40+i);

write_data(table1[i]);

miao=59;

fen=59;

shi=23;

TMOD=0x01;//time0作为定时器工作在模式1下

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;//开启总中断

ET0=1;//开启time0中断

TR0=1;//启动time0

}

voidwrite_sfm(ucharadd,ucharnum)//时分秒函数

{sh=num/10;//分离出十位

ge=num%10;//分离出个位

write_com(0x80+0x40+add);//第二行数据指针位置调整

write_data(0x30+sh);//更改显示数据的十位

write_data(0x30+ge);//更改显示数据的个位

}

voidtimer0()interrupt1//time0中断

{

TH0=(65536-50000)/256;//重装初始值

TL0=(65536-50000)%256;

count++;

if(count==20)//20次到则满一秒

{

count=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

}

write_sfm(4,shi);

}

write_sfm(7,fen);

}

write_sfm(10,miao);

}

}

voidkeyscan()//键盘扫描

{if(s1==0)//按下S1

{delay(5);

if(s1==0)

{

num1++;

while(!

s1);//等待释放

if(num1==1)

{

TR0=0;

write_com(0x0e);//显示光标,不闪烁

write_com(0x80+0x40+0x0b);//数据指针移动到秒的个位处

write_com(0x0f);//显示光标,闪烁

}

if(num1==2)

{

write_com(0x80+0x40+0x08);//数据指针移到到分钟的个位处

}

if(num1==3)

{

write_com(0x80+0x40+0x05);//数据指针移到到小时的个位处

}

if(num1==4)

{num1=0;//清零

write_com(0x0c);//重新显示

TR0=1;//重新启动计时

}

}

}

if(num1!

=0)//按下S2则选择时/分/秒加1

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!

s2);

if(num1==1)

{

delay(20);

miao++;

if(miao==60)

miao=0;

write_sfm(10,miao);

write_com(0x80+0x40+0x0a);

}

if(num1==2)

{fen++;

if(fen==60)

fen=0;

write_sfm(7,fen);

write_com(0x80+0x40+0x07);

}

if(num1==3)

{

shi++;

if(shi==24)

shi=0;

write_sfm(4,shi);

write_com(0x80+0x40+0x04);

}

}

}

}

if(num1!

=0)

if(s3==0)//按下S3则选择时/分/秒减1

{

delay(5);

if(s3==0)

{

while(!

s3);

if(num1==1)

{

delay(20);

miao--;

if(miao==-1)

miao=59;

write_sfm(10,miao);

write_com(0x80+0x40+0x0a);

}

if(num1==2)

{

fen--;

if(fen==-1)

fen=59;

write_sfm(7,fen);

write_com(0x80+0x40+0x07);

}

if(num1==3)

{

shi--;

if(shi==-1)

shi=23;

write_sfm(4,shi);

write_com(0x80+0x40+0x04);

}

}

}

if(num1!

=0)

if(s4==0)//确定按键

{

delay(5);

if(s4==0)

{

while(!

s4);

num1=0;//清零

write_com(0x0c);//重新显示

TR0=1;//重新启动计时

}

}

}

voidmain()

{

init();

while

(1)

{

keyscan();

}

}

3.程序调试方法

在Keilc里面先敲入程序,保存成“.c”的文件,在新建一个工程,在工程里面添加保存好的文件,在设置里面的生成“,hex”选项后面打上勾,在编译程序,如果提示有错误就点击错误,程序上就会在错误的地方有一个光标,然后检查修改。

4.仿真运行效果

 

实验总结:

图和程序都是网上找的。

但是程序和实验箱又是不符合的。

所以我们要烧进实验箱的程序还得重新调,重新改。

有一个问题是个位显示的数字到9之后会显示一些符号,通过治疗查到,那些是LCD1602内部的显示,我们计数的显示只能选择前10个数字,所以在显示各位时,当秒计数应该求余数,显示十位时,应该求除数。

另外还有一些小问题就是程序比较复杂,具体实现不太清楚。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1