单片机9.docx
- 文档编号:7519264
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:11
- 大小:158.11KB
单片机9.docx
《单片机9.docx》由会员分享,可在线阅读,更多相关《单片机9.docx(11页珍藏版)》请在冰豆网上搜索。
单片机9
洛阳理工学院实验报告
系别
计算机系
班级
学号
姓名
课程名称
单片机原理及应用
实验日期
实验名称
DS1602可调时钟
成绩
实验目的:
设计可调时钟,并编写相应程序;
实验条件:
计算机一台,Proteus,keilC,实验箱两盒
实验内容:
1、按照资料,绘制实验九原理图;
2、熟悉μVision3编译软件,了解软件结构和功能。
3、编写可调时钟的C51程序,实现可调式电子钟的设计。
4.掌握液晶显示LCD1602的硬件原理与连接方式以及可调式电子钟按键控制的原理;
实验步骤:
1.提前阅读与实验相关的阅读材料;
2.在ISIS中完成电路图的绘制,如下图所示;
3.uVision3中编写和编译C51程序,并生成可执行文件;
4.在ISIS中加载可执行文件,通过仿真运行检验编程的正确性。
运行结果:
源代码:
#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[]={"Jinmao&Hlz"};
ucharcodetable1[]={"00:
00:
57"};
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=56;
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();
}
}
实验总结:
本次实验较难,在艰难的模拟成功后在连接实验箱和调试程序的时候发现困难重重,就是不知道什么原因无法调试成功,查了LCD1602可调电子时钟的详细资料,虽然没成功但是也懂得了很多知识,实践出真知,很多知识都是在实验中得到的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机