文档详情

单片机接口技术实验教程

痛***
实名认证
店铺
DOC
1.01MB
约42页
文档ID:169820397
单片机接口技术实验教程_第1页
1/42

单片机接口技术实验教程太原科技大学光电工程技术研究所2009年5月目 录第一章 51单片机实验板系统概述 41.1 单片机实验板结构框图 41.2 实验板各模块功能概述 41.3 实验整体思路 5第二章 51单片机汇编及C语言编译环境简介 62.1 WAVE 6000 62.1.1 WAVE 6000仿真器设置 62.1.2 WAVE6000汇编语言编程 72.2 Keil C 82.2.1 源文件的建立 82.2.2 工程的建立 82.2.3 编译,链接 92.3 STCISP 9第三章 实验内容 103.1 必做实验 11实验一 LED发光二极管实验 11实验二 蜂鸣器驱动实验 12实验三 I/O管脚按键实验 13实验四 红外对管实验 14实验五 定时器输出实验 16实验六 看门狗实验 17实验七 CH451驱动数码管实验 17实验八74HC138译码实验 20实验九 拨码开关信号输入实验 21实验十 读写片外RAM62256实验 23实验十一 运放电路实验 24实验十二 温度传感器实验 24实验十三 ch451驱动扫描键盘实验 28实验十四 RS232与电脑通信实验 30实验十五 继电器控制实验 31实验十六 8×8点阵模块实验 31实验十七 实时时钟试验 33实验十八 A/D以及D/A实验 373.2 选做实验……………………………………………… (1) 实验一 485通信实验…………………………………… (1) 实验二 CAN-bus通信实验……………………………… (1) 实验三 USB通信实验…………………………………… (1) 实验四 液晶驱动程序…………………………………… (1) 实验五 霍尔传感器实验………………………………… (1) 实验六 光电传感器实验………………………………… (1) 实验七 IIC模拟实验 …………………………………… (1) 实验八 步进电机驱动实验……………………………… (1)附 录 实验板原理图第一章 51单片机实验板系统概述1.1 单片机实验板结构框图在本所自己设计的单片机接口技术实验板(二代板)基础上实现,结构框图如下:A/DD/A步进电机驱动8×8LED点阵138译码器STC89C52RD无线通信LCD模块驱动键盘和显示驱动温度传感器看门狗蜂鸣器继电器RAM扩展IIC总线ISP下载CAN总线485总线232串口USB接口拨码开关实时时钟运放电路红外对管光电传感器霍尔传感器1.2 实验板各模块功能概述STC89C52RD:本实验板核心部件(即MCU),为51系列单片机,可以通过编程驱动其他模块工作,并实现自动控制。

U S B 接口:可实现USB对本实验板供电及MCU下载程序232 串口:PC机可通过232串口将HEX文件烧写进单片机,还可实现与单片机进行串口通信485 总线:实验板与实验板之间可以通过485进行通信CAN 总线:ISP 下载:I2C 总线:无 线通 信:LCD模块驱动:步进电机驱动:8x8LED点阵:可显示出字母或数字 138译码器:通过译码片选各连接芯片A/D和D/A:可进行A/D和D/A转换红外对射管:可判断是否有障碍物存在于对射管之间霍尔传感器:运放电路:实现比较器和运算放大器光电传感器:蜂鸣器:实现蜂鸣器发声RAM扩展:可用于扩展单片机的数据存储器看门狗:监控单片机程序运行,一旦单片机程序跑飞,复位单片机实时时钟:用于显示实时时间拨码开关:用于向单片机输入8位2进制数继电器:实现单片机对220v交流电用电器的开关控制作用温度传感:对温度进行测量,并将数据送给单片机键盘和显示驱动:用于键盘扫描和数码显示1.3 实验整体思路1) 学生自行购买元件(不超过5人一组,电路板所里提供), 焊接,并完成相关实验2) 单片机基于ISP的,因此不提供仿真器,程序通过RS232直接下载程序。

