您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页单片机课程设计

单片机课程设计

来源:飒榕旅游知识分享网


单片机应用技术 课程设计

学 生 姓 名: 左 鹏 学 号: 412012580201228 年级/专业/班: 2012级机电2班 学 院: 应用技术学院 指 导 教 师: 黄惟公

2014年1月

目 录

任务书

1 单片机多功能测量仪的设计 ........................................... 1

1.1 主要功能 ........................................................................................................... 1 1.2 电路总体方案 ................................................................................................... 1 1.3 各个功能模块的说明 ....................................................................................... 1

1.3.1 STCC52的主要特点 ......................................................................... 1 1.3.2 LCM1602显示电路 ............................................................................... 2 1.3.3 键盘电路 .............................................................................................. 3 1.3.4 光电计数电路 ...................................................................................... 3 1.3.5 直流电压测量电路 .............................................................................. 3 1.3.6 温度测量电路 ...................................................................................... 4 1.4 电路原理图(SCH) ............................................ 4 2 应用程序设计 ....................................................... 5

2.1 程序的总体设计 ............................................................................................... 5

2.1.1 程序结构框图 ...................................................................................... 5 2.1.2 所需要的程序模块 .............................................................................. 5 2.2 主程序的设计 ................................................................................................... 6 3 仿真及实际效果图 ...................................................................................................... 9

3.1 Protues仿真效果图 .......................................................................................... 9 4 总结与致谢 ................................................................................ 错误!未定义书签。 参 考 文 献 .......................................................... 10 附 程序清单

单片机应用技术课程设计

1 单片机多功能测量仪的设计

1.1 主要功能

主要功能如下:

(1) 测量0-5V的直流电压;用LCM1602液晶显示电压值(小数点后一位); (2) 测量-30-100℃温度;用LCM1602液晶显示温度值(整数);

(3) 对光电传感器的遮挡次数进行计数(000-255)。 (4) 按下键key1、key2、key3分别显示电压、温度、计数值。

1.2 电路总体方案

根据以上功能,设计的电路总体方案框图如下:

LCM1602键盘STCC52

光电计数单元DS18B20 测温单元TLC9 采用增强型51系列单片机STCc52为核心控制器;字符型LCM1602液晶显示模块;三个键盘;光电计数单元;一线制的DS18B20集成测温芯片测量温度;TLC9为AD,采集直流的0-5v电压值。

1.3 各个功能模块的说明

以下分别描述各功能模块的电路设计。

1.3.1 STCC52的主要特点

STCC52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STCC52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STCC52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

1

单片机应用技术课程设计

主要特性如下:

1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码

完全兼容传统8051;

2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机);

3. 工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz; 4. 用户应用程序空间为8K字节; 5. 片上集成512字节RAM;

6. 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路

输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。 7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可

通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片; 8. 具有EEPROM功能; 9. 具有看门狗功能;

10. 共3个16位定时器/计数器。即定时器T0、T1、T2;

11. 外部中断2个,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平

触发中断方式唤醒;

12. 通用异步串行口(UART),还可用定时器软件实现多个UART; 13. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)。

1.3.2 LCM1602显示电路

显示电路如下;

2

单片机应用技术课程设计

这是一种四线数据、2根控制线的接口方法,它与单片机需要六线连接。

1.3.3 键盘电路

这是一种式键盘的电路。

1.3.4 光电计数电路

电路原理如右;

采用的是反射式光电开关,如图OP。74LS14为施密特触发器,起整形作用。

整形后的信号进入c52的T1计数器进行计数。

1.3.5 直流电压测量电路

电路原理图如下;

采用TLC9作为AD转换器,TLC9是美国德州仪器公司生产的8位串行A/D转换器芯片,可

与通用微处理器、控制器通过CLK、CS、DATA OUT三条口线进行串行接口。具有4MHz片内系统时钟

3

单片机应用技术课程设计

和软、硬件控制电路,转换时间最长17μs, TLC9为40 000次/s。总失调误差最大为±0.5LSB,典型功耗值为6mW。

