智能电扇

更新时间:2024-05-29 10:20:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目编号:

2015-2016学年第一学期

微机原理(单片机)课程设计

总结报告

项目名称:

智能电扇

班级:

姓名: 学号:

微机原理(单片机)课程设计任务书

项目名称:智能电扇 内容与要求:

上位机:完成界面设计与通讯程序

(1)能够显示并设定当前电扇运行状态(高速、中速、低速、停止) (2)能够定时控制电扇运行

(3)能够将电扇运行状态的改变保存至文档 (4)可以对串口进行设置 下位机:完成电路设计与控制程序 (1)完成电扇的控制设计 (2)通过串口与上位机通讯

(3)可通过按键设置电扇的运行状态,并显示在LED数码管上 (4)当定时控制时可显示倒计时

项目组任务分担评价表

姓名 张雷 分担任务 LED显示模块设计与编程,下位机串口通讯程序,单片机设计与编程,电路的搭建与焊接 上位机转速显示及设定程序、串口通讯程序、文件保存程序、倒计时刘思源 显示程序 5 5 组内评价

课程设计报告评分表

总体内容 方案 张雷得分 刘思源得分

硬件设计 软件设计 结果分析 明细清单 问题分析 心得体会 参考文献 程序代码 格式总分 规范 微机原理(单片机)课程设计报告

目录

一、总体方案 .......................................................... 1 二、硬件设计 .......................................................... 1 三、软件设计 .......................................................... 2 四、结果分析或项目所实现的功能、指标 .................................. 5 五、明细清单 .......................................................... 7 六、设计调试中遇到的疑难问题及解决方法 ................................ 7 七、心得体会与建议 .................................................... 8 参考文献 .............................................................. 9 附录A.下位机程序 ...................................................... 9 附录B.上位机程序图 ................................................... 15

I

微机原理(单片机)课程设计报告

一、总体方案

智能电扇总体框图如图1-1所示。

图1-1 智能电扇总体功能模块示意图

LED显示模块 按键调速及单片机定时模块 上位机 USB电扇 ULN2003 图中,单片机通过驱动芯片ULN2003控制USB电扇转动,通过PWM方式调节输入USB电扇的电压来调节转速。按键模块共有6个键,Key1~4用于调速和调节定时时间,Key5~6用于开始设置定时和确定定时设置。LED模块可以显示电扇当前的转速和定时时间。上位机可以对电扇的转速和定时进行设置,并能将转速变化信息存储到指定的txt文件中。

二、硬件设计

本项目下位机采用STC89C52RC型号单片机。该芯片具有8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构,全双工串行口,是一种低功耗、高性能CMOS8位微控制器,符合设计中对经济、环保指标的要求。

电扇驱动芯片采用ULN2003。该芯片是高耐压、大电流达林顿晶体管阵列,由七个硅NPN 达林顿体管组成。每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

电扇采用网上常用的USB电扇,通过USB转串口器件转化为4个接头(1

1

微机原理(单片机)课程设计报告

个电源端、2个数据传送端、1个地端),供电时只需连接电源端和地端,并可通过改变电源端电压来控制电扇转速。

显示模块采用实验室配备的6位数码管LED板,使用时只需把其RXD和TXD端连接到单片机的预设管脚即可,使用方便,成本低廉,显示效果好。

硬件电路连接图如图2-1所示

图2-1 硬件电路连接图

LED板1号2号引脚接VCC,3号引脚接单片机P27,4号引脚接单片机P26,5号引脚接地。

驱动芯片ULN2003的1号引脚接P20,同时通过一个10KΩ的上拉电阻接到9号引脚,8号引脚接地,9号引脚接VCC和USB接头的4号引脚,16号引脚接USB接头的1号引脚,其余引脚悬空。

USB电扇只需把USB插头插到USB接头上即可。

三、软件设计

3.1 设计思路

3.1.1 下位机:

USB电扇的驱动方式非常简单,只需改变其VCC端的电压即可改变转速。设计中使用PWM方式控制电扇VCC端的电压,通过Key1~4调节其占空比。在

2

微机原理(单片机)课程设计报告

本次试验使用的最小系统板上有6个按键,我们的课程设计要求能使电扇在高速、中速、低速、停止共4状态间切换,并能定时。

我们小组最初设计是2个按键用于调速(加速、减速)剩下4个按键用于定时(开始设置定时、确定定时的时间、增加时间、减少时间),但发现这样时间只能一秒一秒的增加和减少,很不方便。后来经过我们小组讨论,最终决定使用一键两功能的方案,即一个按键在不同的状态下是不同的功能。