3) 实验采用分散与集中完成,主要考虑到计算机的缘故,以后如果有条件可以采用一切在试验室完成,达到实际理想的学习效果4) 所里提供7段数码管驱动显示,要求一些实验数据通过数码管显示出来;做某些实验时,提供A/D和D/A驱动程序5) 实验分为必做和选作实验;考虑到成本问题,可以不买或者几组合买一些选做实验中价格较贵的芯片第二章 51单片机汇编及C语言编译环境简介2.1 WAVE 6000 Wave6000是一款功能强大的优秀的单片机程序编辑、调试、仿真中文Windows软件该软件可以配合硬件进行单片机的硬件仿真,也可以单独进行单片机的软件仿真 2.1.1 WAVE 6000仿真器设置在使用WAVE6000进行程序编译和调试之前,必须对仿真器进行设置,否则编译过程中将会出错下面简单介绍设置方法:首先,在确保电脑安装了完整的WAVE6000之后,打开WAVE6000你会看到如图1界面在菜单栏中点击仿真器,在其下拉列表中选择仿真器设置,或者如图1所示,直接点击仿真器设置按钮,出现如图2窗口打开仿真器面板,如图3,选择E6000L,其他的为默认选项,点击“好”即可完成仿真器设置图1图2图3 2.1.2 WAVE6000汇编语言编程仿真器设置好之后,就可以开始编程工作了。

WAVE6000默认的是汇编语言编译器,那我们就先用汇编语言编译程序点击“文件”,选择“新建文件”,会出现一个文本框在里面输入要编译的程序,输入完之后点击图1所示的编译按钮,将会出现如图4所示的提示框,提示对该文件进行保存注意命名时,以“.ASM”结尾,比如”text.ASM”,保存类型不需要设置图4保存好之后,再次点击编译按钮如果程序没有问题,则如图5,信息栏内表示编译通过,生成的可写进单片机的HEX文件已保存在你所设定的文件夹内图52.2 Keil C使用汇编语言之后,我们还可以使用我们更为熟悉的C语言给单片机写程序下面把较为常用的Keil C软件做简单介绍2.2.1 源文件的建立打开Keil C,选择File→New,则出现了一个新的文本输入窗口在该文本中输入C语言源程序输入完毕后,选择File→Save,出现存储文件对话框,输入文件名并保存注意取名字时必须加上扩展名“.c”,例如“text.c”2.2.2 工程的建立选择Project→New Project,出现“创建新的工程”对话框,输入新的工程名并保存,一般与源文件放在同一文件夹内,不必加扩展名,单击“保存”即可 进入下一步,选择目标单片机。

这里选择ATMEL公司的AT89C52作为目标单片机单击ATMEL展开,选择AT89C52,单击“确定”可进入下一步工程建好之后,会出现如图6所示对话框,选择“是”则返回主界面,并注意到工程管理器中已出现一个新的工程,并已有一个“STARTUP.A51”文件,这是Keil C的启动代码源程序文件图6 2.2.3 编译,链接现在就可以往工程中添加文件了在最左侧的工程管理器中,右键点击Source Group 1,选择Add Files to Group,出现加入源程序对话框,选中刚才建立的源程序文件,点击Add,再点击Close这时源程序文件已经加进工程里了这时候点击工程管理器上侧的Rebuid all target files按钮进行编译,如果没有错误的话,则如图7所示,信息栏内表示编译通过图7刚装好的Keil C在默认的情况下是不会生成HEX文件的,必须要手动设置在工程管理器中右键点击Target 1,选择Options for Target,在弹出的对话框中选择Output面板,可以发现Creat HEX files没有被选中,选中它,点击“确定”,再对源文件进行编译,就可生成HEX文件了。