TLC9均有片内系统时钟,该时钟与I/O CLOCK是工作的,无须特殊的速度或相位匹配。 仿真时,用一个10k的可调电阻获取0-5V的直流电压。如在实际应用中,这个电压来源于实际被测的直流电压。

1.3.6 温度测量电路

DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃ ,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引人,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。本仪器采用P3.4作为接口。如左图。

1.4 电路原理图(SCH)

4

单片机应用技术课程设计

2 应用程序设计

2.1 程序的总体设计

2.1.1 程序结构框图

2.1.2 所需要的程序模块

LCD1602-4.H 3KEY.H TLC595.H DS18B20.H

5

单片机应用技术课程设计

2.2 主程序的设计

#include\"key.h\"

#include #include #include

sbit guangdian=P3^5;

uchar i,num1,nummm=2;

void Guangdian(void) //光电计数子程序 {

uchar DispBuffer[4]; uchar num;

num=TH1*256+TL1;

DispBuffer[0]=TL1/100+0x30; DispBuffer[1]=TL1%100/10+0x30; DispBuffer[2]=TL1%10+0x30; DispBuffer[3]='\\0'; LCD_Prints(6,1,\" \");

LCD_Prints(8,1,DispBuffer); }

void DianYa(void) //测量电压和A/D转换子程序 {

uchar bis[6]; uchar DA;

DA= AD_TLC9()*50.5/255;

6

单片机应用技术课程设计

bis[0]=DA/10+0x30; bis[1]='.';

bis[2]=DA%10+0x30; bis[3]=' '; bis[4]='V'; bis[5]='\\0';

LCD_Prints(6,1,bis); }

void wendu(void)//温度测量子程序 {

char DB[6]; uchar wd=0; Init_DS18B20(); wd=ReadTemp(); if(wd>128) {wd=256-wd; DB[0]='-'; }

else DB[0]=wd/100+0x30; DB[1]=wd%100/10+0x30; DB[2]=wd%10+0x30; DB[3]=0xdf; DB[4]='C'; DB[5]='\\0';

LCD_Prints(6,1,DB); }

void caidan (uchar num1) {

switch(num1) {

case 0:{Guangdian();}break; case 1:{DianYa();}break; case 2:{wendu();}break;

7

单片机应用技术课程设计

} }

void KeyProc(void) //按键处理程序

