单片机课程设计指导书 精品.docx
《单片机课程设计指导书 精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计指导书 精品.docx(35页珍藏版)》请在冰豆网上搜索。
![单片机课程设计指导书 精品.docx](https://file1.bdocx.com/fileroot1/2022-12/12/5864c4ea-3a38-4284-b944-77902a33999a/5864c4ea-3a38-4284-b944-77902a33999a1.gif)
单片机课程设计指导书精品
选题一:
具有整点报时带闹钟时间可调的数字钟
1、目的及意义
掌握单片机开发流程,能够独立完成单片机小系统的开发。
学会查找资料,设计硬件电路,编写相应软件,电路调试,撰写设计报告,提高分析问题、解决问题的能力,为以后就业打下坚实的专业基础。
2、任务要求
1.数字时钟显示:
小时(两位)分钟(两位)秒钟(两位)
2.时间可调,要求时、分、秒都可调
3.可以设定闹铃,当闹铃时间到,蜂鸣器发出闹铃声音。
4.具有整点报时功能。
3、设计思路
用内部定时器中断计时,三个两位数码管分别显示秒、分、时,STC89C52芯片P2口控制数码管选通,P0口输出数值显示。
P3.5口输出高低电平驱动蜂鸣器做闹钟用。
4、实现功能
主要通过单片机的内部定时器产生秒时基信号,实现电子时钟功能。
主要功能有:
时钟功能,闹钟功能,整点报时,闹钟报警,调时,调闹钟等。
5、硬件电路图(protel99软件绘制)和仿真图(proteus软件与keil软件联调)
硬件电路图
仿真图
6、软件设计
#include
#definetl0xba;
#defineth0x3c;
sbittime=P1^0;//时间设置
sbittimer=P1^1;//闹钟设置
sbitadd=P1^2;//加
sbitdec=P1^3;//减
sbitspeaker=P3^7;//闹钟输出
bitdisp_sd;//数码管闪动显示标志位
bitdisp_ms;//数码管显示时间/闹钟标志位
bitdisp_sdt;//数码管闪动间隔反转标志位
unsignedcharcodeled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字0-9的编码
unsignedchartime_cc,timer_cc;//调时计数器
unsignedcharcount0,count1,second,minit,hour;//时间时分秒
unsignedcharsecond1,minit1,hour1;//闹钟时分秒
voiddelay(void)
{
unsignedinti;
for(i=0;i<100;i++);
}
voiddisplay(void)
{
if(disp_ms==0)
{
if(disp_sd==0)
{
P0=led[hour/10];
P2=0x7F;
delay();
P2=0xFF;
P0=led[hour%10];
P2=0xBF;
delay();
P2=0xFF;
P0=0x40;
P2=0xDF;
delay();
P2=0xFF;
P0=led[minit/10];
P2=0xEF;
delay();
P2=0xFF;
P0=led[minit%10];
P2=0xF7;
delay();
P2=0xFF;
P0=0x40;
P2=0xFB;
delay();
P2=0xFF;
P0=led[second/10];
P2=0xFD;
delay();
P2=0xFF;
P0=led[second%10];
P2=0xFE;
delay();
P2=0xFF;
}
else
{
if(time_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour/10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour%10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
}
else
{
P0=led[hour/10];
P2=0x7F;
delay();
P2=0xFF;
P0=led[hour%10];
P2=0xBF;
delay();
P2=0xFF;
}
P0=0x40;
P2=0xDF;
delay();
P2=0xFF;
if(time_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit/10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit%10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
}
else
{
P0=led[minit/10];
P2=0xEF;
delay();
P2=0xFF;
P0=led[minit%10];
P2=0xF7;
delay();
P2=0xFF;
}
P0=0x40;
P2=0xFB;
delay();
P2=0xFF;
if(time_cc==0x03)
{
if(disp_sdt==1)
P0=led[second/10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second%10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
}
else
{
P0=led[second/10];
P2=0xFD;
delay();
P2=0xFF;
P0=led[second%10];
P2=0xFE;
delay();
P2=0xFF;
}
}
}
else
{
if(disp_sd==0)
{
P0=led[hour1/10];
P2=0x7F;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xBF;
delay();
P2=0xFF;
P0=0x40;
P2=0xDF;
delay();
P2=0xFF;
P0=led[minit1/10];
P2=0xEF;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xF7;
delay();
P2=0xFF;
P0=0x40;
P2=0xFB;
delay();
P2=0xFF;
P0=led[second1/10];
P2=0xFD;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0xFE;
delay();
P2=0xFF;
}
else
{
if(timer_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour1/10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour1%10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
}
else
{
P0=led[hour1/10];
P2=0x7F;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xBF;
delay();
P2=0xFF;
}
P0=0x40;
P2=0xDF;
delay();
P2=0xFF;
if(timer_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit1/10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit1%10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
}
else
{
P0=led[minit1/10];
P2=0xEF;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xF7;
delay();
P2=0xFF;
}
P0=0x40;
P2=0xFB;
delay();
P2=0xFF;
if(timer_cc==0x03)
{
if(disp_sdt==1)
P0=led[second1/10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second1%10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
}
else
{
P0=led[second1/10];
P2=0xFD;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0xFE;
delay();
P2=0xFF;
}
}
}
}
voidkey_scan(void)
{
unsignedinti;
if(time==0)
{
for(i=0;i<10;i++)
display();
if(time==0)
{
TR0=0;
do
display();
while(time==0);
disp_sd=1;
disp_ms=0;
time_cc++;
if(time_cc==4)
{
TR0=1;
time_cc=0;
disp_sd=0;
}
}
}
if(timer==0)
{
for(i=0;i<10;i++)
{
display();
}
if(timer==0)
{
do
display();
while(timer==0);
disp_sd=1;//数码管闪动显示
disp_ms=1;//显示模式为闹钟时间
timer_cc++;
if(timer_cc==4)
{
timer_cc=0;
disp_sd=0;//闪动关闭
disp_ms=0;//切换到时间模式
}
}
}
if(add==0)
{
for(i=0;i<10;i++)
{
display();
}
if(add==0)
{
do
display();
while(add==0);
if(disp_ms==0)
{
switch(time_cc)
{
case(0x01):
{hour++;if(hour>23)hour=23;break;}
case(0x02):
{minit++;if(minit>59)minit=59;break;}
case(0x03):
{second++;if(second>59)second=59;break;}
default:
break;
}
}
else
{
switch(timer_cc)
{
case(0x01):
{if(hour1==23)hour1=23;elsehour1++;break;}
case(0x02):
{if(minit1==59)minit1=59;elseminit1++;break;}
case(0x03):
{if(second1==59)second1=59;elsesecond1++;break;}
default:
break;
}
}
}
}
if(dec==0)
{
for(i=0;i<10;i++)
{
display();
}
if(dec==0)
{
do
display();
while(dec==0);
if(disp_ms==0)
{
switch(time_cc)
{
case(0x01):
{if(hour==0)hour=0;elsehour--;break;}
case(0x02):
{if(minit==0)minit=0;elseminit--;break;}
case(0x03):
{if(second==0)second=0;elsesecond--;break;}
default:
break;
}
}
else
{
switch(timer_cc)
{
case(0x01):
{if(hour1==0)hour1=0;elsehour1--;break;}
case(0x02):
{if(minit1==0)minit1=0;elseminit1--;break;}
case(0x03):
{if(second1==0)second1=0;elsesecond1--;break;}
default:
break;
}
}
}
}
}
voidtimer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0))//正常运行时间的状态下
{
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
}
}
//******************************主函数*************************************************
voidmain(void)
{
second=0x00;//时间初始化为12:
00:
00
minit=0x00;
hour=12;
count0=0x00;
count1=0x00;
P1=0xFF;
TMOD=0x11;
TL0=tl;
TH0=th;
TL1=tl;
TH1=th;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while
(1)
{
key_scan();
display();
timer_alam();
}
}
//*********************************中断服务函数**************************************
voidtime0_int(void)interrupt1
{
TL0=tl;
TH0=th;
TR0=1;
count0++;
if(count0==20)
{
count0=0;
second++;
if(second==60)
{
second=0;
minit++;
if(minit==60)
{
minit=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
//*********************************中断服务函数**************************************
voidtime1_int(void)interrupt3
{
TL1=tl;
TH1=th;
TR1=1;
count1++;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
7、硬件实现
选题二:
温度控制器的设计
1、目的及意义
掌握单片机开发流程,能够独立完成单片机小系统的开发。
学会查找资料,设计硬件电路,编写相应软件,电路调试,撰写设计报告,提高分析问题、解决问题的能力,为以后就业打下坚实的专业基础。
2、任务要求
主要实现功能:
通过温度传感器采集温度,与设定的上限和下限温度进行比较,当超出上下限时则报警并对应的指示灯亮,否则不报警,灯全灭。
具体要求:
1.报警器显示部分:
当前温度显示(1位小数),温度上限显示,温度下限显示(整数),通过按键三者切换显示
2.用DS16B20采集温度
3.温度上限和下限可以通过按键调整
4.当温度超过上限或者下限时报警器鸣叫,对应的超上限或下限灯点亮。
3、设计思路
用DS16B20采集温度,STC89C52芯片P2.0—P2.3口控制数码管选通,P0口输出数值显示。
P3.5口输出电平驱动蜂鸣器做报警用,P2.4口和P2.7口控制两个发光二极管,代表温度超上限和查下限。
4、硬件电路图(protel99软件绘制)和仿真图(proteus软件与keil软件联调)
Protues图
Protel图
5.软件设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbits2=P1^1;
sbits3=P1^2;
sbits4=P1^3;
sbitled1=P2^0;
sbitled2=P2^1;
sbitled3=P2^2;
sbitled4=P2^3;
sbitdot=P0^7;
sbitbebe=P3^5;
sbitbaowen=P2^4;
sbitjiawen=P2^7;
#definetime0x8E
ucharcodedis[]={0x3F,0X06,0X5b,0X4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0X63,0X39,0X01,0X08};
//共阴数码管"0-9","灭","-"编码
ucharsav1,fav1,bai,qin,f2,tval,tge,
tshi,tbai,mak,HTEMP,LTEMP,va1,mge,mshi,
fge,fshi,temp_high,temp_low,set1,set2;
uintfinal_temp;
uinttvalue;
uchartflag;//温度正负标志
sbitDQ=P3^4;
voiddelayMs(uinta);
voidtimeset();
voidsetdsplay2();
voiddelayus(ucharx)
{
while(x--);
}
voiddelay_long(uintx)
{
uinti;
while(x--)
{
for(i=0;i<125;i++)
{}
}
}
//延时1ms子程序
voiddelay(uintz)
{
uintx,y;
for(x=z;z>0;z--)
for(y=80;y>0;y--);
}
//***********************************************************************
/******************************ds1820程序***************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(70);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给