2.3 STCISPSTCISP是一款将编译器生成的HEX文件借助PC机串口写入51系列单片机的软件,主要针对以STC开头的51单片机其基本操作过程简要介绍如下:首先选择MCU型号,本实验板应选择STC89C52RC点击Openfile,打开编译好的HEX文件,选择对应的串口,然后点击Download,就可以将程序写入单片机了如果提示给MCU上电,则检查线路及供电是否正常下载完成后如下图所示图8第三章 实验内容在做试验之前,有三项准备工作要做:第一,把实验板的电源供上,我们选择USB电源供电,将J4的跳线选择USBV;第二,由于此实验板通过串口给单片机写程序,故通信方式先应选择232,将J23和J24的跳线都选择232;第三,单片机复位选择上电复位,用跳线帽将J15的RST和RC连上做完这三项工作,我们就可以进行下面的实验了注:本教程中的程序均采用C语言编写由于ch451芯片和ds1302芯片所使用的单片机管脚复用,故做有关数码显示部分的实验时,请将ds1302芯片拔下,以免造成干扰3.1 必做实验实验一 LED发光二极管实验1、实验目的 掌握MCS-51单片机通用I/O口的输出功能2、实验原理 利用单片机的位操作功能,直接控制LED发光。

其实验板原理图如下图所示:图9如上图,当单片机置P1.5为高电平时,LED熄灭;清零P1.5时,LED点亮若在程序中不断地对P1.5 管脚取反,延时,则可以看到LED灯闪烁发光3、实验要求 将P0口所接的八个LED灯点亮,并延时让其闪烁发光4、实验步骤一、用跳线帽将J6的两端连接上,即P0口所接的8个LED灯的正极通过1K的排阻接到VCC上;二、由于ULN2003芯片使用了单片机的P0.0-P0.3口,故将它拔下,以免影响LED灯的正常闪烁;三、写程序, C语言参考程序如下:#include //包含52头文件#include //要使用“_nop_();”#define uint unsigned intvoid delay_ms(uchar a) //a ms延时子函数{ uint i; while(a>0) { for(i=100;i>0;i--) { _nop_(); } a--; }}void main(){ uchar i,m=0xff; while(1) { for(i=0;i<8;i++) { P0=m; m&=0xfe; m<<=1; delay_ms(100); //延时100ms } //P0口的LED灯由左至右依次点亮 m=0xff; for(i=0;i<8;i++) { P0=m; m&=0x7f; m>>=1; delay_ms(100); } //P0口的LED灯由右至左依次点亮 m=0xff; } //不断循环}程序执行后会看到P0口的LED灯先由左至右依次点亮,然后熄灭,再由右至左依次点亮,不断循环。

实验二 蜂鸣器驱动实验1、实验目的 了解如何用单片机控制蜂鸣器定时发出一段时间的声音2、实验原理 本实验板采用的是只要有一定大小的电流通过就会发出声音的蜂鸣器,故只要给如左图所示管脚高电平,蜂鸣器就会响,反之,蜂鸣器就不会响3、实验要求 让P3.5口所接的蜂鸣器发出声音,延时一段时间,再停止其实验板上的原理图如下图所示: 图104、实验步骤一、将J14的跳线帽接上,用于连接单片机与蜂鸣器;二、编程,参考程序如下:#include //包含52头文件#include //要使用“_nop_();”sbit buzzer=P3^5; //定义口#define uint unsigned intvoid delay_ms(uchar a) //a ms延时子函数{ Uint i; while(a>0) { for(i=100;i>0;i--) { _nop_(); } a--; }}void main(){ buzzer=0; //蜂鸣器停止发声 while(1) { buzzer=!buzzer; //使蜂鸣器开始(或停止)发声 delay_ms(500); //延时500ms }}程序写入单片机之后,将会听到蜂鸣器一会响,一会不响,不断循环。