{

uchar key;

key=KeyScanNUM();

if(key==UP||key==DOWN||key==ENTER) {

switch(key) {

case UP:{nummm=0;LCD_Prints(1,0,\"Photoelectric \");}break;

case DOWN:{nummm=1;LCD_Prints(1,0,\"Voltage \");}break; case ENTER:{nummm=2;LCD_Prints(1,0,\"Temperature \");}break; } }

caidan(nummm); }

void main(void) {

TMOD=0x50; TL1=0; TH1=0; TR1=1; LCD_Init();

LCD_Prints(1,0,\"Temperature \"); while(1) {

KeyProc(); } }

8

单片机应用技术课程设计

3 仿真及实际效果图

3.1 Protues仿真效果图

9

单片机应用技术课程设计

课程设计总结

这个学期的单片机课已经早早的上完了,但是理论纯属理论,没有与实践的结合总让我们学的不踏实,感觉没有达到学以致用的效果。所庆幸的是在课程介绍考试完之后,老师给我们安排了这次单片机课程设计,给了我们学以致用的做好的实践。 关于这次课程设计,我们花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我们丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获,在真正设计之前我们做了相当丰富的准备,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。在设计程序时,我们不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;养成注释程序的好习惯是非常必要的,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便;我觉得在设计课程过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计又出错了。 除了对此次设计的准备工作之外,我们还学到了很多平时难得的东西,首先是团队协作,在这次设计当中,难免和同学产生观点和意见的分歧,以及分工明细、时间安排等不合理,通过这次设计,我们体会到了团结合作的重要性及力量之强大,还有让我们处理事情更加有条理,思路更加清晰明了了,发现、提出、分析、解决问题和实践能力的提高都将受益于我在以后的学习、工作和生活中。 此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电

10

单片机应用技术课程设计

子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。

参考文献

黄惟公等《单片机原理及接口技术》 西安电子科大出版社 2007 周景润等 《基于PROTEUS的电路及单片机系统设计与仿真》 北航出版社 2006.5 ]韩晓东等《Pretel电路设计入门与应用》 中国铁道出版社

附程序清单

综合测量仪程序

主程序

#include\"key.h\" #include #include #include

sbit LED1=P1^4; sbit LED2=P1^5; sbit LED3=P1^6;

sbit guangdian=P3^5; sbit E1 = P2^4; sbit E2 = P2^5;

11

单片机应用技术课程设计

uchar i;

void KeyProc(void) //红黄灯亮子程序 { uchar key; key=KeyScanNUM(); switch(key) { case UP:{LED1=1;LED2=1;LED3=0;}break; case DOWN:{LED1=1;LED2=0;LED3=1;}break; case ENTER:{LED1=0;LED2=1;LED3=1;}break; } key=0; }

void Guangdian(void) //光电计数子程序 {

uchar code dis[]={0xc0,0xf3,0x98,0x92,0xa3,0x86,0x84,0xd3,0x80,0x82,0xff}; uchar num;

num=TH1*256+TL1; switch(i) { case 0:P0=dis[num/10];E1=1;E2=0;i=1;break; case 1:P0=dis[num%10];E1=0;E2=1;i=0;break; } }

void DianYa(void) //测量电压和A/D转换子程序 {

uchar bis[6]; uchar DA;

DA= AD_TLC9()*50.5/255; bis[0]=DA/10+0x30; bis[1]='.';

bis[2]=DA%10+0x30; bis[3]=' '; bis[4]='V'; bis[5]='\\0';

12

单片机应用技术课程设计

LCD_Prints(0,1,bis); }

void wendu(void)//温度测量子程序 {

char DB[6]; uchar wd=0; Init_DS18B20(); wd=ReadTemp(); if(wd>127) {i=256-wd; DB[0]='-'; } else DB[0]=i/100+0x30; DB[1]=wd%100/10+0x30; DB[2]=wd%10+0x30; DB[3]=0xdf; DB[4]='C'; DB[5]='\\0'; LCD_Prints(10,1,DB); }

void main(void) { TMOD=0x50; TL1=0; TH1=0; TR1=1; LCD_Init();

LCD_Prints(0,0,\"DianYa\"); LCD_Prints(10,0,\"WenDu\"); while(1) { KeyProc(); Guangdian(); DianYa(); wendu(); } }

LCM1602驱动函数:LCD1602.h#ifndef __LCD1602_H__ #define __LCD1602_H__

13

单片机应用技术课程设计

#include

#define uint unsigned int #define uchar unsigned char

sfr LCD_DATA=0x90;

sbit LCD_RS=P2^6; sbit LCD_EN=P2^7;

void LCD_Init(void);

void LCD_Prints(uchar x,uchar y,uchar *str);

#endif

LCM1602驱动程序:LCD1602.c #include\"lcd1602.h\" void LCD_Delay(uchar x) { while(--x); }

void LCD_En(void) { LCD_EN=1; LCD_Delay(4); LCD_EN=0; }

void LCD_cmd(uchar cmd) { uchar cmd1; cmd1=cmd; cmd1>>=4; LCD_Delay(18); LCD_RS=0; LCD_DATA &=0xf0; LCD_DATA |=cmd1&0x0f; LCD_En(); LCD_DATA &=0xf0; LCD_DATA |=cmd&0x0f; LCD_En(); }

14

单片机应用技术课程设计

void LCD_Clr(void) { LCD_cmd(0x01); LCD_Delay(255); LCD_Delay(255); LCD_Delay(255); LCD_Delay(200); }

void LCD_Init(void) { LCD_cmd(0x28); LCD_En(); LCD_cmd(0x28); LCD_cmd(0x0c); LCD_Clr(); }

void LCD_Dat(uchar dat) { uchar dat1; dat1=dat; dat1>>=4; LCD_Delay(18); LCD_RS=1; LCD_DATA &=0xf0; LCD_DATA |=dat1&0x0f; LCD_En(); LCD_DATA &=0xf0; LCD_DATA |=dat&0x0f; LCD_En(); }

void LCD_Pos(uchar x,uchar y) { if(y)LCD_cmd(x|0xc0); else LCD_cmd(x|0x80); }

void LCD_Prints(uchar x,uchar y,uchar *str) {

15

单片机应用技术课程设计

LCD_Pos(x,y); while(*str) { LCD_Dat(*str); str++; } }

按键驱动函数及程序KEY.h #ifndef _KEY_H_ #define _KEY_H_ #include

#define uchar unsigned char

#define UP 0x01 #define DOWN 0x02 #define ENTER 0x03

sbit UP_key=P2^2; sbit DOWN_key=P2^1; sbit ENTER_key=P2^0;

void ys (unsigned int x) {

unsigned char j; while (x--) { for (j=0;j<123;j++){;} } }

uchar KeyScanNUM(void) {

uchar key=0;

UP_key=1;DOWN_key=1;ENTER_key=1;

if(UP_key==0){ys(10);if(UP_key==0)key=UP;else key=0;}

if(DOWN_key==0){ys(10);if(DOWN_key==0)key=DOWN;else key=0;} if(ENTER_key==0){ys(10);if(ENTER_key==0)key=ENTER;else key=0;} return key; }

TCL9驱动函数及程序TCL9.h /*------------------------------------------------------------ 功能:TCL9的头文件

16

单片机应用技术课程设计

------------------------------------------------------------*/ #ifndef __TCL9_H__ #define __TCL9_H__

#include

#define uint unsigned int #define uchar unsigned char

//ADC0832引脚与51单片机的连接

sbit AD_CS =P3^3; sbit AD_DAT =P3^7; sbit AD_CLK =P3^6;

void delay(uint x) {

while(x--); }

uchar AD_TLC9() { uchar value=0,i=0; AD_CS=0; AD_DAT=1; for (i=0;i<8;i++) { if(AD_DAT)value|=(0x80)>>i; AD_CLK=1; AD_CLK=0; delay(10); } AD_CS=1; delay(50); return value; }

#endif

智能温度传感器DS18B20驱动函数DS18B20.h #ifndef _DS18B20_ #define _DS18B20_ #include

17

单片机应用技术课程设计

#define uint unsigned int #define uchar unsigned char

sbit DQ = P3^4; //温度传送数据接口,根据实际电路修改 //unsigned char temp_value; //存放温度数据

//unsigned char TempBuffer[6]; //存放转换成液晶字符的数组 ××注意此数组的定义

void Init_DS18B20(void); //初始化DS18B20,

uchar ReadTemp(void); //读DS18B20温度,存入temp_valu //转换结果正温度为3位整数,负温度为两位整数;都无小数部分

//void temp_to_str(void); //温度数据转换成液晶显示字符(ASIC码)

#endif

智能温度传感器DS18B20驱动程序DS18B20.c #include #include \"ds18b20.h\"

//sbit DQ = P1^0; //温度传送数据IO口 unsigned char temp_value; //存放温度数据

unsigned char TempBuffer[3]; //volatile存放转换成液晶字符的数组 ××注意此数组的定义

void delay_18B20(unsigned int i) { while(i--); }

void Init_DS18B20(void) { unsigned char x=0;

DQ = 1; //DQ复位 delay_18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

18

单片机应用技术课程设计

delay_18B20(20); }

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); }

return(dat); }

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat) {

unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } }

/**************读取ds18b20当前温度************/

uchar ReadTemp(void) { unsigned char a=0; unsigned char b=0;

19

单片机应用技术课程设计

unsigned char t=0; Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)度 delay_18B20(100);

a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b<<4; temp_value+=(a&0xf0)>>4; return temp_value; }

/*void temp_to_str(void) //温度数据转换成液晶字符显示 {

//TempBuffer=temp_value; //百位

TempBuffer[0]=temp_value%100/10+48; //十位 TempBuffer[1]=temp_value%100%10+48; //个位

} */

20

前两个就是温

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务