这样的设计就需要一个状态切换键,比如设置Key5为状态切换键,当不按Key5时,Key1~4用于调速,按下Key5时,Key1~4用于设置定时。这个状态切换的设计给我的编程带来很大困难。由于Key5的按下只是一瞬间,我并不知道该如何保存这个状态。后来经过查阅资料,我在按键检测的函数中增加了一个检测上一次按键的功能,通过上一次按键和这一次按键的对比来判断是否按下了某个键,最终解决了这个问题。

刘思源:

1、设计中要求上位机和下位机进行串口通讯,我按照网上的Labview教程搭建完串口后发现程序并不能和单片机进行连接,后来经过询问同学后才知道是没有安装Visa驱动模块,在安装后解决了问题。

2、设计中要求把转速变化信息保存到txt文件中,如果之前没有设定保存的路径,在转速变化时会自动弹出一个保存窗口,如果此时不保存,而是关掉窗口,Labview就会崩溃。这个问题应该是Labview文件保存模块的本身的特性导致的,只要在文件保存路径中指定一个txt文件就能解决问题。

七、心得体会与建议

张雷:

本次课程设计是我第一次完成的一个完整的单片机项目。之前我也上过一些单片机的实验选修课,不过做的都是一些比较基础的东西,上学期的微机硬件实验综合性较强,但使用的是汇编语言。所以这次课程设计对我来说是一个全新的,很有挑战性的任务。

一开始我拿到题目时是毫无头绪的,根本不知道程序从何写起。但通过

8

微机原理(单片机)课程设计报告

班里同学的帮助,我渐渐地有了整个程序的设计思路,并通过查阅资料逐步完成了单片机初始化、按键控制、LED显示等模块的实现。

对于课程的建议是在微机原理的课时里留出更多的时间给单片机,因为班里的许多同学和我一样对于单片机的整体设计是非常缺乏经验的,课设最初的时候会遭遇很大的困难。希望老师在平时上课时增加单片机部分的内容和硬件设计。

刘思源:

本次课程设计上位机使用的Labview软件是我之前从未接触过的。面对这个全新的软件,我从网上查阅教程,并听从其他会使用Labview同学的指导,逐步学会了使用Labview制作一个上位机程序。Labview的功能非常强大,使用图形搭建程序比VCC++方便了许多。对于课程的建议是应该把所有的课程设计题目进行难度分级,并根据难度给不同的得分,比如难的题目完成的话给分从80分起,简单的题目完成了从60分起等等。这样可以让同学根据自己的水平进行选题,量力而行。

参考文献

[1]楚现知,吴吉祥,李锦忠.基于LabVIEW的监控界面设计与单片机的串行通信[J]《工业控制计算机》2005,18(7)

[2]陈诚,李言武,葛立峰.基于LabVIEW的单片机串口通信设计[J]现代计算机(专业版)2009,01

[3]焦玉朋.基于51单片机的PWM直流电机调速系统[D]内蒙古:内蒙古大学,2013

附录A.下位机程序

#include

#define TSETH 0x4C

sbit fan=P2^0;

//50ms

9

微机原理(单片机)课程设计报告

sbit dispc=P2^6; sbit dispd=P2^7;

bit key5=0;

unsigned int mcnt=0; unsigned char speed=0,scnt=19,tbsize,srem,sdig; //tbsize为发送数据位数,srem为闪烁时间,sdig计时功能的时间,speed为当前速度 unsigned char txbuf[4],inset[4];

unsigned char code duties[4]={0x00,0x80,0xc0,0xff};

void display (void);

void disp_send (unsigned char);

void speed_regulation (unsigned char);

void init() //初始化函数 {

TMOD=0x21; //T1方式2,T0方式1 TH0=TSETH; //T0为50ms TL0=0x00; TR0=1; TH1=0xfd;

TL1=0xfd; //baud rate: 9600 TR1=1;

SCON=0x50; //串口工作方式1 speed_regulation(1); ET0=1; //开T0中断 ES=1; //开串口中断 EA=1; //开所有中断 }

void main (void) {

unsigned char i,j; display(); init();

//根据电压生成PWM波 for(;;){

for(i=duties[speed];i<0xff;i++){ fan=0;

for(j=0;j<32;j++); }

for(i=duties[speed];i>0x00;i--){

10

微机原理(单片机)课程设计报告

fan=1;

for(j=0;j<32;j++); } } }

void speed_regulation (unsigned char newg) //调速 {