实验三 I/O管脚按键实验1、实验目的 掌握单片机通用I/O口的输入功能图112、实验原理 如上图所示,当按键按下时,对应管脚被拉成低电平,在程序中使用单片机的位操作功能,不断地使用查询法检测相应管脚是否为低电平,就可判断按键是否被按下3、实验要求 ①用查询法检测到按键,延时去抖,并点亮相应的发光二极管;②用外部中断方式检测按键,点亮相应的发光二极管;4、实验步骤一、将J6的跳线帽插上,用于指示是否检测到按键;二、将J29的跳线帽插上,用于将按键的一端连接到GND上;三、写程序,外部中断方式C语言参考程序如下:#include //包含52头文件#include //要使用“_nop_();”sbit led=P0^0; //定义口#define uint unsigned intvoid delay_ms(uint a) //ams延时子函数{ uint i; while(a!=0) { for(i=100;i>0;i--) { _nop_(); } a--; }}void port_init() //端口初始化子函数{ P0=0xff; //熄灭所有LED P3=0xff; //P3口置高电平}void main(){ port_init(); //端口初始化 EX0=1; //开INT0中断 IT0=0; //触发方式为低电平触发 EA=1; //开所有中断 while(1); //等待中断}void service_int0()interrupt 0 using 3//中断服务子函数{ EA=0; //关所有中断 led=!led; //点亮或熄灭LED delay_ms(500); //延时500ms EA=1; //开所有中断}程序执行后,按下INT0对应按键,会看到P0.0口的LED点亮,再按一下,LED熄灭。

实验四 红外对管实验1、实验目的 了解红外对管工作原理及如何实现与单片机接口2、实验原理 红外对管由红外发射管和红外接收管组成,一般来说透明的为发射管,黑色的为接收管当接通电源后,红外发射管发射一定波长的红外线光束;红外接收管在没接收到红外发射管发射的红外线的时候,电阻很大,达几十兆欧,而在接收到一定波长的红外线的时候,电阻很小,只有几十欧或几百欧本实验板根据光电对管这一特性,特采用如下电路来检测是否有障碍物堵住红外对管当没图11有障碍物堵住对管时,接收管由于接收到发射管发出的红外线,故 电阻很小,获得的分压也很小,近乎为零,通过SN7400与非门之后,输出为高电平;当有障碍物堵住对射管时,输出刚好相反由此可通过单片机对此输出进行检测,就能判断是否有障碍物堵住对管3、实验要求 对红外对管之间是否有障碍物进行检测,用LED灯进行指示4、实验步骤一、将J6的跳线帽插上,用于指示是否有障碍物;二、将J30的跳线帽插上,给红外接收管供上电;三、将J25最左端的跳线帽插上,用于将SN7400的输出端接到单片机的P1.6口;四、写程序,C语言参考程序如下:#include //包含52头文件sbit infrared=P1^6; //定义口void port_init() //端口初始化子函数{ P0=0xff; //P0口所有LED熄灭 P1=0xff; //P3口各管脚置高电平}void main() //主函数{ port_init(); //端口初始化 while(1) //循环执行 { while(infrared==1); //判断对射管之间是否有障碍物 P0=0x00; //有障碍物则点亮P0口所有LED while(infrared==0);//判断障碍物是否离开 P0=0xff; //离开则熄灭P0口所有LED } }程序执行后,用手指放在光电对管之间,会看到P0口的LED全部点亮;把手拿开,LED熄灭。

实验五 定时器输出实验1、实验目的:熟练掌握MCS-51单片机的内部定时器的使用2、实验原理:51单片机内部有两个16位可编程的定时器/计数器,可通过程序设定定时时间或计数脉冲3、实验要求:使用单片机内部定时器T0, 设置其定时时间为10ms,并对其计数,让LED每2秒钟点亮一次,点亮时间为200ms4、实验步骤一、将J6的跳线帽插上,接通LED的VCC端;二、写程序,C语言参考程序如下:#include //包含52头文件#define uchar unsigned charuchar i; //定义全局变量void port_init() //端口初始化子函数{ P0=0xff; //熄灭P0口所有LED}void timer_init() //定时器T0初始化子函数{ TMOD=0x01; //方式1 TH0=0xd8; TL0=0xf0; //设定初值,定时时间为10ms EA=1; //开所有中断 ET0=1; //开T0中断}void main() //主函数{ port_init(); //端口初始化 timer_init(); //定时器T0初始化 TR0=1; //T0开始定时 while(1) //循环执行 { while(i==200)P0=0x00; //时间到2秒,点亮P0口所有LED while(i==220) P0=0xff; i=0; //点亮时间到200ms,熄灭所有LED }}void service_timer0()interrupt 1 using 3//T0中断服务子函数{ i++; //计算定时器溢出次数 TH0=0xd8; TL0=0xf0; //重装定时器初值}程序执行后会看到,P0口的LED灯2秒亮一次,点亮时间200ms。

