
AT89c51LCD1602时钟设计c语言版.doc
5页液晶时钟设计一、实验目的1、学习 1602 液晶显示的原理2、掌握 1602 液晶时钟设计,为课程设计打基础二、实验预备知识LCD 本身不发光,是通过借助外界光线照射液晶材料而实现显示的被动显示器件可以显示各种文字、数字、图形LM016L 为字符型液晶显示器 LCD,其图形符号、引脚及属性如图所示引脚说明如下:①数据线 D7~D0②控制线(有 3 根:RS、RW、E)③1 根地线 Vss④两根电源线(V DD、V EE)LM016L 的属性设置如下:①每行的字符数为 16,行数为 2;②时钟为 250KHz;③行 1 的字符地址为 80H~8FH④行 2 的字符地址为 C0H~CFH LCD 图形符号和引脚三、实验内容液晶时钟电路原理图使用 LCD 显示两行字符,第一行正中间显示字符为“BeiJing Time”,第二行显示时钟四、程序设计步骤1、PROTEUS 电路设计 电路仿真原理图设计在 PROTEU ISIS 平台中进行1)新建设计文件菜单【file】/【New Design】,出现选择模板窗口,选中”DEFAULT” 模板,再单击”OK”按钮,在文件名框中输入文件名,单击”保存”按钮,则保存新建设计文件 ,其后缀自动为.DSN。
(2)从 PROTEUS 库中选取元器件单击“P”按钮,在其左上角“Keywords”(关键字)一栏中输入以下元器件的关键字,将以下元器件添加到对象选择器中①AT89C51:单片机②RES:电阻③LM0160L:16×2 字符 LCD 显示器④CAP、CAP-ELEC:电容、电解电容⑤CRYSTAL:晶振(3)放置元器件:按照原理图合理放置元器件4)放置电源和地(终端)单击工具栏中的 终端按钮,在对象选择器中选取电源(POWER)、地(GROUND), 用上述放置元器件方法分别放置于编辑区中5)电路图连线系统默认自动扑捉 和自动布线 有效只要在两端点相继单击,便可画线画折线,在拐弯处单击;若中途想取消,可右双击或按“Esc”;若终点在空白初,左双击即可结束6)设置、修改元器件的属性先右击后左击各器件,在弹出的属性编辑框中设置、修改它的属性7)电气检测选择【Tools】/【Electrical Rule Check】菜单项,出现电气检查报告单,无错误,则用户可执行下一步2、源程序设计、生成目标代码文件在 Kile 软件中第一步:建立一个工程项目文件执行菜单【Project 】/【New project 】,给项目文件取名并保存,选择单片机型号为AT89C51;第二步:选择目标器件右键 Target1-Options for Target“ Target1”或选择【 Project】/ 【Options for Target“Target1” 】对选项卡进行设置,在“Output”选项卡,选中“Create HEX File”;第三步:新建一个源程序文件在菜单 File/New 编辑窗口中输入源程序,在菜单 File/Save 中保存源程序文件,文件后缀为.c;显示程序参考实验 9,以下程序供参考:void main() //主函数{unsigned char i;P1=0xff; // 送全 1 到 P0 口int1(); // 初始化 LCDTMOD=0x01; //使用定时器 T0 的模式 1TH0=(65536-50000)/256; //定时器 T0 的高 8 位设置初值TL0=(65536-50000)%256; //定时器 T0 的低 8 位设置初值EA=1; //开总中断ET0=1; //定时器 T0 中断允许TR0=1; //启动定时器 T0count=0; //中断次数初始化为 0s=0; //秒初始化为 0m=0; //分钟初始化为 0h=0; //小时初始化为 0lcd_w_cmd(0x83); //写地址,从第 1 行第 4 列开始显示i=0; //从字符数组的第 1 个元素开始显示while(string[i]!='\0') //只要没有显示到字符串的结束标志'\0',就继续{lcd_w_dat(string[i]); //将第 i 个字符数组元素写入 LCDi++; //指向下一个数组元素}lcd_w_cmd(0xc6); //写地址,将第二个分号显示在第 2 行第 7 列lcd_w_dat(':'); //将分号的字符常量写入 LCDlcd_w_cmd(0xc9); //写地址,将第二个分号显示在第 2 行第 10 列lcd_w_dat(':'); //将分号的字符常量写入 LCD while(1){DisplayHour(); //显示小时delay1(); //给硬件一点反应时间DisplayMinute(); //显示分钟delay1(); //给硬件一点反应时间DisplaySecond(); //显示秒delay1(); //给硬件一点反应时间}}void Time0(void ) interrupt 1 using 1 //定时器 T0 的中断编号为 1,使用第 1 组工作寄存器{count++; //每产生 1 次中断,中断累计次数加 1if(count==20) //如果中断次数计满 20 次{count=0; //中断累计次数清 0s++; //秒加 1 }if(s==60) //如果计满 60 秒{s=0; //秒清 0m++; //分钟加 1}if(m==60) //如果计满 60 分{m=0; //分钟清 0 h++; //小时加 1}if(h==24) //如果计满 24 小时{h=0; //小时清 0}TH0=(65536-50000)/256; //定时器 T0 高 8 位重新赋初值TL0=(65536-50000)%256; //定时器 T0 低 8 位重新赋初值} void DisplayHour(){unsigned char i,j;i=h/10; //取整运算,求得十位数字j=h%10; //取余运算,求得各位数字lcd_w_cmd(0xc4); //写显示地址,将十位数字显示在第 2 行第 5 列lcd_w_dat(digit[i]); //将十位数字的字符常量写入 LCDlcd_w_dat(digit[j]); //将个位数字的字符常量写入 LCD}void DisplayMinute(){unsigned char i,j;i=m/10; //取整运算,求得十位数字j=m%10; //取余运算,求得各位数字lcd_w_cmd(0xc7); //写显示地址,将十位数字显示在第 2 行第 8 列lcd_w_dat(digit[i]); //将十位数字的字符常量写入 LCDlcd_w_dat(digit[j]); //将个位数字的字符常量写入 LCD}void DisplaySecond(){unsigned char i,j;i=s/10; //取整运算,求得十位数字j=s%10; //取余运算,求得各位数字lcd_w_cmd(0xca); //写显示地址,将十位数字显示在第 2 行第 11 列lcd_w_dat(digit[i]); //将十位数字的字符常量写入 LCDlcd_w_dat(digit[j]); //将个位数字的字符常量写入 LCD}第四步:把源程序文件添加到工程项目中单击工程项目【Target1】/【Source Group1】选择 Add File to Group Source Group1,选择文件类型,单击 Add 按钮,添加完毕,关闭窗口;第五步:源程序编译、生成目标代码文件选择【Project】/【Rebuild all target files】选项或单击工具栏中 按钮,如果编译成功,显示编译成功的信息,并生成目标代码文件,文件后缀.HEX。
3、PROTEUS 调试在 PROTEUS 软件中,将鼠标指向 AT89C51,先右击再左击,在此窗口中的“Program File”栏中,选择用 Kile 软件生成的.HEX 文件,单击“打开 ”按钮,完成添加文件在Clock Frequency 栏中把频率设定为 12MHz,单击“OK” 在 PROTEUS 软件中,按“运行”按钮进行仿真。












