单片机综合课程设计.docx
《单片机综合课程设计.docx》由会员分享,可在线阅读,更多相关《单片机综合课程设计.docx(13页珍藏版)》请在冰点文库上搜索。
![单片机综合课程设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/5645fee5-f85d-4ca7-91aa-f654c84d7f76/5645fee5-f85d-4ca7-91aa-f654c84d7f761.gif)
单片机综合课程设计
杭州电子科技大学信息工程学院
单片机课程设计报告
(电气工程与自动化专业)
姓名:
班级:
学号:
指导教师:
2011年10月14日
Ø一引言
单片机课程设计是一项综合性的专业实践的活动,基本任务是利用STC12C5A08S2单片机等电子元器件设计一个具有温度测量、显示和控制的装置。
通过本课程综合应用所学知识,分析和解决工程实际问题的能力,将所学的基础理论和专业知识运用到具体的工程实践中去。
培养学生的实际动手能力和工程实践能力,为此后的毕业设计打下良好的基础。
Ø二硬件设计
v1数码管显示
图1
此数码管为共阴极数码管,其8个发光二极管的阴极在数码管内部全部连接在一起,它们的阳极是独立的,通常在设计电路时一般把阴极接地。
数码管的显示方法静态显示。
当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那它们显示的数字必定一样。
图1中的三极管9013的起到开关“位选”的作用,
当三极管导入高电平的时候,相对应的数码管发光。
v22*2矩阵键盘
图2
矩阵键盘的两端都与单片机I/O口相连,因此检测时给单片机I/O口送入低电平。
检测时,先送一列为低电平,其余几列全为高电平,然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平则我们便可确认当前被按下的键是哪一行那一列,用同样的方法轮流送各列一次低电平,轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。
图2中二极管IN4148检测是否有按键按下。
v3测温电路
图3
图3中的电容用来滤波的作用。
R120滑动变阻器用来调节A/D采样值的变化。
AT502热敏电阻。
v4蜂鸣器
试验采用无源蜂鸣器,通过输入震荡电流,是蜂鸣器达到蜂鸣的效果,在本次使用的期间中,对P14管脚加入震荡电流,便可以达到试验效果
v5.整个原理图
Ø三软件部分
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitshuma2=P2^6;
sbitshuma1=P2^7;
sbitshuma3=P2^5;
sbitshuma4=P2^4;
sbitadwr=P3^6;
sbitadrd=P3^7;
sbitbeep=P1^4;
sbitdat=P1^1;
sbitwarm=P1^3;
sbitled=P2^0;
uintwendu=25,numt0=0,cede=0,bzflag=0,flag=1;
/*--定义数码管显示的0~9,10个数据--*/
unsignedcharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*--单片机初始化函数,对定时器进行设置,开总中断,开定时器中断,开定时器--*/
/*--入口参数:
无
----出口参数:
无--*/
voidinit()
{
TMOD=0x01;
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
EA=1;
ET0=1;
TR0=1;
}
/*--延时函数,通过for循环函数实现延时功能--*/
/*--入口参数:
uint;
----出口参数:
无---*/
voiddelayms(uintxms)
{
uinti,j;
for(i=0;ifor(j=0;j<110;j++);
}
/*--显示函数,利用2个全局变量对他们求余和求商,用于表示检测的温度的十位和个位,及设定温度的十位和个位
----入口参数:
无
----出口参数:
无---*/
voiddisplay()
{
ucharshi=wendu/10;
ucharge=wendu%10;
ucharcge=cede%10;
ucharcsh=cede/10;
P2=0x10;
P0=table[ge];
delayms
(2);
P2=0x20;
P0=table[shi];
delayms
(2);
P2=0x40;
P0=table[cge];
delayms
(2);
P2=0x80;
P0=table[csh];
delayms
(2);
P2=0x00;
}
/*--键盘检测函数,对2*2矩阵键盘进行设定,分别为温控开关及设定温度加减
----入口参数:
无
----出口参数:
无--*/
voidkeyscan()
{
uchartemp;
P3=0x70;
if(P3==0x60)
{
delayms(10);
if(P3==0x60)
{
if(wendu!
=0)
wendu--;
}
temp=P3&0x30;
while(temp!
=0x30)
temp=P3&0x30;
}
if(P3==0x50)
{
delayms(10);
if(P3==0x50)
{
if(wendu!
=99)
wendu++;
}
temp=P3&0x30;
while(temp!
=0x30)
temp=P3&0x30;
}
P3=0xb0;
if(P3==0xa0)
{
delayms(10);
if(P3==0xa0)
{
flag=0;
warm=0;
}
temp=P3&0x30;
while(temp!
=0x30)
temp=P3&0x30;
}
if(P3==0x90)
{
delayms(10);
if(P3==0x90)
{
flag=1;
}
temp=P3&0x30;
while(temp!
=0x30)
temp=P3&0x30;
}
}
/*--蜂鸣器函数,当蜂鸣器标志位打开时,进入函数发出声音
----入口参数;无
----出口参数:
无--*/
voidbuzzer()
{
if(!
bzflag)
{
uinti=2000;
for(;i>0;i--)
{
beep=1;
delayms
(1);
beep=0;
}
}
}
/*--温度检测函数,利用温度传感器,来检测温度
----入口参数:
无
----出口参数:
无--*/
voidcheck()
{
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;
adrd=1;
_nop_();
adrd=0;
_nop_();
cede=dat;
adrd=1;
if(cede<=(wendu-5))
{
warm=1;
buzzer();
led=1;
bzflag=1;
}
if(cede>=wendu)
{
warm=0;
bzflag=0;
led=0;
}
}
/*--定时器函数--*/
voidT0_time()interrupt1
{
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
if(flag)
{
display();
}
}
/*--主函数--*/
voidmain()
{
init();
while
(1)
{
keyscan();
if(flag)
{
check();
}
}
}
Ø四总结
本次短学期的内容是是设计温度控制器。
经过半个多月的构思,设计到最后的实践,遇到不少困难,所以结果也有很多瑕疵。
不过过程是蛮有意义的,从数码管显示到矩阵键盘的控制再到温度的读取与显示,无不遇到困难并解决之。
下面把主要遇到困难的经历说一下。
首先是数码管显示问题。
由于我们之前所学的是89C51单片机,与这次所实践的板不同,虽然感觉这板更简单,但毕竟不是很专业,依然使用原来学过的程序,结果当然不能运行。
后来仔细研究了原理图,发现端口就不一样,还有STC12C5A08S2没有锁存器,于是按照原理图先定义好每一位选端口,因为此单片机默认的是高电平,所以先把四个位先置底,然后按照原来的思路就可以进行下去了。
还有就是矩阵键盘调试过程中,对P3口的赋值要注意,因为要跟C51的高低电平刚好相反。
最遗憾的是用一个按钮作为开关机键这一过程还没有实现,总觉得程序没有什么错,是不是板子的缘故就不知道了(据说这些板子汗的不是很好)。
这可以说是一个工程,一个不小的工程。
这不但是一次对我们知识的检验,还是一次温故而知新的过程。
实践的机会少之又少,抓好一次就是一次进步,而且亲自实践过才能更好的,更深刻的掌握。