实验六 看门狗实验1、实验目的:了解看门狗的工作原理及它在单片机系统中的作用2、实验原理:看门狗是一个监控单片机程序运行的定时器电路,一般有一个输入端(喂狗端)和一个与单片机复位管脚相连的输出端只要在程序运行时定时给看门狗一个喂狗信号,单片机程序运行正常,如果长时间没去喂狗(一般在程序跑飞时),看门狗就会给单片及复位端输出一个复位信号,使单片机复位下图为看门狗MAX706该实验板接线图WDI为喂狗短端图123、实验要求:将定时器输出实验的程序写入单片机,复位端选择WDG(看门狗复位),观察程序运行;在程序中加入定时喂狗,再观察程序运行4、参考程序:在定时器中断服务程序中加入喂狗指令:“P3^4=!P3^4;”,观察程序运行其中P3.4管脚和MAX706喂狗端相连实验七 CH451驱动数码管实验1、实验目的:了解CH451芯片工作原理及与单片机的接口2、实验原理:CH451是一个整合了数码管显示驱动和键盘扫描控制的多功能外围芯片它实现数码显示和键盘扫描的具体方法请参照CH451数据手册实验板原理图如下图所示:图13其接线电路请参照附录中的实验板电路图3、实验要求:参照ch451数据手册,看懂ch451数码管驱动程序,能控制显示特定的数字和移动、闪烁效果。

4、写程序,C语言参考程序如下所里提供数码管驱动程序,具体应用方法如下:#include //包含52头文件#include //要使用“_nop_();”#define uchar unsigned char#define uint unsigned int#define reset 0x201#define leftmove 0x300#define rightmove 0x302#define leftround 0x301#define rightround 0x303 //定义各控制字sbit ch451_dclk=P1^2; sbit ch451_din=P1^1;sbit ch451_load=P1^3; //定义口//******************闪烁控制字采用查表法********************//uint f[6]={0x601,0x602,0x604,0x608,0x610,0x620}; void delay_ms(uint t) //t ms延时子函数{ uint i; while(t>0) { for(i=100;i>0;i--) { _nop_(); } t--; }}void ch451_init() //ch451初始化子函数{ ch451_din=1; ch451_din=0; ch451_din=1; //送din一个低脉冲,使能4线输入}void ch451_write(uint k) //写ch451控制字子函数{ uchar i; ch451_load=0; for(i=12;i>0;i--) { ch451_dclk=0; ch451_din=k&0x01; k>>=1; ch451_dclk=1; } //12位数据由低到高依次输入,dclk上升沿锁存 ch451_load=1; //load上升沿数据加载进ch451}void display(uchar a,uchar b)//显示子函数,使第a(a=0,1,2,3,4,5)个数码管显示字符b(b=0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f){ uchar i; ch451_load=0; for(i=8;i>0;i--) { ch451_dclk=0; ch451_din=b&0x01; b>>=1; ch451_dclk=1; } a|=0x08; for(i=4;i>0;i--) { ch451_dclk=0; ch451_din=a&0x01; a>>=1; ch451_dclk=1; } ch451_load=1;}void flicker(uint d) //闪烁控制子函数,使第d(d=0,1,2,3,4,5)位数码管闪烁{ uint j; j=f[d]; //查到相应闪烁控制字 ch451_write(j); //写入ch451 }void main(){ ch451_write(reset); //复位ch451 ch451_init(); //ch451初始化 display(0,1); display(1,2); display(2,3); display(3,4); display(4,5); display(5,6); //让数码管各位显示 ch451_write(0x5e0); //设定显示参数,使能六位数码管,译码方式为BCD译码 ch451_write(0x401); //设定系统参数,使能数码显示,关闭键盘扫描和看门狗 delay_ms(1000); //延时1s ch451_write(leftmove); //字数据左移 delay_ms(1000); //延时1s ch451_write(rightmove); //字数据右移 delay_ms(1000); //延时1s ch451_write(leftround); //字数据左循环 delay_ms(1000); //延时1s ch451_write(rightround);//字数据右循环 delay_ms(1000); //延时1s flicker(0); //第0位数码管闪烁 while(1); //等待} 程序执行后会看到数码管显示“”;一秒后左移一位,最右端补0;一秒后右移一位,返回原来显示;一秒后左循环一次,最右端补0;一秒后右循环一次,返回原来显示;一秒后数字1闪烁。

