单片机课程设计指导书 精品.docx

上传人:b****3 文档编号:5053436 上传时间:2022-12-12 格式:DOCX 页数:35 大小:239.29KB
下载 相关 举报
单片机课程设计指导书 精品.docx_第1页
第1页 / 共35页
单片机课程设计指导书 精品.docx_第2页
第2页 / 共35页
单片机课程设计指导书 精品.docx_第3页
第3页 / 共35页
单片机课程设计指导书 精品.docx_第4页
第4页 / 共35页
单片机课程设计指导书 精品.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

单片机课程设计指导书 精品.docx

《单片机课程设计指导书 精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计指导书 精品.docx(35页珍藏版)》请在冰豆网上搜索。

单片机课程设计指导书 精品.docx

单片机课程设计指导书精品

选题一:

具有整点报时带闹钟时间可调的数字钟

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;//给

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1