单片机实习报告书 - 图文

更新时间:2024-04-18 00:39:01 阅读量: 综合文库 文档下载

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

序号(学号):

0121009320418

学生实习报告书

实习类别

单片机应用实习

实习地址 武汉理工大学信息工程学院 学 院 专 业 班 级 姓 名 指导教师

信息工程学院 通信工程 通信1004班 黄军忠 刘新华

2012 年

12 月

29 日

目录

1 设计要求.................................................................................................................... 3

1.1 最小系统......................................................................................................... 3 1.2 下载电路......................................................................................................... 4 1.3、软件设计要求............................................................................................... 4 1.4、仿真要求....................................................................................................... 4 1.5、硬件功能要求............................................................................................... 4 2设计方案..................................................................................................................... 5

2.1 硬件电路设计................................................................................................. 5

2.1.1 最小系统.............................................................................................. 5 2.1.2 下载电路.............................................................................................. 8 2.2 软件设计......................................................................................................... 9

2.2.1 矩阵键盘的识别.................................................................................. 9 2.2.2 数码管显示........................................................................................ 10 2.2.3 温度检测............................................................................................ 11 2.2.4 串口通信............................................................................................ 12

3 软件仿真.................................................................................................................. 14 4 实物焊接及测试...................................................................................................... 16 5 设计总结.................................................................................................................. 19 参考文献...................................................................................................................... 20 附录.............................................................................................................................. 21

单片机应用设计

摘要:本文介绍了基于51单片机的应用设计,其中包括矩阵键盘、数码管显示、

温度检测和串口通信等模块,矩阵键盘完成数字的输入和功能的选择,数码管作为当前输入数据以及当前状态的显示,温度检测模块能够实时采集环境温度,并通过数码管显示出来,串口通信实现了两个单片机最小系统之间的通信,辅系统能够同步显示主系统的数据与状态。该系统能够实现设计要求的所有功能,在保证系统稳定性的前提下采用分模块设计,使得各个模块在此次设计验收后可留作他用,节约资源。

1 设计要求

1.1 最小系统

完成包含如下系统功能组件的单片机最小系统的设计、焊接、调试。 (1)键盘

一个4X4的矩阵键盘,其中,10个按键是0~9数字键;另外6个是功能键,用于功能选择和控制。 (2)显示电路

由6个7段LED数码管组成的显示电路。 (3)温度检测

利用DS18B20可编程1-Wire数字温度传感器芯片,或利用AD590温度传感器芯片和A/D转换器芯片采集温度温度信号。 (4)串口串行通信

利用51的串口实现串行通信接口电路。

1.2 下载电路

完成ISP下载电路的设计、焊接。

1.3、软件设计要求

完成系统软件的设计,包括程序结构设计、流程图绘制、程序设计,实现如下功能 (1)功能选择

通过功能选择键,使得单片机处于不同的工作状态并通过LED显示相应的内容。 (2)温度显示

通过功能选择键选择温度检测、显示后,LED显示温度值。 (3)数据输入

通过功能选择键选择数据输入后,将通过键盘键入的0~9按键值显示在LED上,其中,最后输入的显示在最左边,之前键入向右移动一位。 (4)数据通信

将两个单片机最小系统通过串口连接起来,其中一个作为主系统,另一个作为辅系统。当通过功能选择键选择数据通信后,当在主系统上进行功能(2)、功能(3)的操作时,辅系统的LED上显示与主系统同样的内容。

1.4、仿真要求

利用仿真软件完成系统仿真工作。

1.5、硬件功能要求

在单片机最小系统硬件上实现任务3中规定的功能。

按照设计要求,此部分包括主控芯片STC89C52的外围电路、矩阵键盘、6

2.1.1 最小系统

2设计方案

2.1 硬件电路设计

图1 STC89C52外围电路

该部分包括芯片的电源、复位以及时钟电路。

矩阵键盘采用16个点触开关进行4*4排列,电路连接方式如图2所示。

位数码管、温度检测模块的电路设计。主控芯片的外围电路设计如图1所示。

附录

完整程序代码:

1、主系统程序:

#include

#define NO_DEF

20

//声明无效键值 //声明显示数字的标志 //声明显示温度的标志

#define SHOW_NUM 1 #define SHOW_TEP 0 #define CLEAR 11 #define SWITCH 10

typedef unsigned char uchar; typedef unsigned int uint;

#define SM_PORT P0 #define KEY P3 sbit dula = P2^6; sbit wela = P2^7;

//定义清0键 //定义功能切换键

//声明数码管数据端口

//声明矩阵键盘端口

//声明数码管段选端口 //声明数码管位选端口

sbit DS = P2^2; //声明温度传感器的数据端口

uint temp; // variable of temperature ,用于接收来自DS18B20传回的温度数据 uint key_value=20;

uchar show_flag=SHOW_TEP; uchar send_cnt=0; uchar *s;

uint tep_index[4]={0,0,0,0}; //温度索引,因为用前4位数码管显示温度值,

后两位分别显示-C,故温度索引之定义了4位 uchar tem_value[6]={0x3f,0xbf,0x3f,0x3f,0x40,0x39}; 显示码