实验八74HC138译码实验1、实验目的:学习用138译码器实现HC245等芯片的地址分配 2、实验原理:74HC138是一个3线-8线译码器,由译码器逻辑功能可知,只要输入端输入确定的电平就会选通特定的输出端,因此,可将输入端作为地址线,分配特定的地址就能选通输出端所连接的HC245或其他实验板上的连接图如下图所示:图143、实验要求:分配HC245等的I/O地址4、实验步骤:一、由原理图可知,拨码开关和LCD分别是作为单片机的一个外部数据存储单元138译码器U18的使能端G1接单片机P2.7引脚,输出端Y0接245使能端,故拨码开关的地址应为8000H-8FFFH;输出端Y1接LCD使能端,故LCD的地址为9000H-9FFFH 二、138译码器U17的输出端Y0与8*8LED模块的74HC595芯片的片选端相连,Y1与AD模块TLC1543芯片的片选端相连,Y2与DA模块TLC5615片选端相连,因此,按照上面相同方法即可计算出各个模块对应的地址 实验九 拨码开关信号输入实验1、实验目的:熟练掌握51单片机I/O口的输入输出功能,并了解74HC245与拨码开关跟单片机的接口2、实验原理:74HC245是一片双向总线发送/接收器,在本实验板中用于将拨码开关的状态输入给单片机。

由此,通过上个实验,通过译码电路片选245,单片机便可将拨码开关状态读入并通过数码管或LED显示拨码开关及74HC245与单片机连接请参照实验板电路图拨码开关模块原理图如下图所示:图153、实验要求:根据译码电路,确定HC245的I/O地址拨码开关看作是单片机的一个外部RAM单元,采用读片外RAM方式,选通HC245,并读取开关状态将拨码开关状态显示在数码管上 4、程序编写,C语言参考程序如下:#include //包含52头文件#include //包含数码显示头文件#include //要使用“XBYTE”#define read_245 XBYTE[0x8FFF] //定义245地址uint key;void main(){ uint key1; ch451_write(reset); //复位ch451 ch451_init(); //ch451初始化 while(1) { key=read_245; //读拨码开关状态 key=~key; //取反拨码开关状态,使其拨上为1,拨下为0 key1=key&0x0f; //取状态低位 display(1,key1); //显示在第1位数码管 key1=key&0xf0; //取状态高位 key1>>=4; //右移四位以便数码显示 display(0,key1); //显示在第0位数码管 ch451_write(0x5a0); //设定显示参数,使能两位数码管,译码方式为BCD ch451_write(0x401); //设定系统参数,使能数码显示,关闭键盘扫描和看门狗 }} 程序执行后,拨码开关的16进制码值就会显示在数码管上了,高位在前,地位在后。

