当前位置:文档之家› 单片机课程设计基于单片机的多功能综合应用系统的设计

单片机课程设计基于单片机的多功能综合应用系统的设计

单片机课程设计报告——基于单片机的多功能综合应用系统的设计摘要近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。

在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。

本次课程设计采用AT89C51单片机作为主要核心部件,加上LED、LCD、键盘、LED点阵等外围设备,实现了键盘控制LED并以LCD显示及LED点阵显示和可校时数字时钟、温度控制等功能,这些功能贴近日常生活,非常具有现实意义。

目录摘要 (2)一、概述 (4)1.1设计意义 (4)1.2设计目标 (5)第一部分:基本功能 (5)第二部分:基本应用模块 (5)第三部分:基于仿真的扩展模块 (5)第四部分:赛前训练模块 (5)1.3设计要求 (5)1.4 任务分配 (6)二、硬件和程序设计 (7)元器件及开发环境 (7)元器件清单 (7)开发环境 (8)第一部分:基本功能 (8)1.1 单片机最小系统 (8)1.2 LED彩灯模块 (10)1.3 LCD 显示模块 (10)1.4 键盘控制模块 (11)1.5 第一部分整体图 (11)1.6 硬件实物图 (12)1.7 程序设计 (13)第二部分:基本应用模块 (13)2.1 数字时钟 (13)2.2 程序设计 (14)第三部分:基于仿真的扩展模块 (15)3.1 点阵基础——8*8点阵调节 (15)3.2 点阵模块——16*16点阵显示 (15)3.3 程序设计 (16)第四部分:赛前训练模块 (16)4.1 系统描述 (16)4.2 温度采集模块 (17)4.3 时钟模块 (17)4.4 通信模块 (17)4.5 显示模块 (18)4.6 温度控制系统整体图 (18)4.7 程序设计 (18)三、总结和心得 (19)四、参考资料 (20)附录(程序代码节选) (21)第一部分(节选主要部分) (21)第二部分(节选主要部分) (23)一、概述1.1设计意义本次单片机课程设计内容包括单片机正常启动和复位,LED花样控制及亮度、色彩变化调节,LCD液晶显示屏的调节,点阵LED的文字输出,时钟芯片DS1302的配置,温度传感器DS18B20的使用,以及键盘控制单片机工作,对以上技术的掌握可以有效地提高我们的实际应用能力,如基于LED的节日艺术彩灯控制系统、温度采集和实时监控系统、电子日历等,具有非常实际的意义和价值,使我们对知识的学习由理论提升到实践,让专业知识学习得到极大巩固和提高。

1.2设计目标第一部分:基本功能1.设计并实现具有复位功能的单片机小系统。

2.利用单片机进行灯光的场景开关控制、循环点亮控制、花样变化控制及速度变化控制。

3.利用单片机进行灯光的色彩连续变化效果控制。

4.利用单片机进行灯光的三色联动定时控制(以交通灯为例)。

5. 配合2至4项中功能,实现液晶屏输出功能或状态信息。

6. 实现基于4X4键盘的输入功能。

第二部分:基本应用模块7. 数字时钟的设计(要求:显示时间、调整时间、闹钟功能等)第三部分:基于仿真的扩展模块8.16x16点阵LED显示同组同学汉字名。

第四部分:赛前训练模块9.温度监控系统1.3设计要求1.能启动、停止单片机;2.能通过开关(按键)进行功能选择;3.基本功能部分要体现循环、组合和色彩变化的控制功能和效果,实现三色联动定时控制,控制变化规律的类型或功能不少于5种。

1.4 任务分配根据组内成员的擅长方向,由纪琛负责电路仿真和程序设计,马浩负责硬件的搭建和调试。

第一部分用时3周,第二部分用时2周,第三部分用时1周,第四部分用时3周,共用时9周。

二、硬件和程序设计元器件及开发环境元器件清单17 74LS04 片 2 20 可换用74LS07/06、74HC245以改善驱动能力18 RT1602液晶显示屏只 1 2019 DS18B20温度传感器只 1 2020 8550三极管只 1 20 PNP型21 有源一体蜂鸣器5V 只 1 20(补充:由于本组第二部分设计要求,设计时自行增加了时钟芯片DS1302和32.768KHz晶振各一个)开发环境硬件仿真环境——Proteus 7软件开发环境——Keil µVision4第一部分:基本功能1.1 单片机最小系统1.1.1 复位电路1.1.2 晶振电路1.1.3 最小系统整体图1.2 LED彩灯模块1.3 LCD 显示模块1.4 键盘控制模块1.5 第一部分整体图1.6 硬件实物图1.7 程序设计(详细程序见附录)第二部分:基本应用模块2.1 数字时钟2.1.1 DS1302时钟电路2.1.2 数字时钟整体图2.2 程序设计第三部分:基于仿真的扩展模块3.1 点阵基础——8*8点阵调节3.2 点阵模块——16*16点阵显示3.3 程序设计(见压缩包附件)第四部分:赛前训练模块4.1 系统描述本系统由AT89C51做主控芯片,外部直流稳压电源给系统供电(未给出电源详细设计),通过I2C与24C02C构成的外部存储电路通信读取预存的温度上下限值,通过DS1302时钟模块读取准确的时间信息,通过DS18B20进行温度采集,当采集温度与预设的上下限温度比较,高于上限则红灯亮蜂鸣器响且启动风扇进行降温,低于下限则蓝灯亮蜂鸣器响且启动电热丝进行升温,考虑到要显示的信息较多,系统使用12864液晶AMPIRE128X64进行数据显示,当控制方式切换为手动模式时,使用按钮控制风扇和电热丝,串口RS-232用于与PC进行通信,可以手动设定温度上下限、当前时间、工作模式(自动、手动)。

