单片机课程设计模版.docx
《单片机课程设计模版.docx》由会员分享,可在线阅读,更多相关《单片机课程设计模版.docx(13页珍藏版)》请在冰豆网上搜索。
单片机课程设计模版
单片机课程设计
姓名:
系别:
班级:
学号:
指导老师:
硬件设计方案
按键系统:
依据题目设计要求,共需要16个键盘,所以,为减轻硬件端口负担,采用4*4键盘排列方式,只需要8个端口,为方便使用扩展一块8255芯片。
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255三种工作方式如下:
方式0:
基本的输入输出方式,即无须联络就可以直接进行的I/O方式。
其中A、B、C口的高四位或低四位可分别设置成输入或输出。
方式1:
选通I/O,此时接口和外围设备需联络信号进行协调,只有A口和B口可以工作在方式1,此时C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有基本的I/O功能,即只工作在方式0.
方式2:
双向I/O方式,只有A口可以工作在这种方式,该I/O线即可输入又可输出,此时C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也可以和B口一起方式0的I/O线。
本设计中AT89C51和8255的接线如下:
8255A接口分配如下表:
PC0
PC1
PC2
PC3
PA4
0
1
2
3
PA5
4
5
6
7
PA6
8
9
A
B
PA7
C
D
E
F
键盘和8255接线如下图所示:
键盘工作原理:
判断键盘中有无键按下,将全部列线线PC口4位置低电平,然后检测行线PA口4位的状态。
只要有一行的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有行线均为高电平,则键盘中无键按下。
判断闭合键所在的位置,在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将列线置为低电平,PC0先为低电平,其他线为高电平,第一次扫描;PC1为低电平,其他线为高电平,第二次扫描,如此遍历,即在置某根列线为低电平时,其他线为高电平,在确定某根列线位置为低电平后,再逐行检测各行线的电平状态,若某行为低,则该列线与置为低电平的行线交叉处的按钮就是闭合的按键。
键盘扫描程序流程如图2
显示系统:
依据题目设计要求,共需要6个显示单元,所以,采用6个独立LCD显示单元,为节约通信端口,采用串口扩展为每个单元配备4094元件单元。
CD4094和74LS164是一个8位串行输入和并行输出的同步移位寄存器。
CD4094移位寄存器是从Q0移向Q7的,而串口送出的数据依次从低位到高位。
因而最后CD4094送出的代码:
QO(D7)、Q1(D6)、Q2(D5)、Q3(D4)、Q4(D3)、Q5(D2)、Q6(D1)、Q7(D0),所以与原来的共阴和共阳代码是相反的。
CD4094的2号脚为数据输入端(DATA)与RXD相连CD4094的3号脚为同步脉冲输入端(CLK)与TXD相连CD4094的1号脚为控制端,这里与P1.0相连。
若STB=0,则8位并行数据输出关闭,但允许串行数据从DATA输入;若STB=1,则DATA输入端关闭,但允许8位数据并行输出。
CD4094的15号脚为使能端(OE),高电平时CD4094才能工作。
CD4094的9号脚(QS)状态与Q7一样,但不受STB控制。
所以在传送数据时只要后极的DATA接前极的QS相接就可以了。
连线如下图:
显示单元如下所示:
(LCD采用的是7SEG-COM-CAT-GRN)
显示系统工作原理如下:
7SEG-COM-CAT-GRN表:
数值:
0
1
2
3
4
5
6
码值:
00H
01H
02H
03H
04H
05H
06H
数值:
7
8
9
A
B
C
D
码值:
07H
08H
09H
0AH
0BH
0CH
0DH
数值:
E
F
_
H
L
码值:
0EH
0FH
10H
11H
13H
工作流程:
6个显示单元(时—分)分别对应:
35H—30H地址每次把上面的码传给相应的单元,并调用显示程序:
DISP刷新LCD显示出相应值。
一:
硬件电路图
二、汇编程序清单
#include"reg51.h"
#include"absacc.h"
#defineucharunsignedchar
#definePAXBYTE[0x7cff]
#definePBXBYTE[0x7dff]
#definePCXBYTE[0x7eff]
#defineP_8255XBYTE[0x7fff]
sbitP1_0=P1^0;
sbitP3_5=P3^5;
sbitP3_4=P3^4;
uchart0=16,t1=17,t2=18,t3=19,t4=20,t5=21;
ucharh=0,f=0,s=0,k=50,label=0,a=0;
ucharspSHOW[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xfc,0x1c,0x1c,0x9e,0x6e,0x10};
uchartimer[6]={0xfc,0xfc,0xfc,0xfc,0xfc,0xfc};
uchargetkey();
ucharkey=0;
voiddelay(inti);
voiddisplay();
//voidstartDisplay();
voidsetHour();
voidsetMinute();
voidsetSecond();
main()
{
TMOD=0x01;
EA=1;
ET0=1;
//TR0=1;
TH0=0x9d;
TL0=0x90;
SM0=0;
SM1=0;
P_8255=0x90;
while
(1)
{
key=getkey();
if(key<10)
{
if(label==0)
t0=key;
elseif(label==4)
t4=key;
elseif(label==2)
t2=key;
elseif(label==5)
t5=key;
elseif(label==3)
t3=key;
elseif(label==1)
t1=key;
}
switch(key)
{
case10:
setHour();break;
case11:
setMinute();break;
case12:
setSecond();break;
case13:
TR0=1;break;
case14:
TR0=0;break;
case15:
t0=0;t1=0;t2=0;t3=0;t4=0;t5=0;
h=0;f=0;s=0;k=50;
break;
default:
break;
}
delay(10);
display();
if(t0==0&&t5==0)
P3_5=~P3_5;
P3_4=~P3^4;
}
}
uchargetkey()
{
ucharj=0,l=0,m=0,key=0;
uchari=0;
PC=0x00;
if(PA!
=0xff)
{
delay(13);
}
PC=0x00;
if(PA!
=0xff)
{
l=0xf7;
m=PA;
m=m&0xf0;
//key=m;
PC=0xf7;
for(i=0;i<4;i++)
{
if(PA!
=0xff)
{
l=l&0x0f;
key=l+m;
break;
}
PC=PC>>1;
l=l>>1;
}
}
switch(key)
{
case0xee:
j=0;break;
case0xed:
j=1;break;
case0xeb:
j=2;break;
case0xe7:
j=3;break;
case0xde:
j=4;break;
case0xdd:
j=5;break;
case0xdb:
j=6;break;
case0xd7:
j=7;break;
case0xbe:
j=8;break;
case0xbd:
j=9;break;
case0xbb:
j=10;break;
case0xb7:
j=11;break;
case0x7e:
j=12;break;
case0x7d:
j=13;break;
case0x7b:
j=14;break;
case0x77:
j=15;break;
/*case0xef:
j=0;break;
case0xdf:
j=1;break;
case0xbf:
j=2;break;
case0x7f:
j=3;break;*/
default:
j=0xff;break;
}
returnj;
}
voiddisplay()
{
inti=0;
timer[0]=spSHOW[t0];
timer[1]=spSHOW[t1];
timer[2]=spSHOW[t2];
timer[3]=spSHOW[t3];
timer[4]=spSHOW[t4];
timer[5]=spSHOW[t5];
P1_0=0;
for(i=0;i<6;i++)
{
SBUF=timer[i];
while(!
TI);
TI=0;
}
P1_0=1;
}
voiddelay(inta)
{
inti,j;
for(i=0;ifor(j=0;j<200;j++);
}
voidtime()interrupt1
{
k--;
if(k==0){
s++;
t0=s%10;
t1=s/10;
k=1;
}
if(s==60)
{
s=0;
f++;
t2=f%10;
t3=f/10;
}
if(f==60)
{
f=0;
h++;
t4=h%10;
t5=h/10;
h=h%24;
}
TH0=0x9d;
TL0=0x90;
}
voidsetHour()
{a=a%2;//a作为区分小时的十位与各位,以下的a同理;
TR0=0;
//label=getKey();
if(a==0)
label=4;
else
label=5;
a++;
}
voidsetMinute()
{
a=a%2;
TR0=0;
if(a==0)
label=2;
else
label=3;
a++;
}
voidsetSecond()
{
a=a%2;
TR0=0;
if(a==0)
label=0;
else
label=1;
a++;
}
/*voidstartDisplay()
{
inti=0;
timer[0]=0x40;
timer[1]=0x76;
timer[2]=0x79;
timer[3]=0x38;
timer[4]=0x38;
timer[5]=0x3F;
P1_0=0;
for(i=0;i<6;i++)
{
SBUF=timer[i];
while(!
TI);
TI=0;
}
P1_0=1;
}*/
三丶课程设计的心得体会
这次单片机课程设计我们历时两个星期,经过这两个星期的实践和体验下来,它不仅仅让我们综合那些理论知识来运用到设计和创新,还让我们知道了一个团队凝聚在一起时所能发挥出的巨大潜能!
没想到这项看起来不需要多少技术的工作却是非常需要耐心和精力在两个星期后的今天我已明白课程设计对我来说的意义,它是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
最后,课程设计过程中得感谢涂老师对我们的鼓励和指导。