单片机课程设计报告 精品.docx
《单片机课程设计报告 精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告 精品.docx(50页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告精品
前言
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各种分析仪)。
2.在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统。
例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
6.在各种大型电器中的模块化应用
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。
如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。
如:
音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。
在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
7.单片机在汽车设备领域中的应用
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器,GPS导航系统,abs防抱死系统,制动系统等等。
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
本次课程设计,主要学习单片机内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O、串行口通信等,实现键盘显示、电机控制应用等。
1.数码管显示系统
1.1.工作原理
利用动态显示方式实现在数码管上稳定显示123456。
1.2.硬件电路设计及描述
单片机、6位的7段数码管。
单片机的P1口输出相应的段码,P2口低6位选择相应的数码管。
硬件电路图如下。
1.3.软件设计流程及描述
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0x60,0xda,0xf2,0x66,0xb6,0xbe,};//数字1-6段码表
ucharcodeadress[]={0xfe,0xfd,0xf7b,0xf7,0xef,0xdf};//位码表
voiddelay(uintm)//延时程序
{
while(m--);
}
voidmain()
{
ucharm=0;
while
(1)//动态循环
{
if(m==6)
m=0;
P2=0xff;//数码管清零
P2=adress[m];//P2口输出位码,选择位
P1=table[m++];//P1输出段码,显示相应数字
delay(500);
}
}
1.4.综合调试结果分析与展示
动态显示的结果是静态的。
当动态循环一个一个数码管显示足够快的时候,由于视觉原因,看上去是同时显示的。
2.步进电机控制系统
2.1.工作原理
通过单片机的I/O口控制步进电机运转,实现正传和反转。
2.2.硬件电路设计及描述
单片机、74LS240、步进电机。
P0口的低4位送出励磁电平,74LS240作为驱动电路。
接线图如下。
2.3.软件设计流程及描述
#include
unsignedcharLvalue[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};
voiddelay()//延时程序
{
unsignedinti;
for(i=0;i<43000;i++);
}
voidmain()
{
unsignedcharm,n;
P0=0;//P0口清零
while
(1)
{
for(n=0;n<12;n++)//电机正转
{
for(m=0;m<8;m++)
{
P0=Lvalue[m];
delay();
}
}
for(n=0;n<12;n++)//电机反转
{
for(m=8;m>0;m--)
{
P0=Lvalue[m-1];
delay();
}
}
}
}
2.4.综合调试结果分析与展示
步进电机正转一会,然后反转一会。
3.直流电机PWM调速系统
3.1.工作原理
通过调节脉冲宽度,改变占空比,从而改变输出,达到改变直流电机转速的目的。
3.2.硬件电路设计及描述
单片机、ULN2003A、直流电机、12V电源。
单片机P1.7输出PWM波,经过ULN2003A驱动,加到直流电机上,改变PWM波占空比,即可改变输出电压平均值大小,从而改变电机转速。
接线图如下。
3.3.软件设计流程及描述
#include
#defineN6//N不能大于10
sbitP17=P1^7;//P1.7输出PWM波
unsignedchari=0;
voidmain()
{
TMOD=0x01;//定时器T0,方式1
TH0=0xd8;TL0=0xf0;//定时10ms产生中断
EA=1;ET0=1;TR0=1;//开启中断
P17=1;//先置高电平
while
(1);
}
voidtime0()interrupt1//中断程序
{
TH0=0xd8;TL0=0xf0;//重装初值
i++;
if(i==N)P17=0;//决定PWM波占空比
if(i==10)
{
P17=1;
i=0;
}
}
3.4.综合调试结果分析与展示
改变程序中N的值即可改变占空比进行调速。
4.点阵LED广告屏设计(题目4)
4.1.工作原理
16×16LED点阵由四块8×8LED点阵组成。
控制点阵的扫描显示,使16×16LED点阵循环显示汉字。
例如:
新年好,同学们好,欢迎您。
4.2.硬件设计电路及描述
单片机、4块74LS541、4块8×8LED。
P0口经74LS541驱动接前8行LED,P2口经驱动接后8行,P3口经驱动接前8列,P1口经驱动接后8列。
4.3.软件设计流程及描述
#include"sst89x5x4.h"
#include"hzdot1.h"//要显示的字模文件
#include
voidDelay(void)//延时程序
{
unsignedchari;
for(i=0;i<60;i++);
}
voidclear(void)//清屏
{
P3=0x00;//前8列
P1=0x00;//
P0=0xff;//
P2=0xff;//
}
voidmain(void)
{
unsignedcharScan=0xfe,i,j;
unsignedintcount=0;
clear();
while
(1)
{
for(i=0;i<50;i++)//每16行重复扫描50次
{
for(j=0;j<8;j++)
{
P0=Scan;//0--7行
P3=hzdot[count];//0--7列
P1=hzdot[count+1];//8--15列
count+=2;
Scan=_crol_(Scan,1);//行扫
Delay();
}
P0=0xff;
for(j=0;j<8;j++)
{
P2=Scan;//8--15行
P3=hzdot[count];
P1=hzdot[count+1];
count+=2;
Scan=_crol_(Scan,1);//行扫
Delay();
}
P2=0xff;
count-=32;
}
count+=2;//向上滚动一行
if(count==(192-32))count=0;
//最后一个字完全显示后,又从第一个字开始显示
}
}
字模文件"hzdot1.h"
unsignedcharcodehzdot[320]={
0x80,0x00,0x80,0x00,0xFE,0x3F,0xC0,0x01,0xA0,0x02,0x90,0x04,0x8C,0x18,0x83,0x60,
0xF0,0x07,0x00,0x02,0x00,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"李",0*/
0x10,0x00,0x90,0x3F,0x10,0x22,0x7E,0x22,0x10,0x22,0x10,0x29,0xFF,0x10,0x10,0x3F,
0x14,0x21,0x14,0x21,0x74,0x21,0x14,0x3F,0x14,0x00,0x1A,0x00,0xF2,0x7F,0x01,0x00,/*"超",1*/
0x80,0x00,0x40,0x00,0x20,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"自",2*/
0x08,0x02,0x08,0x04,0x08,0x04,0xC8,0x7F,0x5F,0x40,0x28,0x29,0x88,0x10,0x58,0x20,
0x0C,0x00,0x8B,0x3F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0xEA,0x7F,0x04,0x00,/*"控",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x42,0x42,0x42,0x42,0x42,
0x42,0x64,0x42,0x58,0x42,0x40,0x42,0x40,0x24,0x24,0x18,0x1C,0x00,0x00,0x00,0x00,/*"09",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x30,0x42,0x28,0x42,0x24,0x42,0x24,
0x42,0x22,0x42,0x22,0x42,0x7E,0x42,0x20,0x24,0x20,0x18,0x78,0x00,0x00,0x00,0x00,/*"04",5*/
};
4.4.综合调试结果分析及展示
16×16LED显示屏向上滚动显示“李超自控0904”6个字。
5.温度显示系统设计(题目6)
5.1.工作原理
1)利用数字温度传感器DS18B20,测量环境温度,并在二位LED数码管上显示实时温度值。
2)使用ADC0809通道IN1作为报警值输入。
按下S1键,CPU从IN1通道读入报警值显示在数码管上。
放开S1键时将此时的IN1采样值作为报警值。
使用S1设置高限报警温度值。
3)可以通过按键设定高限报警温度值和低限报警温度值。
当外界温度高于设定最高温度时,启动风扇降温:
发出短嘀报警声和光报警。
当外界温度低于指定最低温度时,发出长嘀报警声,并点亮报警指示灯。
低限报警温度值可用键盘设置。
5.2.硬件设计电路及描述
单片机,3个数码管,一个数字温度传感器DS18B20,红、绿led各一个,蜂鸣器,按键。
具体连线见后面结果展示。
5.3.软件设计流程及描述
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^0;
sbitred=P2^5;
sbitgreen=P2^6;
sbitfm=P2^7;
sbitfu=P0^7;
union{ucharc[2];uintx;}temp;
ucharflag;
uintcc;
voiddelay(uints)
{for(;s>0;s--);}
ucharreset()
{ucharp;
DQ=0;delay(50);
DQ=1;delay(3);
p=DQ;delay(25);
return(p);
}
ucharread_b()
{uchari;ucharvalue=0;
for(i=8;i>0;i--)
{value>>=1;DQ=0;DQ=1;delay
(1);
if(DQ)value|=0x80;delay(6);
}
return(value);
}
voidwrite_b(ucharval)
{uchari;
for(i=8;i>0;i--)
{DQ=0;DQ=val&0x01;delay(5);DQ=1;val=val/2;}
delay(5);
}
ucharread_temperature()
{reset();
write_b(0xCC);write_b(0x44);
reset();
write_b(0xCC);write_b(0xBE);
temp.c[1]=read_b();
temp.c[0]=read_b();
return(temp.x/2);
}
voids_p(ucharx,uchary)
{ucharcodevalue[10]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
P0=codevalue[x];
P1=codevalue[y];
if(flag==1)
{fu=1;}
}
voidmain()
{
red=0;green=0;
P0=0x00;
P1=0x00;
EA=1;
IT0=1;
EX0=1;
while
(1);
}
voidint_x0()interrupt0
{
ucharj;
uchara,b;
read_temperature();
cc=temp.c[0]*256+temp.c[1];
if(temp.c[0]>0xf8)
{flag=1;cc=~cc+1;}
cc=cc/16;
a=(int)cc%10;b=((int)cc/10)%10;
s_p(a,b);
if(cc>30)
{red=1;
for(j=0;j<3;j++)
{fm=0;delay(50000);
fm=1;delay(50000);
};
red=0;fm=1;
}
if(cc<0||flag==1)
{green=1;
for(j=0;j<5;j++)
{fm=0;delay(50000);};
green=0;fm=1;flag=0;
}
}
5.4.综合调试结果分析与展示
6.字符型LCD显示设计(题目7)
6.1.工作原理
1)在液晶显示器上显示字符串、数字等,并循环动态显示。
如显示“Happynewyear!
”
2)按下不同按钮,显示内容改变。
6.2.硬件设计电路及描述
单片机,LCD显示屏,按键控制显示内容。
具体接线见后面结果展示。
6.3.软件设计流程及描述
ORG0000H
LJMPMAIN
ORG0003H
LJMPLOOP2
ORG0030H
RSBITP3.5
RWBITP3.6
EBITP3.7
LCDEQUP1
MAIN:
ACALLINIT_LCD
SETBIT0
SETBEX0
SETBEA
LOOP1:
ACALLDELAY
MOVLCD,#81H
ACALLWR_COM
MOVDPTR,#LINE1
MOVR0,#6
ACALLDISP_LCD
ACALLDELAY
MOVLCD,#0C0H
ACALLWR_COM
MOVDPTR,#LINE2
MOVR0,#15
ACALLDISP_LCD
ACALLDELAY
ACALLCLS
JMPLOOP1
LOOP2:
ACALLCLS
MOVR3,#02H
LL2:
ACALLDELAY
MOVLCD,#80H
ACALLWR_COM
MOVDPTR,#LINE3
MOVR0,#16
ACALLDISP_LCD
ACALLDELAY
MOVLCD,#0C0H
ACALLWR_COM
MOVDPTR,#LINE4
MOVR0,#10
ACALLDISP_LCD
ACALLDELAY
ACALLCLS
DJNZR3,LL2
RETI
INIT_LCD:
MOVLCD,#00000001B
ACALLWR_COM
MOVLCD,#00111000B
ACALLWR_COM
MOVLCD,#00001111B
ACALLWR_COM
MOVLCD,#00000110B
ACALLWR_COM
RET
WR_COM:
CLRRS
CLRRW
CLRE
ACALLCHECK_BF
SETBE
RET
CHECK_BF:
MOVLCD,#0FFH
CLRRS
SETBRW
CLRE
NOP
SETBE
JBLCD.7,CHECK_BF
RET
WR_DATA:
SETBRS
CLRRW
CLRE
ACALLCHECK_BF
SETBE
RET
DISP_LCD:
MOVR1,#0
LOOP:
MOVA,R1
MOVCA,@A+DPTR
MOVLCD,A
INCR1
ACALLWR_DATA
DJNZR0,LOOP
RET
CLS:
MOVLCD,#00000001B
ACALLWR_COM
RET
DELAY:
MOVR5,#100
D1:
MOVR6,#100
D2:
MOVR7,#100
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
LINE1:
DB'Hello!
'
LINE2:
DB'WelcometoLCD!
'
LINE3:
DB'Nicetoseeyou!
'
LINE4:
DB'Goodluck!
'
END
6.4.综合调试结果分析与展示
循环显示内容:
按下键后显示内容如下:
7.数字钟设计(题目11)
7.1.工作原理
1)系统运行从00点00分00秒开始计时,并在六个数码管上动态显示时、分、秒当前值。
2)用键盘设置当前时间。
红色发光二极管是秒灯,每闪烁一次表示时间走动一秒钟。
绿色发光二极管是设置灯,当时间正常走动时此灯不亮,当第一次按下设置键时,设置灯亮,分钟的两位数码管出现闪烁,时间停止走动,进入校时状态,表示此时可以进行分钟的调整,当按一次加1键,可实现分钟加1功能。
如果再次按下设置键时,秒灯保持熄灭,设置灯保持点亮状态,表示分钟的数码管停止闪烁,表示小时的两位数码管则开始闪烁,此时可进行小时的调整,按加1键可实现小时的加1功能,小时调整以24为上限,超出24小时则重新回0。
当第三次按下设置键时,数码管停止闪烁,设置灯熄灭,秒灯重新闪烁,时间以设置值开始计时。
3)可以设置闹铃时间为:
07:
30:
00蜂鸣器发音。
7.2.硬件设计电路及描述
单片机,7段8位数码管,蜂鸣器作为闹铃发声,按键来设置时间。
具体接线见后面结果展示。
7.3.软件设计流程及描述
#include
unsignedcharcodecodevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedchardispbuf[8]={0,0,16,0,0,16,0,0};
unsignedchardispbitcnt=0;
unsignedcharmstcnt=0;
unsignedcharsecond;
unsignedcharminite;
unsignedcharhour;
unsignedin