if(speed!=newg){ speed=newg; display();

txbuf[0]=0xff; txbuf[1]=speed; tbsize=2;

SBUF=txbuf[0]; } }

void display (void) //LED显示函数,数码管共6位,从右往左计数。前4位显示计时时间,第6位显示速度。 {

unsigned char code digit[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //0~9编码 unsigned char i; unsigned int mcc; if(key5){

for(i=0;i<=3;i++){ //如果按下key5进入计时设置功能,被选中的LED闪烁,其他正常显示

if(sdig==i&&srem>4) disp_send(0x00); else disp_send(digit[inset[i]]); }

}else{ //如果没按下key5,则当前显示速度信息 mcc=mcnt;

for(i=1;i<=4;i++){

disp_send(digit[mcc]); mcc/=10; }

}

disp_send(0x00); //数码管第5位不亮 disp_send(digit[speed]); //第6位显示速度 }

11

微机原理(单片机)课程设计报告

void disp_send (unsigned char c) //显示传递函数,用于把已编码的要显示信息发送到LED {

unsigned char i; for(i=1;i<=8;i++){ dispc=0;

dispd=c&0x80; c<<=1; dispc=1; } }

void key () interrupt 1 //按键判断 {

static unsigned char keylast=0xff,keypast=0xff; unsigned char keynow,i; TH0=TSETH;

keynow=P3|0x03;

if(keynow==keylast){ //判断两次按键是否相同,若不同,则把本次按键的值(keynow)赋给上次按键的值(keylast) if(key5){//是否按下key5

switch((~keynow)&keypast){ //如果按下key5,进入计时设置功能,并检测下一个按了哪个键

case 0x80: //按key1则左移位选 if(sdig==3) sdig=0; else sdig++; srem=100; break;

case 0x40: //按key2则右移位选 if(sdig==0) sdig=3; else sdig--; srem=100; break;

case 0x20: //按key3则数值+1 if(inset[sdig]==9) inset[sdig]=0; else inset[sdig]++; srem=95; break;

case 0x10: //按key4则数值-1 if(inset[sdig]==0) inset[sdig]=9; else inset[sdig]--;

12

微机原理(单片机)课程设计报告

srem=95; break;

case 0x08:key5=0;display();break; //按key5则退出计时设置功能

case 0x04: //按key6则确定计时设置 mcnt=0; scnt=19;

for(i=1;i<=4;i++) mcnt=mcnt*10+inset[4-i]; key5=0; display(); }

}else{ //如果没按下key5,则为调速功能

switch((~keynow)&keypast){ //key1~key4分别对应停止、低速、中速、高速,在LED屏幕上分别以0、1、2、3显示 case 0x80:speed_regulation(0);break; case 0x40:speed_regulation(1);break; case 0x20:speed_regulation(2);break; case 0x10:speed_regulation(3);break; case 0x08: key5=1; srem=100; sdig=0;

for(i=0;i<=3;i++) inset[i]=0; } }

keypast=keynow; }else{

keylast=keynow; }

if(scnt!=0){ scnt--; }else{

scnt=19;

if(mcnt!=0){ mcnt--;

if(mcnt==0) speed_regulation(0); else if(!key5) display(); } }

if(key5){ //按下key5进入计时设置功能时,被选中的位会闪烁20次,若20次内没有其他操作,则退出计时设置功能 srem--;

13

微机原理(单片机)课程设计报告

if(srem==0){ key5=0; display(); }else{

if(srem%5==4) display(); } } }

void uart () interrupt 4 //串口发送接收函数 {

static unsigned char rxbuf[3]={0x00}; static unsigned char rbi=0,tbi=0; unsigned int temp; if(RI){ //下位机从上位机接收数据 rxbuf[rbi]=SBUF; rbi++; RI=0;

switch(rxbuf[0]){ //检测收到的是调速还是计时信息 case 0xff: //调速信息 if(rbi<2) break;

if(rxbuf[1]<=3) speed_regulation(rxbuf[1]); rbi=0; break;

case 0xfe: //计时信息 if(rbi<3) break;

temp=rxbuf[1]*256+rxbuf[2]; if(temp<=9999){ mcnt=temp; scnt=19; display(); key5=0; }

rbi=0; break;

default:rbi=0; }

}else{ // 下位机给上位机发送数据 TI=0;

tbsize--;

if(tbsize==0) tbi=0; else{

14

微机原理(单片机)课程设计报告

tbi++;

SBUF=txbuf[tbi]; } }

}

B.上位机程序图

15

附录

本文来源:https://www.bwwdw.com/article/fuu7.html

Top