51单片机报告文档.docx
- 文档编号:6423685
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:43
- 大小:196.63KB
51单片机报告文档.docx
《51单片机报告文档.docx》由会员分享,可在线阅读,更多相关《51单片机报告文档.docx(43页珍藏版)》请在冰豆网上搜索。
51单片机报告文档
1、课程设计目的1
2、课程设计题目和实现目标2
3、设计方案2
4、Proteus仿真原理图2
5、程序流程图3
6、程序代码4
7、调试总结65
8、设计心得体会65
9、参考文献67
1、课程设计目的
《MCS-51单片机》课程设计是与《MCS-51单片机》课程相配套的实践教学环节。
《MCS-51单片机》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。
培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1.单片机应用系统的总体方案的设计;
2.单片机应用系统的硬件设计;
3.单片机应用系统的软件程序设计;
4.单片机开发系统的应用和调试能力
2、课程设计题目和实现目标
题目:
关于智能电子钟设计
实现目标:
1.能正确显示日期、时间,并且可修改每个位;
2.具有闹铃的功能;
3.秒表功能;
4.液晶显示当前温度;
5.具有简易计算器功能。
3、设计方案
采用stc89c51单片机芯片,,ds1302,温度传感器都是18b20,蜂鸣器和键盘实现上面的功能。
4、Proteus仿真原理图
5、程序流程
Ds1302模块:
实现对该芯片的读写操作—液晶的显示模块—实现对ds1820的读写操作,并将温度值显示出来—正常显示时间模块和闹铃部分—秒表功能模块—闹钟时的按键功能及显示模块—正常显示时间的修改模块—计算器模块—主程序模块:
实现所有功能
6、程序代码
#include
#defineuintunsignedint//无符号整型定义
#defineucharunsignedchar//无符号字符型定义
#definew_Sec0x80//秒的lcd位置定义
#definew_Min0x82//分的lcd位置定义
#definew_Hou0x84//小时的lcd位置定义
#definew_Day0x86//日的lcd位置定义
#definew_Mou0x88//月的lcd位置定义
#definew_xi0x8a//星期的lcd位置定义
#definew_Yea0x8c//年的lcd位置定义
#definer_Sec0x81//设定秒的lcd位置定义
#definer_Min0x83//设定分的lcd位置定义
#definer_Hou0x85//设定小时的lcd位置定义
#definer_Day0x87//设定日的lcd位置定义
#definer_Mou0x89//设定月lcd位置定义
#definer_xi0x8b//设定星期的lcd位置定义
#definer_Yea0x8d//设定年的lcd位置定义
#definew_protect0x8e//DS1302写保护
sbitRS=P2^5;//1602指令数据端定义
sbitRW=P2^6;//1602读写端定义
sbitEN=P2^7;//1602使能端定义
sbitACC_7=ACC^7;//位寻址寄存器
sbitSCK=P3^5;//DS1302时钟信号
sbitSDA=P3^6;//DS1302数据信号
sbitRST=P3^4;//DS1302片选信号
sbitk1=P2^0;//P2端口定义
sbitk2=P2^1;
sbitk3=P2^2;
sbitk4=P2^3;
sbitk5=P2^4;
sbitk6=P3^0;
sbitk7=P3^1;
sbitk8=P3^2;
sbitalarm=P3^3;//闹钟输出定义
sbitDQ=P3^7;//DS18B20
ucharcodetable[]="00-00-00";//制作时间
ucharcodetime1[]="00:
00:
00";//时间模式1,用于普通计时
ucharcodetime2[]="00:
00:
00:
00";//时间模式2,用于秒表计时
ucharcodetime3[]="00:
00";//时间模式3,用于闹钟设置
ucharcodemiaobiao[]="StopWatch";//秒表英文显示
ucharcodenaozhong[]="Alarm";//闹钟英文显示
ucharcodexi1[]="Mon";//各星期的缩写
ucharcodexi2[]="Tue";
ucharcodexi3[]="Wed";
ucharcodexi4[]="Thu";
ucharcodexi5[]="Fri";
ucharcodexi6[]="Sat";
ucharcodexi7[]="Sun";
uchardatadisdata[5];
ucharcodetable1[]=
{
1,2,3,0x2b-0x30,
4,5,6,0x2d-0x30,
7,8,9,0x2a-0x30,
0,0x3d-0x30,0x01-0x30,0x2f-0x30
};
longa,b,c;
uchark=0,flag=0,num1,fuhao,i1;//全局变量
uinttvalue;//温度数值
uchartflag;//温度正负标志
uintcount,i,shi,fen,miao,haomiao,nian,yue,ri,num,x,menu,n,nshi=0,nfen=0;//nshi、nfen用来判别闹钟,与系统时间对比
ucharsshi,sfen,smiao,snian,syue,sri,sxi;//时间有关的变量
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//***************向DS1302写入一字节数据
voidWrite_1302(ucharaddress,uchardate)
{
unsignedchari;
SCK=0;//拉低时钟信号
RST=1;//使能端选通
//写入目标地址:
addr
for(i=0;i<8;i++)//传送一个字节共八个数据位
{
if(address&0x01)
{
SDA=1;//若最低位为1时上述表达式为真
}
else
{
SDA=0;//若最低位为0时上述表达式为假
}//最低位传送
SCK=1;//上升沿写数据
SCK=0;
address=address>>1;
}
//写入数据data
for(i=0;i<8;i++)
{
if(date&0x01)
{
SDA=1;
}
else
{
SDA=0;
}
SCK=1;
SCK=0;
date=date>>1;
}
RST=0;//停止DS1302总线
}
//*************************从DS1302读出一字节数据
ucharRead_1302(ucharaddress)
{
uchari;
uchartemp;
uchardat1=0;
uchardat2=0;
SCK=0;
RST=1;
for(i=0;i<8;i++)//写入目标地址:
addr
{
if(address&0x01)
{
SDA=1;
}
else
{
SDA=0;
}
SCK=1;
SCK=0;
address=address>>1;
}
for(i=0;i<8;i++)//输出数据:
temp
{
temp=temp>>1;
if(SDA)
{
temp|=0x80;
}
else
{
temp&=0x7F;
}
SCK=1;
SCK=0;
}
RST=0;//停止DS1302总线
dat2=temp/16;//BCD码到十进制的转换
dat1=temp%16;
dat1=dat2*10+dat1;
returndat1;//返回数据
}
/*****************************1602显示******************************************/
voidwrite_com(ucharcom)//1602控制字
{
RS=0;
P0=com;
EN=1;
delay(5);
EN=0;
}
voidwrite_date(uchardate)//1602显示字
{
RS=1;
P0=date;
EN=1;
delay(5);
EN=0;
}
voidwrite_sfm(ucharadd,uchardate)//1602显示时分秒
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_add(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_nyr(ucharadd,uchardate)//1602显示年月日
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_add(0x80+0x00+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_xi(uchara)//显示星期的子程序
{
write_add(0x80+0x00+11);
if(a==1)
{
for(i=0;i<3;i++)
{
write_date(xi1[i]);
delay(5);
}
}
if(a==2)
{
for(i=0;i<3;i++)
{
write_date(xi2[i]);
delay(5);
}
}
if(a==3)
{
for(i=0;i<3;i++)
{
write_date(xi3[i]);
delay(5);
}
}
if(a==4)
{
for(i=0;i<3;i++)
{
write_date(xi4[i]);
delay(5);
}
}
if(a==5)
{
for(i=0;i<3;i++)
{
write_date(xi5[i]);
delay(5);
}
}
if(a==6)
{
for(i=0;i<3;i++)
{
write_date(xi6[i]);
delay(5);
}
}
if(a==7)
{
for(i=0;i<3;i++)
{
write_date(xi7[i]);
delay(5);
}
}
}
voidwrite_fuhao(void)//写符号
{
write_add(0x80+0x00+2);//显示-
write_date(table[2]);
delay(10);
write_add(0x80+0x00+5);//显示-
write_date(table[2]);
delay(10);
write_add(0x80+0x40+2);//显示:
write_date(time1[2]);
delay(10);
write_add(0x80+0x40+5);//显示:
write_date(time1[2]);
delay(10);
}
/******************************ds1820程序***************************************/
voiddelay_18B20(uchari)//延时1微秒
{
while(i--);
}
voidds1820rst()//ds1820复位
{
ucharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()//读数据
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)//写数据
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()//读取温度值并转换
{
uchara,b;
ds1820rst();
ds1820wr(0xcc);//跳过读序列号
ds1820wr(0x44);//启动温度转换
ds1820rst();
ds1820wr(0xcc);//跳过读序列号
ds1820wr(0xbe);//读取温度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示子程序
{
ucharflagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:
-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
write_add(0x80+0x40+8);
write_date(flagdat);//显示符号位
write_add(0x80+0x40+9);
write_date(disdata[0]);//显示百位
write_add(0x80+0x40+10);
write_date(disdata[1]);//显示十位
write_add(0x80+0x40+11);
write_date(disdata[2]);//显示个位
write_add(0x80+0x40+12);
write_date(0x2e);//显示小数点
write_add(0x80+0x40+13);
write_date(disdata[3]);//显示小数位
write_add(0x80+0x40+14);
write_date(0xdf);//显示"。
"
write_add(0x80+0x40+15);
write_date(0x63);//显示"c"
}
voidSpeak1()//闹铃
{
alarm=0;
smiao=Read_1302(r_Sec);
sfen=Read_1302(r_Min);
sshi=Read_1302(r_Hou);
snian=Read_1302(r_Yea);
syue=Read_1302(r_Mou);
sri=Read_1302(r_Day);
sxi=Read_1302(r_xi);
write_fuhao();
write_sfm(0,sshi);
write_sfm(3,sfen);
write_sfm(6,smiao);
write_nyr(0,snian);
write_nyr(3,syue);
write_nyr(6,sri);
write_xi(sxi);
delay(500);
alarm=1;
delay(500);
}
voidSpeak2()
{
alarm=0;
delay(2000);
alarm=1;
}
voidNormal()//正常显示时间功能
{
smiao=Read_1302(r_Sec);
sfen=Read_1302(r_Min);
sshi=Read_1302(r_Hou);
snian=Read_1302(r_Yea);
syue=Read_1302(r_Mou);
sri=Read_1302(r_Day);
sxi=Read_1302(r_xi);//读取时间数据
if((nshi==sshi)&&(nfen==sfen))//闹钟铃响
{
for(i=0;i<10;i++)
{
Speak1();
}
while((k1==0||(k2==0)||(k3==0)||(k4==0)))//按下任意键,闹钟停止闹铃
{
alarm=1;
}
}
//关闭蜂鸣器
if((sshi==0||sshi==1||sshi==2||sshi==3||sshi==4||sshi==5||sshi==6||sshi==7
||sshi==8||sshi==9||sshi==10||sshi==11||sshi==12||sshi==13||sshi==14||sshi==15||sshi==16
||sshi==1||sshi==18||sshi==19||sshi==20||sshi==21||sshi==22||sshi==23)&&(sfen==0)&&(smiao==0))
{
Speak2();//整点报时
}
alarm=1;//关闭蜂鸣器
write_fuhao();
write_sfm(0,sshi);
write_sfm(3,sfen);
write_sfm(6,smiao);
write_nyr(0,snian);
write_nyr(3,syue);
write_nyr(6,sri);
write_xi(sxi);
}
voidStopWatch()//秒表功能
{
haomiao=0;
miao=0;
fen=0;
shi=0;
write_com(0x01);//清屏命令
write_com(0x0c);//写光标命令
write_com(0x80+0x00+0);
for(i=0;i<9;i++)
{
write_date(miaobiao[i]);
delay(5);
}
write_com(0x80+0x40+0);
for(i=0;i<11;i++)
{
write_date(time2[i]);
delay(5);
}
while(!
k4);//按键释放确认
while(k4!
=0)//再次确认释放
{
if(k1==0)
{
delay(10);//消抖
if(k1==0)
{
while(!
k1);
TR0=~TR0;
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
TR0=0;
haomiao=0;
miao=0;
fen=0;
shi=0;
writesfm(0,shi);//小时若变化则重新写入
writesfm(3,fen);//分钟若变化则重新写入
writesfm(6,miao);//秒若变化则重新写入
writesfm(9,haomiao);//毫秒若变化则重新写入
}
}
}
}
voidkey()//闹钟时的按键功能
{
if(k1==0)
{
delay(10);
if(k1==0)
{
n++;
while(!
k1);
if(n==1)
{
write_com(0x0f);
write_com(0x80+0x40+4);//写shi
}
if(n==2)
{
write_com(0x0f);
write_com(0x80+0x40+7);//写fen
}
if(n==3)
{
n=0;
nfen=fen;
nshi=shi;
write_com(0x0c);//光标不闪烁
}
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!
k2);
if(n==1)
{
shi++;
if(shi==24)
shi=0;
writesfm(4,shi);
}
if(n==2)
{
fen++;
if(fen==60)
fen=0;
writesfm(7,fen);
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
if(n==1)
{
shi--;
if(shi==-1)
shi=23;
writesfm(4,s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 报告 文档