单片机课设完整的.docx
《单片机课设完整的.docx》由会员分享,可在线阅读,更多相关《单片机课设完整的.docx(26页珍藏版)》请在冰豆网上搜索。
单片机课设完整的
福州大学至诚学院
《单片机原理及应用》
课程设计
题目抢答器
姓名:
金鑫―
学号:
210992115
系别:
电气工程与自动化系
专业:
电气工程及其自动化
年级:
2009
起讫日期:
2011.12.12~2011.12.23
指导教师:
张丽萍
第1章课程设计目的,题目和目标以及设计方案1
1.1课程设计目的1
1.2课程设计题目和实现目标1
1.3设计方案1
1.3.1设计思路2
1.3.2器件功能说明2
1.3.3AT89C512
1.3.4振荡器特性5
第2章Proteus仿真原理图6
第3章程序流程图7
第4章程序代码8
第5章调试总结和心得体会18
参考文献20
第1章课程设计目的,题目和目标以及设计方案
1.1课程设计目的
《单片机原理及应用》课程设计是与《单片机原理及应用》课程相配套的实践教学环节。
《单片机原理及应用》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。
培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1、单片机应用系统的总体方案的设计;
2、单片机应用系统的硬件设计;
3、单片机应用系统的软件程序设计;
4、单片机开发系统的应用和调试能力。
1.2课程设计题目和实现目标
课程设计题目:
用串行AD芯片PCF8591T寸正弦波、三角波、方波进行采样。
实现目标:
(1)能输出3种波形的瞬时值、峰值、平均值。
(2)精度为0.01V
(3)所采样的值能在LCD1602上显示;
(4)幅值可以在0~5V任意调节;
(5)频率可以在0~1KHz任意调节;
(6)根据开发板原理图接线,并且上电可以运行。
1.3设计方案
主要由四个模块组成:
(1)控制模块:
使用STC89C52乍为主控制器。
(2)液晶显示模块:
使用双行16*2显示的LCD1602做显示模块;
(3)AD采样模块:
使用8位逐次逼近AD转换器PCF8591T芯片。
PCF8591T芯片性价比很高,可达到精度8位的精度,即最小分辨率可达0.01V,幅值采样范围为(0,+5)V,工作电压范围为(+2,+6)V。
(4)键盘模块:
选用3个独立按钮作为3种波形的切换。
1.3.1设计思路
设计思路:
首先确定课程设计的目标是设计一个键盘控制波形模式,由单片机和AD
转换器及其它相关部件共同实现。
根据所要实现的功能,先在proteus软件上仿真。
根
据所选用的硬件可以将整个软件设计分为若干子程序,有初始化、查询时间、发送指令、
读取数据、显示电压等构成,可以将以上子程序分别设计,实现各自的功能,再在子程序中调用,就可以实现预期的目标,在protues软件里画出相应的电路图,将编写好的程序导入到软件里进行仿真,对仿真中波形发生器设置不同频率和幅值,看是否达到了设计的要求,若仿真成功,就按照电路图进行开发板实物连接。
采用一个AD转换器PCF8591T和单片机控制,可以通过液晶显示屏直接读取被采样的瞬时值,在通过比较取得最大值(即幅值),
1.3.2器件功能说明
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATME高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATME的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
DS18B2C是DALLAS^司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为—55E〜+125C,可编程为9位〜12位A/D转换精度,测温分辨率可达0.0625C。
主机控制DS18B2C完成温度转换必须经过三个步骤:
初始化、ROM操作指令、存储
器操作指令。
必须先启动DS18B20开始转换,再读出温度转换值。
本程序仅挂接一个芯片,使用默认的12位转换精度,外接供电电源,读取的温度值高位字节送WDMS单元,低位
字节送WDLS单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值。
按键扫描子程序对数字温度计的K1~K3键进行扫描,得到键值完成相应操作。
按下K1键设定温度报警值,调整TH的设定值,再次按下K1键调整TH的设定值,K2键减少温度值,K3键增加温度值。
设定过程中可以通过按键K2,K3来决定是增还是减调整,按下K1
键将设定的温度报警值写入DS18B20设定完毕,将温度报警值写入DS18B20勺E2ROM中保存,每次开机时自动从DS18B2C中读出温度报警值。
当实测温度超过设定温度限制范围时,发出声光报警信号,喇叭发出鸣响,LED灯关
闪烁。
1.3.3AT89C51
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPERO—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS位微处
理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单
片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEI高密度
非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于
将多功能8位CPI和闪烁存储器组合在单个芯片中,ATME的AT89C51是一种高效微控
制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图1-2所示。
图1-2AT89C51单片机管脚结构图
VCC供电电压
GND接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收
输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验
时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输
出4个TTL门电流,当P2口被写“T时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上
拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,
P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH
编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INTO(外部中断0)
P3.3/INT1(外部中断1)
P3.4TO(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平
时间。
ALE/PROG当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地
位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的
频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出
的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一
个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVXMOVC旨令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将
不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),
不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET当/EA
端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加
12V编程电源(VPF)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
1.3.4振荡器特性
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
第2早Proteus仿真原理图
第3章程序流程图
第4章程序代码
4.1程序代码
#include
#inelude"DS18B20.h"
#defineuintunsignedint
#defineucharunsignedchar
#defineSETP3_1
#defineDECP3_2
#defineADDP3_3
#defineBEEPP2_7
bitshanshuo_st;
bitbeep_st;
sbitDIAN=P0A7;
ucharx=0;
signedcharm;
ucharn;
ucharset_st=0;
signedcharshangxian=28;
signedcharxiaxian=10;
uncharcodeLED
Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
voidDelay(uintnum)
{
while(--num);
}
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;
}
voidtimer0(void)interrupt1
{
TH0=0x3c;
TLO=OxbO;
x++;
}
voidintO(void)interrupt0
{
EX0=0;
if(DEC==0)
{
Delay(2000);
while(!
DEC);
if(set_st==1)
{
shangxian--;
if(shangxianelseif(set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
}
voidint1(void)interrupt2
{
EX仁0;
if(ADD==0)
{
Delay(2000);
while(!
ADD);
if(set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
elseif(set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
}
}
}
voidcheck_wendu(void)
{
uinta,b,c;
c=ReadTemperature()-5;
a=c/100;
b=c/10-a*10;
m=c/10;
n=c-a*100-b*10;
if(m<0){m=0;n=0;}
if(m>99){m=99;n=9;}
}
Disp_init()
{
P0=~0xbf;
P2=~0xf7;
Delay(200);
P2=~0xfb;
Delay(200);
P2=~0xfd;
Delay(200);
P2=~0xfe;
Delay(200);
P2=~0xff;
}
Disp_Temperature()
{
P0=~0xc6;
P2=0x77;
Delay(200);
P2=0x7f;
P0=~LEDData[n];
P2=0x7b;
Delay(200);
P2=0x7f;
P0=~LEDData[m%10];
DIAN=0;
P2=0x7d;
Delay(200);
P2=0x7f;
P0=~LEDData[m/10];
P2=0x7e;
Delay(200);
P2=0x7f;
}
Disp_alarm(ucharbaojing)
{
P0=~0xc6;
P2=0x77;
Delay(200);
P2=0x7f;
P0=~LEDData[baojing%10];
P2=0x7b;
Delay(200);
P2=0x7f;
P0=~LEDData[baojing/10];
P2=0x7d;
Delay(200);
P2=0x7f;
if(set_st==1)P0=~0x89;
elseif(set_st==2)P0=~0xc7;
P2=0x7e;
Delay(200);
P2=0x7f;
}
voidAlarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m{BEEP=1;P0=0x00;}
else{BEEP=0;P0=0xff;}
}
/*voidAlarm(uchart)
{
uchari,j;
for(i=0;i<50;i++)
{
BEEP=~BEEP;
for(j=0;j}BEEP=1;
}
voidmain(void)
{
uint乙BEEP=0;
InitTimer();
EA=1;
TR0=1;
ET0=1;
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;z<300;z++)
{
Disp_init();
}
while
(1)
{
if(SET==O)
{
Delay(2000);
while(!
SET);
set_st++;x=O;shanshuo_st=1;if(set_st>2)set_st=0;
}
if(set_st==0)
{
EX0=0;
EX仁0;
check_wendu();
Disp_Temperature();BEEP=0;
Alarm();
}
elseif(set_st==1)
{
BEEP=0;
EX0=1;
EX仁1;
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(shangxian);}}
elseif(set_st==2)
{
BEEP=0;
EX0=1;
EX仁1;
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(xiaxian);}
}
}
/*****end*****/
#include
#defineDQP1_0
voidDelay_DS18B20(intnum)
{
while(num--);
}
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
Delay_DS18B20(8);
DQ=0;
Delay_DS18B20(80);
DQ=1;
Delay_DS18B20(14);
x=DQ;
Delay_DS18B20(20);
}
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_DS18B20⑷;
}
return(dat);
}
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}
}
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;tt=t*0.0625;t=tt*10+0.5;
return(t);
}
END
*/
#include
#defineDQP10
voidDelay_DS18B20(intnum)
{
while(num--);
}
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
Delay_DS18B20(8);
DQ=0;
Delay_DS18B20(80);
DQ=1;
Delay_DS18B20(14);
x=DQ;
Delay_DS18B20(20);
}
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_DS18B20⑷;
}
return(dat);
}
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}
}
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(OxCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(OxCC);
WriteOneChar(OxBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
END
*/
第5章调试总结与心得体会
5.1调试总结
(1)检查版各器件、引线的焊接是否正确;
(2)确保芯片的电源稳定和电压符合要求;芯片如外接晶振,要确保时钟输入正确;复位信号要确保存在、存在时间长短,及系统多个复位信号的先后顺序;要保证芯片的
工作参数和外围配置电路设置正确。
(3)对输出部分进行检查,可编写测试程序,检查数码管的显示是否正常,有无闪烁和拖尾现象。
若有,则可以调节延时程序,改变每个数码管显示时间,直至无异常现象。
(4)分别调节按键使温度调高和调低,观察数码管显示的数值,看误差是否在允许范围。
若偏差太大,检查程序中的计算部分,修改程序使其符合要求。
(5)调试过程中出现的最大问题在于蜂鸣器一直报警,经调试发现是P2端写入程序值拉高了(蜂鸣器低电平不报警,高电平报警),修改了程序使其符合要求。
在调试过程中,要仔细阅读芯片说明,仔细记录调试过程中的异常现象。
在调试时,应仔细阅读芯片说明中的配置(主要是操作模式)、管脚定义(是否复用、电压电平)、协议、时序图。
在记录异常现象时,一定要记下来前几步的操作,这样可以重复模拟,如果重复出现三次以上,应考虑该地方必有问题存在,应及时解决;如果该现象是由某特定原因造成的,而没有及时重复模拟发现问题所在,可能造成后期出现问题多,而无从下手。
5.2心得体会
通过这次的课程设计,让我接触到了很多课本以外的知识,了解了设计电路的程序,也知道了温度显示报警的原理和设计理念,要设计一个电路首先要先用仿真软件仿真成功之后才能进行制作硬件、接线等过程。
但是仿真和实物成品相差很多,因为焊板的原理图不是原先的仿真图,所以焊好后要进