单片机课程设计指导书 精品Word下载.docx
《单片机课程设计指导书 精品Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计指导书 精品Word下载.docx(35页珍藏版)》请在冰豆网上搜索。
//闹钟输出
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;
P0=0x40;
P2=0xDF;
P0=led[minit/10];
P2=0xEF;
P0=led[minit%10];
P2=0xF7;
P2=0xFB;
P0=led[second/10];
P2=0xFD;
P0=led[second%10];
P2=0xFE;
}
else
if(time_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour/10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
P0=led[hour%10];
P2=0xBF;
}
else
P0=led[hour/10];
P0=led[hour%10];
P0=0x40;
P2=0xDF;
if(time_cc==0x02)
P0=led[minit/10];
P2=0xEF;
P0=led[minit%10];
P2=0xF7;
P0=led[minit/10];
P0=led[minit%10];
P2=0xFB;
if(time_cc==0x03)
P0=led[second/10];
P2=0xFD;
P0=led[second%10];
P2=0xFE;
P0=led[second/10];
P0=led[second%10];
}
else
P0=led[hour1/10];
P0=led[hour1%10];
P0=led[minit1/10];
P0=led[minit1%10];
P0=led[second1/10];
P0=led[second1%10];
if(timer_cc==0x01)
P0=led[hour1/10];
P0=led[hour1%10];
P0=led[hour1/10];
P0=led[hour1%10];
if(timer_cc==0x02)
P0=led[minit1/10];
P0=led[minit1%10];
P0=led[minit1/10];
P0=led[minit1%10];
if(timer_cc==0x03)
P0=led[second1/10];
P0=led[second1%10];
P0=led[second1/10];
P0=led[second1%10];
}
voidkey_scan(void)
if(time==0)
for(i=0;
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)
display();
if(timer==0)
while(timer==0);
//数码管闪动显示
disp_ms=1;
//显示模式为闹钟时间
timer_cc++;
if(timer_cc==4)
timer_cc=0;
//闪动关闭
disp_ms=0;
//切换到时间模式
if(add==0)
}
if(add==0)
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;
case(0x03):
{second++;
if(second>
59)second=59;
default:
}
switch(timer_cc)
{if(hour1==23)hour1=23;
elsehour1++;
{if(minit1==59)minit1=59;
elseminit1++;
{if(second1==59)second1=59;
elsesecond1++;
break;
if(dec==0)
if(dec==0)
while(dec==0);
{if(hour==0)hour=0;
elsehour--;
{if(minit==0)minit=0;
elseminit--;
{if(second==0)second=0;
elsesecond--;
{if(hour1==0)hour1=0;
elsehour1--;
{if(minit1==0)minit1=0;
elseminit1--;
{if(second1==0)second1=0;
elsesecond1--;
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();
timer_alam();
//*********************************中断服务函数**************************************
voidtime0_int(void)interrupt1
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
TR1=1;
count1++;
if(count1==10)
count1=0;
disp_sdt=~disp_sdt;
}
7、硬件实现
选题二:
温度控制器的设计
主要实现功能:
通过温度传感器采集温度,与设定的上限和下限温度进行比较,当超出上下限时则报警并对应的指示灯亮,否则不报警,灯全灭。
具体要求:
1.报警器显示部分:
当前温度显示(1位小数),温度上限显示,温度下限显示(整数),通过按键三者切换显示
2.用DS16B20采集温度
3.温度上限和下限可以通过按键调整
4.当温度超过上限或者下限时报警器鸣叫,对应的超上限或下限灯点亮。
用DS16B20采集温度,STC89C52芯片P2.0—P2.3口控制数码管选通,P0口输出数值显示。
P3.5口输出电平驱动蜂鸣器做报警用,P2.4口和P2.7口控制两个发光二极管,代表温度超上限和查下限。
4、硬件电路图(protel99软件绘制)和仿真图(proteus软件与keil软件联调)
Protues图
Protel图
5.软件设计
reg52.h>
#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--)
125;
{}
//延时1ms子程序
voiddelay(uintz)
uintx,y;
for(x=z;
z>
0;
z--)
for(y=80;
y>
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
//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
i--)
{DQ=0;
//给