单片机实训内容1602的运用.docx
《单片机实训内容1602的运用.docx》由会员分享,可在线阅读,更多相关《单片机实训内容1602的运用.docx(12页珍藏版)》请在冰豆网上搜索。
![单片机实训内容1602的运用.docx](https://file1.bdocx.com/fileroot1/2022-12/8/e6b8682e-1999-417d-8cf7-9e7ac210c071/e6b8682e-1999-417d-8cf7-9e7ac210c0711.gif)
单片机实训内容1602的运用
课程设计报告
题目:
单片机课程设计
班级:
09级电子信息工程1班
姓名:
吴格
指导老师:
刘晓明
一、课程设计任务:
设计并制作运用单片机的电子时钟,并对其进行时
间的调试。
加强电子设计软件的运用。
学会运用1602液晶屏。
二、课程设计目的:
1、掌握单片机电子时钟的设计、组装和调试方法。
2、熟悉集成电路89C51的引脚安排。
3、了解电路结构及其接线方法。
三、电路的设计与分析
上图所示为产生五伏电压的电路图。
通过整流滤波所产生的5V电压供给单片机和显示器。
上图所示为单片机控制原理图电路,对单片机89c51写入程序。
进而进行显示时间和通过按钮调节输入的高低电平来调节时间的加减。
程序验证图
四、程序流程图
附录1602的程序:
主函数Main.c
#include
#include"clock.h"
main()
{
lcd_init();
T0_init();
while
(1)
{
CharToAscii();
display();
KeyScan();
}
}
voidT0_ISR()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ucCount_ms++;
if(ucCount_ms==10)
flag_flash=0;
if(ucCount_ms>=20)
{
ucCount_ms=0;
flag_flash=1;
SecondAdd();
}
}
副函数Clock.h
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
ucharCanl[16]={"2011-03-24"};
ucharTime[16]={"12:
30:
00"};
ucharucHour;
ucharucMinute;
ucharucSecond;
ucharucCount_ms;
ucharucWX=0;
bitflag_flash;
voiddelay(uintx)
{
while(x--);
}
voiddelay_ms(ucharx)
{
uchari;
while(x--)
{
for(i=0;i<125;i++);
}
}
voidwrcommand(uchartemp)
{
delay(300);
RS=0;
RW=0;
E=1;
P0=temp;
E=0;
}
voidwrdata(uchartemp)
{
delay(300);
RS=1;
RW=0;
E=1;
P0=temp;
E=0;
}
voidlcd_init()
{
wrcommand(0x01);
wrcommand(0x38);
wrcommand(0x06);
wrcommand(0x0c);
}
voidCharToAscii()
{
if(flag_flash)
{
Time[4]=ucHour/10+0x30;
Time[5]=ucHour%10+0x30;
Time[7]=ucMinute/10+0x30;
Time[8]=ucMinute%10+0x30;
Time[10]=ucSecond/10+0x30;
Time[11]=ucSecond%10+0x30;
}
else
{
switch(ucWX)
{
case1:
Time[4]='';
Time[5]='';
break;
case2:
Time[7]='';
Time[8]='';
break;
case3:
Time[10]='';
Time[11]='';
break;
}
}
}
voidlcd_string(uchar*p,ucharflag)
{
ucharaddr;
if(flag==1)
{
addr=0x80;
while(*p!
='\0')
{
wrcommand(addr);
wrdata(*p);
addr++;
p++;
}
}
if(flag==2)
{
addr=0xc0;
while(*p!
='\0')
{
wrcommand(addr);
wrdata(*p);
addr++;
p++;
}
}
}
voiddisplay()
{
lcd_string(Canl,1);
lcd_string(Time,2);
}
voidT0_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
voidHourAdd()
{
ucHour++;
if(ucHour>=24)
{
ucHour=0;
//DayAdd();
//WeekAdd();
}
}
voidHourDec()
{
if(ucHour==0)
ucHour=23;
else
ucHour--;
}
voidMinuteAdd()
{
ucMinute++;
if(ucMinute>=60)
{
ucMinute=0;
HourAdd();
}
}
voidMinuteDec()
{
if(ucMinute==0)
ucMinute=59;
else
ucMinute--;
}
voidSecondAdd()
{
ucSecond++;
if(ucSecond>=60)
{
ucSecond=0;
MinuteAdd();
}
}
voidSecondDec()
{
if(ucSecond==0)
ucSecond=59;
else
ucSecond--;
}
voidB_add()
{
switch(ucWX)
{
case1:
HourAdd();
break;
case2:
MinuteAdd();
break;
case3:
SecondAdd();
break;
}
}
voidB_dec()
{
switch(ucWX)
{
case1:
HourDec();
break;
case2:
MinuteDec();
break;
case3:
SecondDec();
break;
}
}
voidKeyScan()
{
ucharKeyValue;
P1=0xff;
KeyValue=P1;
if(KeyValue!
=0xff)
{
delay_ms(20);
P1=0xff;
KeyValue=P1;
if(KeyValue!
=0xff)
{
switch(KeyValue)
{
case0xfe:
ucWX++;
if(ucWX>=4)
ucWX=0;
break;
case0xfd:
B_add();
break;
case0xfb:
B_dec();
break;
case0xf7:
TR0=!
TR0;
break;
}
}
}
}
五、课程设计收获:
2周的课程设计快结束了,通过这次对数字电子钟的设计作,让我了解了电路设计的基本步骤,也让我了解了关于电子时钟的原理和设计理念。
电子课程设计是电类专业学生重要基础实践课是工科专业的必修课。
经过查资料、选方案、设计电路、撰写设计报告、使我得到一次较全面的实践训练。
理论联系实际,提高和培养创新能力,为后续课程的学习,打下基础。
并且在此次的单片机设计过程中,更进一步地熟悉了芯片的结构及掌握了芯片的工作原理和具体的使用方法。