由于时间和个人能力问题,本电路的串口通信功能未得到完善,软件设计也存在问题,虽然基本检测和自动控制能实现,但离预期可基本投入实际应用的目标还很遥远。

4.2 温度采集模块4.3 时钟模块4.4 通信模块4.5 显示模块4.6 温度控制系统整体图4.7 程序设计(详细见压缩包附件)端口、定时器、I2C 初始化预设定温度上下限温度转换时间Jc&Mh三、总结和心得在这次的单片机课程设计实验过程中,我遇到过很多难题,比如,如何调节占空比使得三色灯的颜色更具连续性,如何配置DS1302芯片,如何进行LCD 的初始化,如何使用较少的端口连接4个8*8点阵组成一个16*16点阵、如何温度采样等等,这些问题都曾导致我们的试验进度缓慢,因为我是负责仿真和程序部分的,如果我这边出不来,硬件那边就无法进行,因此我经常需要查阅大量网络资料和馆藏书籍,实时学习相关知识以保证我的知识量足以设计出稳定可靠的电路并写出符合功能要求的程序代码,这是很需要时间和精力的,因为很多情况都是,可能看了一上午的书,检查了一上午的代码,仍然解决不了我们遇到的问题。

就比如我们后期调试第一部分的电路时,LCD实物一直没有显示,但是仿真却有反应,找了半天才发现有2个控制端口接错位了。

从这些细小的问题可以看出,有时候一个产品的好坏并没有决定于它大的硬件设计或者程序驱动等,而往往是一些平时没注意的细微之处,在关键时刻导致整个产品的失败。

另一个教训就是,平时应该多查阅资料,有时候使用别人已经做好的模块可以节省大量的时间,设计初期我花大量时间去调试LCD驱动和键盘初始化,结果有现成的没及时用,白白浪费大量时间。

如果平时多阅读,使用的时候就能很快联想到相关见过的或者曾经做过的模块,这样可以大大缩短实验周期,提高效率。

总之,这次课程设计我学到了不少东西,理论知识永远还是需要实验来巩固才能提高。

