1、单片机实验报告9洛阳理工学院实验报告系别计算机系班级B140505学号B14050414姓名史锦峰课程名称单片机原理及组成实验日期2016.5.30实验名称 可调时钟成绩实验目的:了解LCD1602的用法实验条件:计算机,Keil uVision4,ISIS 7 Professional,实验箱实验内容:实验过程1.实验电路图2.C51源程序#include#define uint unsigned int#define uchar unsigned charsbit rs=P24; /定义液晶显示器控制端口sbit rw=P25;sbit en=P26;sbit s1=P10; /定义按键控
2、制sbit s2=P11;sbit s3=P12;sbit s4=P13;uchar shi,fen,miao,ri,yue,nin;uchar code table= Time;uchar code table1= 00:00:00;uchar num,num1,count;uint i,sh,ge,s,g;void delay(uchar time) /延时 uint j; for(;time0;time-) for(j=0;j125;j+); void write_com(uchar com) /写指令函数 en=0; rs=0; delay(5); P0=com; delay(5);
3、en=1; delay(5); en=0;void write_data(uchar dat) /写数据函数 en=0; rs=1; delay(5); P0=dat; delay(5); en=1; delay(5); en=0;void init() /初始化 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
4、+) /第一行写 write_com(0x80+i); write_data(tablei);for(i=0;i(sizeof(table1)-1);i+) /第二行写 write_com(0x80+0x40+i); write_data(table1i);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; /启动time0void write_sfm(uchar add,uchar
5、num) /时分秒函数 sh=num/10; /分离出十位 ge=num%10; /分离出个位 write_com(0x80+0x40+add); /第二行数据指针位置调整 write_data(0x30+sh); /更改显示数据的十位 write_data(0x30+ge); /更改显示数据的个位void timer0() interrupt 1 /time0中断 TH0=(65536-50000)/256; /重装初始值 TL0=(65536-50000)%256; count+; if(count=20) /20次到则满一秒 count=0; miao+; if(miao=60) mia
6、o=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); void keyscan() /键盘扫描 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);/显示光标,闪烁 i
7、f(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
8、); 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)
9、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(0x
10、0c); /重新显示 TR0=1; /重新启动计时 void main() init(); while(1) keyscan(); 3.程序调试方法 在Keilc里面先敲入程序,保存成“.c”的文件,在新建一个工程,在工程里面添加保存好的文件,在设置里面的生成“,hex”选项后面打上勾,在编译程序,如果提示有错误就点击错误,程序上就会在错误的地方有一个光标,然后检查修改。4.仿真运行效果实验总结:图和程序都是网上找的。但是程序和实验箱又是不符合的。所以我们要烧进实验箱的程序还得重新调,重新改。有一个问题是个位显示的数字到9之后会显示一些符号,通过治疗查到,那些是LCD1602内部的显示,我们计数的显示只能选择前10个数字,所以在显示各位时,当秒计数应该求余数,显示十位时,应该求除数。另外还有一些小问题就是程序比较复杂,具体实现不太清楚。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1