uint num_index[6]={13,13,13,13,13,13}; uchar num_value[6]={0,0,0,0,0,0}; 码值

unsigned char code table[14]={0x3f,0x06,0x5b,

void delayms(uint count); void key_scan(); void display(uchar ch[6]);

void num_shift(uint *num,uint new_key_value); void dsreset(void); bit tmpreadbit(void); uchar tmpread(void); void tmpwritebyte(uchar dat); void tmpchange(void); void tmp();

void toTmpIndex(uint *index);

void indexToValue(uint *index,uchar *value,int flag);

0x4f,0x66,0x6d, 0x7d,0x07,0x7f, 0x6f, //数字:0——9

0x39, //字母:C 数组第10个字符 0x40, //字符:- 数组第11个字符 0x80, //字符:. 数组第12个字符 0x00 //无显示 };

数组第13个字符

//数字索引

//要显示的数字对应的数码管显示

//温度值对应的,数码管

void shut_down();

void main() {

TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; SCON = 0x40; EA = 1; PCON = 0x80; ES = 1; TR1 = 1; while(1) {

key_scan(); delayms(1);

if(key_value==SWITCH)

//检测功能切换键是否

//开启定时器1,开始发送数据

//串口波特率加倍

//设置串口的工作方式为方式1

//设置定时器的工作方式为方式2 //设置波特率为19200

被按下 值

}

switch(show_flag) {

if(show_flag==SHOW_TEP)

show_flag=SHOW_NUM;

{

shut_down(); key_value=NO_DEF;

//将键值赋值为无效

else

show_flag=SHOW_TEP;

}

case SHOW_NUM: //key_scan();

if(key_value<=9)

//检测数字键是否被按

{ num_shift(num_index,key_value);

}

if(key_value==CLEAR)

//检测清0键是否按下

{ uchar i=6; while(i>0)

num_index[--i] = 13;

}

indexToValue(num_index,num_value,SHOW_NUM); s = num_value; //display(num_value);

key_value=NO_DEF;

//将键值赋值为无效

break;

case SHOW_TEP: tmpchange(); tmp();

toTmpIndex(tep_index);

indexToValue(tep_index,tem_value,SHOW_TEP); s = tem_value; //display(tem_value);

break;

default: show_flag=SHOW_TEP;

break;

//delayms(1); display(s); SBUF = 0xee;

while(!TI); TI = 0;

while(send_cnt<6) { SBUF = s[send_cnt++]; while(!TI); TI = 0;

}

send_cnt = 0;

}

} /*

void Send() interrupt 4 { if(send_cnt<6) { send_cnt = 1; SBUF = s[send_cnt]; } else { TR1 = 0; send_cnt = 1;

}

//发送帧同步信号

//发送数据

//等待发送完成 //清空发送标志

//清空发送计数器

} */

void delayms(uint count) //delay { uint i; while(count) { i=200; while(i>0) i--; count--; } }

void key_scan() {

uint temp;

KEY = 0xfe; temp = KEY; temp = temp&0xf0; if(temp!=0xf0) {

delayms(10); if(temp!=0xf0)

//扫描矩阵键盘第一行

{

temp = KEY; switch(temp) {

//扫描矩阵键盘第一行,第四列

//无效键

case 0xee:

key_value=NO_DEF;

break;

case 0xde: //扫描矩阵键盘第一行,第三列

key_value=3; break;

case 0xbe:

key_value=2; break;

case 0x7e:

key_value=1;

break;

} while(temp!=0xf0)

{

temp = KEY; temp=temp&0xf0;

}

} }

KEY = 0xfd; temp = KEY; temp=temp&0xf0; if(temp!=0xf0)

{

delayms(10); if(temp!=0xf0) {

//扫描矩阵键盘第一行,第二列

//扫描矩阵键盘第一行,第一列

//等待按键释放

//扫描矩阵键盘第二行

temp = KEY; switch(temp) { case 0xed:

//扫描矩阵键盘第二行,第四列

//无效键

key_value=NO_DEF; break;

case 0xdd:

key_value=6; break;

case 0xbd:

key_value=5; break;

case 0x7d:

key_value=4;

break;

}

while(temp!=0xf0) {

temp = KEY; temp=temp&0xf0; }

}

}

KEY = 0xfb; temp = KEY; temp=temp&0xf0;

//扫描矩阵键盘第二行,第三列

//扫描矩阵键盘第二行,第二列

//扫描矩阵键盘第二行,第一列

//等待按键释放

if(temp!=0xf0) {

delayms(10); if(temp!=0xf0) {

//扫描矩阵键盘第三行

temp = KEY; switch(temp) {

case 0xeb:

//扫描矩阵键盘第三行,第四列

//无效键

key_value=NO_DEF; break;

case 0xdb:

//扫描矩阵键盘第三行,第三列

key_value=9; break;

case 0xbb:

//扫描矩阵键盘第三行,第二列

key_value=8; break;

case 0x7b:

//扫描矩阵键盘第三行,第一列

key_value=7; break;

}

while(temp!=0xf0) {

temp = KEY; temp = temp&0xf0; }

//等待按键释放

}

}

KEY = 0xf7; temp = KEY; temp=temp&0xf0; if(temp!=0xf0) {

delayms(10); if(temp!=0xf0) {

temp = KEY; switch(temp) {

case 0xe7:

//扫描矩阵键盘第四行,第四列

//扫描矩阵键盘第四行

key_value=NO_DEF; break;

case 0xd7:

//扫描矩阵键盘第四行,第三列

key_value=CLEAR; break;

case 0xb7:

//扫描矩阵键盘第四行,第二列

key_value=SWITCH; break;

case 0x77:

//扫描矩阵键盘第四行,第一列

key_value=0; break;

} } /*

//函数功能描述:开始温度转换的功能函数。 */

void tmpchange(void) //DS18B20 begin change {

dsreset(); delayms(1);

tmpwritebyte(0xcc); // address all drivers on bus

tmpwritebyte(0x44); // initiates a single temperature conversion } /*

//函数功能描述:将从DS18B20读取的数值转换成实际的温度位值。 */

void tmp() //get the temperature { float tt; //uint temp; uchar a,b; dsreset(); delayms(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b;

temp<<=8; //two byte compose a int variable

temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; //return temp; } /*

//函数功能描述:将实际温度值转换成温度索引,便于查表显示温度值 */

void toTmpIndex(uint *index) { } /*

函数功能描述:将要显示的字符索引转换成对应的数码管显示码 */

void indexToValue(uint *index,uchar *value,int flag) {

uchar i;

if(flag==SHOW_NUM)

for(i=0;i<6;i++)

value[i]=table[index[i]];

index[0] = temp/100; index[1] = temp0/10; index[2] = temp; index[3] = 0;

else

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

if(i!=1)

value[i]=table[index[i]];

} /*

}

else

value[i]=table[index[i]]+0x80;

函数功能描述:关闭数码管显示。 */

void shut_down() { }

dula=1;

SM_PORT=0x00; dula=0;

SM_PORT=0x00; wela=1;

SM_PORT=0x00; wela=0;

2、辅系统程序代码 #include

#define SM_PORT P0 sbit dula = P2^6; sbit wela = P2^7;

#define uchar unsigned char #define uint unsigned int

uchar receive_cnt = 0;

//声明数码管数据端口 //声明数码管段选端口 //声明数码管位选端口

uchar r_syn_code = 0x00;

void delayms(uint count); void display(uchar ch[6]); void main() {

TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; SM0=0; SM1=1; REN=1; //SCON = 0x50; EA = 1; PCON = 0x80; ES = 1; //SBUF = 0x00; TR1 = 1; while(1) {

//SBUF = 0x00;

//接收帧同步码

//接收数据缓

uchar receive[6] = {0x3f,0x06,0x5b,

0x4f,0x66,0x6d,};

冲数组,初始化什么也不显示

//设置定时器的工作方式为 //设置波特率为19200

方式2

//设置串口的工作方式

为方式1,允许接收

//串口波特率加倍 //清空接收缓冲区 //

//开启定时器1,开始发送数据

// //

while(r_syn_code!=0xee) {

//判断帧同步码,

如果不同步,等待同步码到来

// while(!RI); // RI = 0;

// r_syn_code = SBUF;

// }

//while(receive_cnt<6) //{ //while(!RI);

display(receive);

//}

//receive_cnt = 0; //display(receive);

} } void Re()interrupt 4 //using 0 { RI = 0;

if(r_syn_code == 0xee) 码:0xee

{ receive[receive_cnt]=SBUF; receive_cnt++;

}

if(receive_cnt == 0) 同步码

r_syn_code = SBUF;

if(receive_cnt==6)

//检测到帧同步

//开始接收数据

//数据开始,先检测

//一帧数据接收完成,

将接收计数器清0,同时清除同步码标志 { receive_cnt = 0; r_syn_code =0x00;

}

}

void delayms(uint count) { uint i; while(count) { i=200; while(i>0) i--; count--; } }

void display(uchar ch[6]) {

dula=1; SM_PORT=ch[0]; dula=0; SM_PORT=0xff; wela=1; SM_PORT=0xfe; wela=0;

delayms(1);

//delay //显示第一位数码管

dula=1; //显示第二位数码管

SM_PORT=ch[1]; dula=0;

SM_PORT=0xff; wela=1; SM_PORT=0xfd; wela=0; delayms(1); dula=1;

SM_PORT=ch[2];

dula=0; SM_PORT=0xff; wela=1; SM_PORT=0xfb; wela=0; delayms(1); dula=1;

SM_PORT=ch[3];

dula=0; SM_PORT=0xff; wela=1; SM_PORT=0xf7; wela=0; delayms(1); dula=1;

SM_PORT=ch[4];

//显示第三位数码管

//显示第四位数码管

//显示第五位数码管

dula=0; SM_PORT=0xff; wela=1; SM_PORT=0xef; wela=0; delayms(1); dula=1; SM_PORT=ch[5];

dula=0; SM_PORT=0xff; wela=1; SM_PORT=0xdf; wela=0;

delayms(1);

}

//显示第六位数码管

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

Top