注:数码显示头文件由实验室提供实验十 读写片外RAM62256实验1、实验目的:熟练掌握单片机外部数据存储器的读写操作2、实验原理:62256同单片机的接线方式见附录对片外RAM进行读操作,可根据其存储单元确定其地址,汇编中使用“MOVX A,@DPTR”指令便可将片外RAM对应单元中的数读到累加器A;使用”MOVX @DPTR,A”指令便可将累加器A中的数写到片外RAM对应单元中62256与单片机接口请参照实验板电路图62256引脚图如下图所示:图163、实验要求:将拨码开关状态写入片外RAM2009H单元中,并从中读出,并用数码管显示出来注:单片机P2.7管脚接62256片选端,故在使用62256时,地址最高位应为04、写程序,C语言参考程序如下:#include //包含52头文件#include //包含数码显示头文件#include //要使用“XBYTE”#define read_245 XBYTE[0X8FFF]#define write_62256 XBYTE[0x2009]#define read_62256 XBYTE[0x2009]//定义245及62256单元地址void main() //主函数{ uint key0,key1,key2; ch451_write(reset); //复位ch451 ch451_init(); //ch451初始化 while(1) //循环执行 { key0=read_245; //读拨码开关状态 key0=~key0; //取反拨码开关状态,使其拨上为1,拨下为0 write_62256=key0; //拨码开关状态写入62256的2009H单元中 key1=read_62256; //从62256的2009H单元中读出拨码开关状态 key2=key1&0x0f; //取状态低位 display(1,key2); //显示在第1位数码管 key2=key1&0xf0; //取状态高位 key2>>=4; //右移四位以便数码显示 display(0,key2); //显示在第0位数码管 ch451_write(0x5a0); //设定显示参数,使能两位数码管,译码方式为BCD ch451_write(0x401); //设定系统参数,使能数码显示,关闭键盘扫描和看门狗 }} 程序执行后,会看到和拨码开关实验同样的实验效果。

实验十一 运放电路实验1、实验目的:学会使用LM324作为比较器和同向比例运算放大器2、实验原理:LM324为一块含有四个运算放大器的芯片,可实现比较和运算放大其原理图如下图所示:图173、实验要求:通过调节可变电阻器RV2,观察LED灯D17的亮灭变化;外接输入电压,测量输出电压,计算放大倍数实验十二 温度传感器实验1、实验目的:学会用单片机进行温度测量和显示2、实验原理:DS18B20数字温度计提供12位温度读数,指示器件温度具体工作原理请参照DS18B20数据手册,DS18B20引脚图如下图所示:图183、实验要求:从传感器DS1820读回温度数据,转化为温度后,在数码管上显示4、实验程序,C语言参考程序如下:#include //包含52头文件#include //包含数码显示头文件#include //要使用“_nop_();” uint temp;//**************温度小数部分用查表法***********//uchar ditab[16]={0x00,0x06,0x12,0x18,0x25,0x31,0x37,0x43,0x50,0x56,0x62,0x68,0x75,0x81,0x87,0x93}; uchar temp_data[2]={0x00,0x00}; //读出温度暂存uchar dis[7]; //显示单元数据,共6个数据和一个运算时使用void delay(uint t) //延时t个11微秒{ for (;t>0;t--);}ow_reset(void) //复位DS18B20{ char presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_();//从高拉到低 DQ=0; delay(50); //550 us DQ=1; delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 } delay(45); //延时500 us presence=~DQ; } DQ=1; //拉高电平}void write_byte(uchar val) //写1个字节{ uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); //从高拉倒低 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1位 } DQ=1; delay(1);}uchar read_byte(void) //读1个字节{ uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80; delay(6); //66 us } DQ=1; return(value); }uint read_temp() //读温度值{ ow_reset(); //总线复位 delay(200); write_byte(0xcc); //发命令 write_byte(0x44); //发转换命令 ow_reset(); delay(1); write_byte(0xcc); //发命令 write_byte(0xbe); temp_data[0]=read_byte(); //读温度值的第字节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。

return temp; //返回温度值}void work_temp(uint tem) //温度值处理{ uchar n=0; if(tem>63488) // 温度值正负判断 { tem=65536-tem;n=1; // 负温度求补码,标志位置1 } dis[6]=tem&0x0f; // 取小数部分的值 dis[0]=ditab[dis[6]]&0x0f; // 存入小数部分显示值 dis[1]=ditab[dis[6]]&0xf0; dis[1]>>=4; //小数部分高位在前地位在后 dis[6]=tem>>4; // 取中间八位,即整数部分的值 dis[4]=dis[6]/100; // 取百位数据暂存 dis[3]=dis[6]/10%10; // 取十位数据暂存 dis[2]=dis[6]%10; // 取个位数据暂存 dis[2]|=0x80; //个位显示小数点 if(!dis[4]) { dis[4]=0x10; //百位为0时不显示 if(!dis[3]) { dis[3]=0x10; //十位为0时不显示 } } if(n) { dis[5]=0x12; //负温度时最高位显示"-" } else dis[5]=0x10; //否则不显示}void main(){ ch451_write(reset); //复位ch451 ch451_init(); //初始化ch451 ow_reset(); //复位DS18B20 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令,先转换一次 while(1) { work_temp(read_temp()); //处理温度数据 display(0,dis[5]); display(1,dis[4]); display(2,dis[3]); display(3,dis[2]); display(4,dis[1]); display(5,dis[0]);//显示温度数据 ch451_write(0x5e0);//使能6位数码显示,译码方式选择BCD译码 ch451_write(0x401); //使能数码显示,关闭看门狗及键盘扫描 }} 程序执行后,室内温度就会显示在数码管上了。