四、参考资料1.《单片机课程设计指导》(第2版) 北京航空航天大学出版社作者:楼然苗李光飞 2012.12. 《单片机技术-课程设计与项目实例》中国电力出版社作者:李海滨等 2009.103.《 Proteus教程-电子线路设计、制版与仿真》清华大学出版社作者:朱清彗 2008.94.《 51系列单片机设计实例》(第2版) 北京航空航天大学出版社作者:楼然苗李光飞 2006.25.《基于5103K的单片机实验指导书》(内部试用)附录(程序代码节选)第一部分(节选主要部分)#include<reg52.h>#include<stdio.h> //标准输入输出#include<intrins.h>#include<stdlib.h>#include "last1_led.h"#define Data P0//数据端口sbit RS = P2^4; //Pin4sbit RW = P2^5; //Pin5sbit E = P2^6; //Pin6sbit p1_0=P1^0;//接东西绿灯//sbit p1_1=P1^1;//接东西黄灯//sbit p1_2=P1^2;//接东西红灯//sbit p1_3=P1^3;//接南北绿灯//sbit p1_4=P1^4;//接南北黄灯//sbit p1_5=P1^5;//接南北红灯//unsigned char key;static int i=0;char data TimeNum[]=" ";char data Test1[]=" ";//延时函数1//void delay1(unsigned int x)//键盘扫描函数//unsigned char keyscan(void)void last1_led(void);void roadlight(void)void DelayUs(unsigned char us)//delay usvoid DelayMs(unsigned char ms)/* 写入命令 */void WriteCommand(unsigned char c)/* 写入数据函数 */void WriteData(unsigned char c)/* 写入字节函数 *//* 写入字符串函数 */void ShowString (unsigned char line,char *ptr)/* 初始化函数 */void InitLcd()void lcdshow(void){InitLcd(); //初始化LCDDelayMs(15); //延时保证信号稳定WriteCommand(0x01); //显示清屏sprintf(Test1," LCD Test ");//打印输出第一行信息ShowString(0,Test1);sprintf(TimeNum," Hello AT89C51 ");//打印输出第二行信息ShowString(1,TimeNum);}// 三色联动//void delay_h(int x)//主函数//void main(void){unsigned char keycode;P1=0xFF;srand(3);while(1){keycode=keyscan();switch(keycode){case 0:last1_led();P1=0xFF;break;case 1:roadlight();P1=0xff;break;case 2:lcdshow();break;case 3:while(1){pwm();}break;default:break;}}}/*功能: 8个LED的4种花样显示 */#include <reg51.h>typedef unsigned char U8;typedef unsigned int U16;/*************宏定义*****************/#define speed P2#define led_data P1#define uchar unsigned char#define uint unsigned int/*************端口定义***************/sbit key_speed_jia=P2^0; //int0sbit key_speed_jian=P2^1; //int1/*************************************************************** 4种花样数据定义***************************************************************/ uchar code table0[]={0xE7,0xDB,0xBD,0x7E,0xFF,0x7E,0x3C,0x18,0x00,0xFF,0xE7,0xC3,0x81,0x00};uchar code table1[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};uchar code table2[]={0xAA,0x55};uchar code table3[]={0x00,0xFF};uint sudu; //流水灯速度uchar cishu; //闪烁次数/************************************************************* * 名称:last1_led* 功能:循环调用各个子程序**************************************************************/ void last1_led(void){ }void exter_int0() interrupt 0 //外部中断0函数void exter_int1() interrupt 2 //外部中断1函数第二部分(节选主要部分)#include<reg51.h>#define uint unsigned int#define uchar unsigned charuchar Second,Minute,Hour,Date,Month,Year,week;//时间等变量#define one 0x80 //第一行的初始位置#define two 0xc0 //第二行初始位置sbit RS_1602=P2^0; //1602数据命令端sbit E_1602=P2^1; //1602使能端sbit IO_1302=P2^4; //1302数据端sbit CLK_1302=P2^3; //1302时钟端sbit RST_1302=P2^2; //1302复位端sbit key_mode=P1^0; //功能按键sbit key_up=P1^1; //增量键sbit key_down=P1^2; //减量键sbit ACC0=ACC^0;sbit ACC7=ACC^7;uchar code tab1[]={"20 - - week "}; //液晶第一行默认显示数据uchar code tab2[]={" : : "}; //液晶第二行默认显示数据void init(); //定时器0初始化/********************ds1302****************************/void write_byte(uchar dat) //1302字节写{uchar kk;ACC=dat;RST_1302=1; //启动读写操作for(kk=8;kk>0;kk--) //8位数据{IO_1302=ACC0; //先传送数据低位CLK_1302=0;CLK_1302=1; //上升沿输入数据ACC=ACC>>1; //右移位}}uchar read_byte() //1302字节读{uchar kk;RST_1302=1; //启动读写操作for(kk=8;kk>0;kk--){ACC7=IO_1302; //先读入数据低位CLK_1302=1;CLK_1302=0; //下降沿输出数据ACC=ACC>>1; //右移位}return (ACC);}void write_1302(uchar add,uchar dat) //1302地址写{RST_1302=0;CLK_1302=0;RST_1302=1; //启动读写操作write_byte(add); //写地址write_byte(dat); //写数据CLK_1302=1;RST_1302=0; //禁止读写操作}uchar read_1302(uchar add) //1302地址读{uchar temp;RST_1302=0;CLK_1302=0;RST_1302=1; //启动读写操作write_byte(add); //写地址temp=read_byte(); //读数据CLK_1302=1;RST_1302=0; //禁止读写操作return(temp);}void ds1302_init() //1302初始化{RST_1302=0; //禁止读写操作CLK_1302=0; //时钟为低write_1302(0x80,Second|0x00); //允许写}void keyscan() //按键处理子程序{uchar key1n; //功能键按下次数if(key_mode==0) //key_down为功能键{delay(5); //延时去抖动if(key_mode==0) //功能键确认按下{while(!key_mode); //等待按键释放key1n++; //功能键按下次数加一if(key1n==9) //为9时调为1 则1~8key1n=1;switch(key1n) //功能键按键次数不同实现不同操作{case 1: //时调整秒TR0=0; //关闭定时器write_1602com(two+0x0b); //写入光标位置write_1602com(0x0f); //设置光标为闪烁write_1302(0x8e,0x00); //允许写write_1302(0x80,0x80|Dec_BCD(Second));//Secondbreak;case 2: write_1602com(two+8);break; //Minute闪烁case 3: write_1602com(two+5);break; //Hour闪烁case 4: write_1602com(one+0x0f);break; //week闪烁case 5: write_1602com(one+0x09);break; //Date闪烁case 6: write_1602com(one+0x06);break; //Month闪烁case 7: write_1602com(one+0x03);break; //Year闪烁case 8:write_1602com(0x0c); //设置光标不闪烁write_1302(0x80,0x00|Dec_BCD(Second)); //Secondwrite_1302(0x8e,0x80); //禁止写TR0=1;//打开定时器break;}}}if(key1n!=0) //当key_mode按下以后。

相关主题