资源描述
课程设计项目成绩评定表
一、设计任务及要求:
1、设计任务:
要求仪器能够感知所处环境的光线变化,调整照明设备的亮度。
2、要 求:
1、利用8051单片机内定时器和I/O接口。
2、感知不同光线变化。
3、随着不同的亮度发生照明不同
指导教师签名:
年 月 日
二、指导教师评语:
该设计研究了亮度测试仪,对处理的信息有较强的实用价值,报告思路清晰,论述过程严谨,分析合理,达到了课程报告的各种要求。
指导教师签名:
年 月 日
三、成绩评定:
指导教师签名:
年 月 日
四、系部意见:
系部盖章:
年 月 日
设计项目成绩评定表
电子与信息工程系 2012年6月
课程设计报告书目录
设计报告书目录
一、设计目的 1
二、设计思路 1
三、设计过程 1
3.1系统方案论证 1
3.1.1原理图 1
3.1.2系统板硬件连线 2
3.2硬件设计 3
3.3软件设计 6
3.3.1按键的软件设计 6
3.3.2一般串行下载介绍 7
3.3.3 LCD1062显示介绍 7
3.4 PWM控制具体过程 8
四、系统调试与结果 8
五、主要元器件与设备 8
六、课程设计体会与建议 9
6.1设计体会 9
6.2设计建议 9
亮度检测仪设计
一、设计目的
1、掌握微机原理的有关知识。
2、初步掌握应用微机解决问题的步骤及方法。
3、熟悉AT89C51单片机。
二、设计思路
1、硬件板上的系统连线设计。
2、程序设计内容。
3、I/O并行口直接驱动LED显示。
三、设计过程
3.1系统方案论证
其根据相应载荷的变化来调制晶体管栅极或基极的偏置来实现开关稳压电源输出晶体管或晶管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制,根据输出电压占空比不同灯的亮度也不一样。占空比越大说明输出电压越大灯就越亮,反之,占空比越小即说明输出电压越小灯就越暗。
3.1.1原理图
如图1所示。
图1
3.1.2系统板硬件连线
单片机PWM控制
LCD1062
显示
按键初始化
按键扫描
LCD初始化
AD初始化
开始
延时
设第一行显示位置及内容
设第二行显示位置及内容
系统板硬件发生模块,键盘模块,及LED显示模块连接如下它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。流程图2所示。
按键按下
图2
3.1.3 主要芯片简介
AT89S51简介
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系
统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
3.2硬件设计
亮度反馈部分
如图3所示,图中RF为光敏电阻,它可更加接收到的LED灯光的亮度改变自身阻值。 LED灯变亮,其阻值越小,反之,LED灯越亮,其阻值也越大。
图3 亮度反馈原理图
按键电路部分
独立式键盘:独立式键盘是指直接用I/O口线构成的单个按键电路。每根I/O口线上按键的工作状态不会影响其他I/O口线的工作状态。微处理器通过向此I/O口发出读指令来得到当前按键的状态。键未按下时,此信号为1,高电平。键按下时,此信号为O,低电平。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。
键盘电路选择
根据实际需要本次设计采用独立式键盘,如图4所示。通过按键可以增大、减小LED 灯的给定值。给定值的不同其亮度也不同。通过按键可把LED灯调节到合适的亮度。
图4
串口下载部分
通过下图串口下载电路,可以将程序从PC机直接下载到板子上的STC中比较方便。
图5
LED执行部件
如下图2-3所示P1.4输出PWM输出控制信号。根据输出电压占空比不同灯的亮度也不一样。占空比越大说明输出电压越大灯就越亮,反之,占空比越小即说明输出电压越小灯就越暗。
图6 LED执行部件原理图
3.3软件设计
3.3.1按键的软件设计
键盘的监测方式
1、 查询方式
查询方式是指CPU不断的判断I/O口按键接口的状态就像扫描一样,扫描哪个按键式是处于被按下状态,扫描到了就可以确定是哪个按键了。在查询方式下不管有没有按键,CPU都需要不断地进行查询操作以判断是否有键按下,这不利于提高CPU的效率。在一些任务繁重或者低功耗应用场合,尤其不适合使用。如果采用中断方式,只有在每次有键按下CPU才去响应键盘,这样能够大大减轻CPU的任务量。
2、 中断方式
中断方式相比查询方式要好很多,当然它多占用了单片机的一个资源当检测到有按键按下时就进入到中断里面判断是哪个按键,换句话可以理解为在中断中扫描按键值。用中断方式恰恰就解决了查询方式中的问题。
键盘抖动原因
由于按键多为机械弹性开关,它是利用了机械触点的合、断作用。所以按键开关在闭合和断开的瞬间均有一连串的抖动抖动时间的长短由按键的机械特性决定,一般为5~10ms这是一个很重要的参数。抖动过程引起电平信号的波动有可能令CPU误解为多次按键操作,从而引起误处理。通常避免该问题是通过消抖来实现的,而消抖的方式也有两种:软件方式和硬件方式。
按键消抖方法
1、 硬件消抖方法
可以用电路来实现,如加RS触发器,使其产生单次手动脉冲,此外,
也可以利用积分电路来吸收抖动带来的干扰脉冲,只要选择好适当的参数也
能 达到较好的效果。
2、 软件消抖方法
多采用软件延时的方法,在第一次检测到有键按下时执行一段延时
10ms的子程序后再确认电平是否仍保持闭合状态电平,如果保持闭合状态
电平则确认真正有键按下。释放一个键时方法相同。这种消除抖动影响的软
件措施是切实可行的。
3.3.2一般串行下载介绍
ISP 在系统编程一般目标芯片内包含了专用的接口电路,上位机发送编
程命令码及编程控制信息后由芯片硬件自动完成编程。比如通过JTAG
口升级就是其中的一种,现在推出的许多新的芯片比如ARM都采用此模
式。ATMEL公司的AT89S5x系列的单片机的下载模式虽然不属于JTAG模
式,但很类似应该属于ISP类。
IAP 一般叫做在应用编程。MCS-51系列单片机中采用比较多的sst、stc
两家公司的单片机就属于这种模式与上面的模式是有区别的。
二者比较
ISP编程属于纯硬件操作,只要FLASH的物理特性未损坏就可以实现
串口升级,但升级模式是固定的。IAP模式属于属于软件操作,如果8K
区并无物理损坏但软件有问题就只能使用编程器来编程,无法实现串口
升级。但正是由于这种可更改性,可以扩展多种升级方式更灵活。其实
物理损坏的可能性不大,所以个人认为还 是IAP更好些。
3.3.3 LCD1062显示介绍
1602LCD分为带背光和不带背光两种基控制器大部分为HD44780带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示
图7 LCD1062显示
3.4 PWM控制具体过程
脉冲宽度调制PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。 许多微控制器内部都包含有PWM控制器。占空比是接通时间与周期之比调制频率为周期的倒数。执行PWM操作之前这种微处理器要求在软件中完成以下工作:
1、设置提供调制方波的片上定时器/计数器的周期
2、 在PWM控制寄存器中设置接通时间
3、设置PWM输出的方向这个输出是一个通用I/O管脚
4、启动定时器
5、使能PWM控制器
四、系统调试与结果
1、硬件调试,对各个模块的功能进行调试,主要调试各模块能否实现指定功能
2、软件调试主要检查语法错误。
3、将调试好的硬件和软件进行联调,主要调试系统实现功能。
此次系统设计结果较好,分别拨动按键会发出高低不同的声音。
五、主要元器件与设备
AT89C51单片机、键盘、PWM、LCD显示
六、课程设计体会与建议
6.1设计体会
我的设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。
在软件方面,通过串行口调试工具的开发,使我加深了对累封装的理解,熟
悉了51系列单片机内部的寄存器和编程规则,以及如何控制外围电路。
6.2设计建议
我希望老师在我们动手制作之前应先告诉我们一些关于所做电路的资料、原理,以及如何检测电路的方法,还有关于检测芯片的方法。这样会有助于我们进一步的进入状态,完成设计。
参考文献
[1] 谭浩强.C程序设计[M].北京:清华大学出版社,1991
[2] 高海生,杨文焕.单片机应用技术大全[M].西南交通大学出版社,1999-06.
[3] 徐爱钧,彭秀华.单片机高级C51应用程序设计[M].中国计量出版社,2001.
[4] 马盅梅.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2003.
附录/*****************************************************************************/
#include "reg51.h"
#include "intrins.h"
#include "LCD1602.H"
#define FOSC 24058052L
#define BAUD 9600
sbit button1=P2^2; //按键-减小亮度
sbit button2=P2^1; //按键-增大亮度
sbit button3=P2^0 ; //按键-确认
typedef unsigned char BYTE;
typedef unsigned int WORD;
WORD exp=300;
BYTE REV=0;
/***************************************AD************************************/
/*Declare SFR associated with the ADC */
BYTE ch = 0; //ADC channel NO.
sfr ADC_CONTR = 0xBC; //ADC control register
sfr ADC_RES = 0xBD; //ADC hight 8-bit result
register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks /*------------------------------------------------------Get ADC result-----------------------------------------*/
WORD GetADCResult(BYTE ch)
{ WORD ADC_R;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC
ADC_R=ADC_RES*4+ADC_LOW2; //Return ADC result
return ADC_R;}
/*********************************平均值**************************************/
WORD GetADCResult_P()
{ WORD ADC_RP=GetADCResult(0);
BYTE i;
for(i=0;i<10;i++)
ADC_RP=(ADC_RP+GetADCResult(0))/2;
ADC_RP=ADC_RP*0.48828;
return ADC_RP;}
/*-----------------------------------------------------Initial ADC sfr-------------------------------------------*/
void InitADC()
{ //P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);}
/*---------------------------------------------------showADC()------------------------------------------------*/
void showADC(WORD j,BYTE x)
{ BYTE i,a[3],k=7;
for(i=0;i<3;i++)
{ a[i]=j%10;
j/=10;} for(i=0;i<3;i++)
{ if(i==2)
{ gotoxy(x,k-i);
write_LCD_data('.');
k--;}
gotoxy(x,k-i);
display_LCD_number(a[i]);
}
}
/*-----------------------------------------------------PI调---------------------------------------------------*/
void PI(BYTE i,BYTE ki) //i->模糊值
{ WORD r;
r=GetADCResult_P();
if(r<exp-i) { //CCAP0H=CCAP0H-(exp-r)/ki;
CCAP0H=CCAP0H-ki;
if(CCAP0H<0x2c)
CCAP0H=0x2c; }
if(r>exp+i)
{ //CCAP0H=CCAP0H+(r-exp)/ki;
CCAP0H=CCAP0H+ki;
if(CCAP0H>0xf4)
CCAP0H=0xf4; }
}
/*----------------------------------------------------Initial UART----------------------------------------------*/
void InitUart()
{ SCON = 0x5a;
PCON=0x80; //8 bit data ,no parity bit
TMOD = 0x20; //T1 as 8-bit auto reload
TH1 = TL1 = -13; //Set Uart baudrate
TR1 = 1; //T1 start running
}
/*--------------------Send one byte data to PC Input: dat (UART data) Output:- ------------------*/
void SendData(BYTE dat)
{ while (!TI); //Wait for the previous data is sen
TI = 0; //Clear TI flag
SBUF = dat; //Send current data
}
/*-----------------Send a string to UART Input: s (address of string) Output:None----------------*/
void SendString(char *s)
{ while (*s)
{ SendData(*s++);}
}
/*--------------------------------------------------------main()--------------------------------------------------*/
void main()
{ BYTE stp=5,ii,tab[3];
InitUart();
InitADC();
init_LCD();
gotoxy(1,0);
display_LCD_string(" exp: stp: ");
gotoxy(2,0);
display_LCD_string("act: ");
/***PWM控制***/
CCON = 0;
CL = 0; //复位PCA的计数器
CH = 0;
CMOD = 0x02;
CCAP0H = 0xf4;
CCAP0L = 0x00; //50
CCAPM0 = 0x42;
CR = 1;
showADC(exp,1);
gotoxy(1,14);
display_LCD_number(stp);
while (1)
{ if(!button1)
{ delay_50us(40000);
xp -=stp;
SendData(0xbb);
//SendData(0xbb); }
if(!button2)
{ delay_50us(40000);
exp +=stp;
SendData(ADC_RES);
SendData(ADC_LOW2); }
while(!button3)
{ if(!button2)
{ delay_50us(40000);
stp+=1;
gotoxy(1,14);
display_LCD_number(stp);
}
if(!button1)
{ delay_50us(40000);
stp -=1;
gotoxy(1,14);
display_LCD_number(stp); }
delay_50us(80000); }
if(RI)
{ RI=0;
REV=SBUF;
for (ii=0;ii<3;ii++)
{ tab[ii]=REV%10;;
REV/=10; }
for
(ii=0;ii<3;ii++)
{ gotoxy(2,14-ii);
display_LCD_number(tab[ii]); }
}
showADC(exp,1);
showADC(GetADCResult_P(),2);
PI(3,1);
}
}
15 电子与信息工程系 2012年6月
展开阅读全文