实验十三 ch451驱动扫描键盘实验1、实验目的:学习使用CH451驱动和扫描键盘并实现单片机控制2、实验原理:CH451是一个整合了数码管显示驱动和键盘扫描控制的多功能外围芯片它实现数码显示和键盘扫描的具体方法请参照CH451数据手册原理图同CH451驱动数码显示实验3、实验要求:检测键盘,确定有键按下后,读入键码,并在数码管上显示4、实验程序,C语言参考程序如下:#include //包含52头文件#include //包含数码显示头文件sbit ch451_dout=P1^6; //定义口uchar ch451_key; //存放键盘中断中读取的键值void ch451_read() //读键值子函数{unsigned char i; //定义循环变量unsigned char command,keycode; //定义控制字寄存器,和中间变量定时器command=0x07; //读取键值命令的高4位0111Bch451_load=0;for(i=0;i<4;i++){ch451_dclk=0; ch451_din=command&1; //低位在前,高位在后 command>>=1; //右移一位 ch451_dclk=1; //dclk上升沿数据存入寄存器}ch451_load=1; //load上升沿加载数据进ch451keycode=0; //清除keycodefor(i=0;i<7;i++){ch451_dclk=1; keycode<<=1; //数据作移一位,高位在前,低位在后 keycode|=ch451_dout; //从高到低读入451的数据ch451_dclk=0; //dclk下降沿数据从dout输出} ch451_key=keycode; }void main(){uchar a,b[6],j=0; ch451_write(reset); //复位ch451ch451_init(); //初始化ch451display(0,b[0]); display(1,b[1]); display(2,b[2]); display(3,b[3]); display(4,b[4]); display(5,b[5]); //数码管各位初始化均显示0 ch451_write(0x403); //使能数码显示和键盘扫描,关闭看门狗 ch451_write(0x5e0); //使能六位数码管,译码方式为BCD while(1) {while(ch451_dout!=0); //等待ch451的键盘中断 ch451_read(); //发出读取键值命令并读取键值 a=ch451_key; if(a==0x40) j=0; //第一个键按下,第0位数码管闪烁 if(a==0x41) j=1; //第二个键按下,第1位数码管闪烁 if(a==0x42) j=2; //第三个键按下,第2位数码管闪烁 if(a==0x43) j=3; //第四个键按下,第3位数码管闪烁 if(a==0x48) j=4; //第五个键按下,第4位数码管闪烁 if(a==0x49) j=5; //第六个键按下,第5位数码管闪烁 if(a==0x4a) { b[j]++; if(b[j]<10) b[j]=b[j]; else b[j]=0; display(j,b[j]); }; //第七个键按下,闪烁位数码管加一 if(a==0x4b) { if(b[j]>0) b[j]--; else b[j]=0; display(j,b[j]); }; //第八个键按下,闪烁位数码管减一 flicker(j); //调用数码管闪烁 }}程序执行后,会看到数码管全显示0,按下第1到6个键,对应的数码管闪烁,按下第7个键,闪烁的数码管数值加一,按下第8个键,闪烁的数码管减一。

键盘顺序为从左到右,从上到下注:在本实验进行之前需将J25的CH451-DOUT和P1.6用跳线帽连接起来实验十四 RS232与电脑通信实验1、实验目的:掌握单片机与PC机进行数据通信2、实验原理:单片。

下载提示
相关文档
正为您匹配相似的精品文档