单片机实习报告书 - 图文
更新时间: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);
}
//显示第六位数码管
正在阅读:
单片机实习报告书 - 图文04-18
李祥龙--毕业设计初稿 - 图文05-10
小学教师预备党员转正思想汇报范文09-08
电控复习题11-25
万科物业交接验房标准化流程06-30
函数解析式的表示形式及五种确定方式06-02
药品追溯操作规程06-20
有机电致发光显示器件05-21
物权法习题(含答案)03-23
- 小学生造句大全
- 增压泵投资项目可行性研究报告(模板)
- 高中语文人教版粤教版必修1-5全部文言文知识点归纳
- 两学一做专题民主生活会组织生活会批评与自我批评环节个人发言提
- 管理处环境保洁工作操作标准作业指导书
- 2012六一儿童节活动议程 - 图文
- 移树申请报告
- 《贵州省市政工程计价定额》2016定额说明及计算规则
- 计算机长期没有向WSUS报告状态
- 汉语拼音教学策略研究
- 发展西部领先的航空货运枢纽
- 司法所上半年工作总结4篇
- 如何提高银行服务水平
- 发电厂各级人员岗位职责
- 丰田汽车的外部环境分析
- 2017—2018年最新冀教版四年级数学下册《混合运算》教案精品优质
- 中建八局样板策划 - 图文
- 戚安邦《项目管理学》电子书
- 2015年高级项目经理笔记
- 弯桥的设计要点
- 报告书
- 单片机
- 实习
- 图文
- 高中生物会考复习资料(1)
- 9103-2抽采达标评判报1
- 温州医科大学研究生统计学资料 - 图文
- 停工方案
- 电大经济数学基础期末复习指导小抄版(精)
- 美国佛罗里达州,去美国佛罗里达州的注意事项
- 关于加强干部作风建设的调研报告
- (新版)全面质量管理复习题及答案
- 金蝶K3凭证中指定现金流量
- 浅析人事档案管理在人力资源管理中的作用
- 九年级化学周清试题
- 公关期末考试复习题
- 南京溧水永阳新城总体规划
- 手术室空气消毒方法的研究进展
- 《格列佛游记》题库
- 2019年高考数学压轴题命题区间三三角函数增分点 3“三法”
- 初中文言虚词(以的用法)
- 中国汽车产业节能减排行业调研与分析报告目录
- 初中超级化学笔记大全 - 图文
- 六月安全生产月活动总结 - 图文