adc0804启动转换时cs不是要拉低吗 为何cs可以一直是低音炮高电平输入

您是不是在找:
买家还在看:
当前位置:
扫一扫,随时随地关注行业资讯
detail3e达人选购¥330.00¥410.00¥160.00¥380.00¥300.00
detail3e周边优质供应商山东省济南市山西省晋中市山西省太原市浙江省宁波市
同参数产品
同参数产品
同参数产品
同参数产品
同参数产品
慧聪网厂家深圳市超诚微科技有限公司为您提供ADC0804CN的详细产品价格、产品图片等产品介绍信息,您可以直接联系厂家获取ADC0804CN的具体资料,联系时请说明是在慧聪网看到的。
detail3e相关商品推荐¥330.00¥410.00¥160.00¥380.00¥300.00¥1200.00¥1200.00¥0.20热门商品推荐 ¥0.28 ¥0.62 面议 面议 ¥0.64 面议 面议 ¥0.10
detail3e店内热门商品¥1.00¥1.00¥12.00¥12.00
detail3e其他电子产品相关资源其他电子产品热门产品搜索其他电子产品相关热门专题更多&热门商机最新商机
提示:您在慧聪网上采购商品属于商业贸易行为。以上所展示的信息由卖家自行提供,内容的真实性、准确性和合法性由发布卖家负责,请意识到互联网交易中的风险是客观存在的。推荐使用,保障您的交易安全!
所在地:广东省&&
联系人:宁香成 & 女士
075 ******
请供应商联系我
手机号不能为空
姓名不能为空
请供应商联系我
您对该公司的咨询信息已成功提交请注意接听供应商电话。
detail3e关于电子产品
detail3e您是不是在找
您采购的产品:
请输入采购产品
您的手机号码:
请输入手机号码
*采购产品:
请输入采购产品
*采购数量:
请输入采购数量
*采购截止日期:
请输入正确的手机号码
请输入验证码
*短信验证码:
<input id="valid_Code1" maxlength="6" placeholder="请输入验证码" name="VALIDCODE" class="codeInput" onkeyup="this.value=this.value.replace(/\D/g,'')" onkeypress="if(event.keyCode
57) event.returnValue =" type="text">
免费获取验证码
为了安全,请输入验证码,我们将优先处理您的需求!
请输入验证码
发送成功!
慧聪已收到您的需求,我们会尽快通知卖家联系您,同时会派出采购专员1对1为您提供服务,请您耐心等待!
075 ******
联系人:宁香成&业务 销售经理
公司名称:深圳市超诚微科技有限公司
备注:点击关注按钮后才可自动收到卖家电话
请输入正确的手机号码
请输入验证码
*短信验证码:
免费获取验证码
为了安全,请输入验证码,我们将优先处理您的需求!
请输入验证码
按字母分类 :当前位置: >>
keil的使用 ADC0804数模转换DAC0832模数转换
李俊良专属Keil 软件的使用随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语 言到逐渐使用高级语言开发,其中主要是以 C 语言为主,市场上几种常见的单 片机均有其 C 语言开发环境。 这里以最为流行的 80C51 单片机为例来学习单片机的 C 语言编程技术。 大家 都有 C 语言基础,但是编单片机程序,大家还得找专门的书来学习一下。这里我们 只介绍 Keil 这种工具软件的用法。 学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil 软件是目最流行开发 80C51 系列单片机的软件,Keil 提供了包括 C 编译器、宏 汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境(?Vision)将这些部份组合在一起。 下 面 我 以 一 个 实 验 举 一 个 例 子 , 一 步 一 步 学 习 Keil 软 件 的 使 用 。 首先我们看硬件原理图: 很明显,要点亮使发 光二极管,必须使单 片机的 I/O 口 P1.0 输 出低电平。于是我们 的任务就是编程序使 P1.0 输出地电平。1. 使用 Keil 前必须先安装。安装过程简单,这里不在叙述。 2. 安装好了 Keil 软件以后,我们打开它。打开以后界面如下:-1- 李俊良专属3. 我们先新建一个工程文件,点击“Project-&New Project…”菜单,如下图, :3. 选择工程文件要存放的路径 ,输入工程文件名 LED, 最后单击保存.4. 在弹出的对话框中选择 CPU 厂商及型号-2- 李俊良专属5. 选择好 Atmel 公司的 AT89S52 后 , 单击确定1.在接着出现的对话框中选择“是” 。5. 新建一个 C51 文件 , 单击左上角的 New File 如下图所示 :-3- 李俊良专属6. 保存新建的文件,单击 SAVE 如下图:2.在出现的对话框中输入保存文件名 MAIN.C(注意后缀名必须为.C) ,再单击 “保存” ,如下图;7. 保存好后把此文件加入到工程中方法如下 : 用鼠标在 Source Group1 上单 击右键 , 然后再单击 Add Files to Group ‘Source Group 1&#39; 如下图:-4- 李俊良专属8. 选择要加入的文件 , 找到 MAIN.C 后 , 单击 Add, 然后单击 Close-5- 李俊良专属9.在编辑框里输入如下代码 :10.到此我们完成了工程项目的建立以及文件加入工程 , 现在我们开始编译工 程如下图所示 : 我们先单击编译, 如果在错误与警告处看到 0 Error(s) 表示编译通过 ;11.生成 .hex 烧写文件,先单击 Options for Target,如图;-6- 李俊良专属12.在下图中,我们单击 Output, 选中 Create HEX F。再单击“确定” 。13.打开文件夹‘实验 1’ ,查看是否生成了 HEX 文件。如果没有生成,在执行一 遍步骤 10 到步骤 12,直到生成。以上是 Keil 软件的基本应用,更多的高级应用请大家去查找资料. 以下将介绍的是如何将 HEX 文件下载到单片机里面。我们用的下载软件是 Easy 51Pro-7- 李俊良专属Easy51Pro v2.0 软件的使用Easy51Pro v2.0是单片机下载工具: 在我们的QQ群里有这个软件,大家可以 下载来直接用,而不用安装。下面我给大家简单的说一下用法: 1.硬件连接;必须满足下面的每一个条件才能下载。如图2.打开软件;3.检测器件,注意右边的信息提示。如果没有检测到器件,检查硬件连接。-8- 李俊良专属3.打开 HEX 文件。先单击“ (自动)打开文件” 。在“实验 1”的文件夹里找到文 件 LED.hex 文件.4.最后单击“自动完成” ,OK 大功告成。5.大功既然告成,就要看到效果。现在我们在实验板的左下角找到 JK7,用导线 连到 P1.0 上,LED2 被点亮了把。是不是很有成就感。如果以上的实验你觉得是小儿科,太简单了。那么请关注以下的内容。-9- 李俊良专属一. 闪烁灯 [实验任务] 在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭 的时间间隔为 0.2 秒。 [硬件电路] 与上面点亮小灯的连接完全相同。 [C 语言源程序] #include &AT89X51.H& /*************************************************************************************第一行是一个&文件包含&处理。 所谓&文件包含&是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有 4 行, 但 C 编译器在处理的时候却要处理几十或几百行。这里程序中包含 REG51.h 文件的目的是为了要使用 P1 这个符号,即通知 C 编译器,程序中所写的 P1 是指 80C51 单片机的 P1 端口而不是其它变量。*****************************************************************************/ void delay02s(void) //延时 0.2 秒子程序 { unsigned char i,j,k; //定义 3 个无符号字符型数据。 for(i=20;i&0;i--) //作循环延时 for(j=20;j&0;j--) for(k=248;k&0;k--); } void main(void) //每一个 C 语言程序有且只有一个主函数, { while(1) //循环条件永远为真,以下程序一直执行下去。 { P1_0=0; // I/O 口 P1.0 输出低电平,小灯被点亮。 delay02s(); //延时经过 0.2 秒。 P1_0=1; // I/O 口 P1.0 输出高电平,小灯熄灭。 delay02s(); //延时经过 0.2 秒。 } }二.广告灯的左移右移[实验任务] 做广告灯的左移右移, 八个发光二极管分别接在单片机的 P3.0-P3.7 接口 上, 输出 “0” 时, 发光二极管亮, 开始时 P3.0→P3.1→P3.2→P3.3→┅→P3.7 →P3.6→┅→P3.0 亮,重复循环。 [硬件电路]- 10 - 李俊良专属5V1k1k1k1k1k1k1k1kC8 JK-Y 22 12 M2 0 1 9 1 8C7 221 71 61 51 41 31 21 11 098765432 3 9A E R G3 /TD L /P O P .1 xRT P S /V DP .3 N 1 3 /I TP .2 N 0 3 /I TP .0 x 3 /RDP .7 D 3 /RGD NP .5 1 3 /TP .4 0 3 /TP .7 1P .6 1P .5 1P .4 1P .3 1P .2 1P .1 1 P .0 0XA1 TLXA2 TLP .6 R 3 /WE /Vp A pPE SNAT89S52VC C P .6 0 P .5 0 P .4 0 P .3 0 P .2 0 P .1 0P .0 2P .1 2P .2 2P .3 2P .4 2P .5 2P .6 2P .7 22 12 22 32 42 52 62 72 82 93 03 13 23 3P .7 03 43 53 63 73 84 0P .0 115V[DPY-1 实验板连接] 用 8 芯排线把 JP-LSH 连接到 JP12 上。 [C 语言源程序]#include &AT89X52.H& unsigned char a,b; void delay(void) //延时子程序 { unsigned char m,n,s; for(m=20;m&0;m--) for(n=20;n&0;n--) for(s=248;s&0;s--); } void main(void) //主程序 { while(1) //循环条件永远为真,以下程序一直执行下去。 { temp=0 P3= //直接对 I/O 口 P3 赋值,使.P3.0 输出低点平。 delay(); //延时 for(i=1;i&8;i++) //实现广告灯的从右到左移动(以原理图为准) { a=temp&&i; b=temp&&(8-i); P3=a|b; delay(); } for(i=1;i&8;i++) //实现广告灯的从左到右移动 {- 11 - 李俊良专属a=temp&&i; b=temp&&(8-i); P3=a|b; delay(); } } }三. 按键识别[实验任务] 通过按下一次按键,使广告灯向左移动一位,直到最后一位,在向右移动。 [硬件电路]5V 1k 1k 1k 1k 1k 1k 1k 1k(大家注意到这一个电路图与上 一个实验的电路图只多了一个按键 和一个 5.1K 的电阻。 )C 8 K-Y J 22 12 M2 0 1 9 1 8C7 221 71 61 51 41 31 21 11 098765432 P.2 1 P.1 1 3 9 P .0 0 P .1 0A E R G3 /TD L /P O P .1 xRT P S /V DP .3 N 1 3 /I TP .2 N 0 3 /I TP.0 x 3 /RDP.7 D 3 /RGD NP.5 1 3 /TP.4 0 3 /TXA1 TLXA2 TLP.7 1P.6 1P.5 1P.4 1P.3 11 4 0 VC C P.0 1P.6 R 3 /WE /Vp A pPE SNAT89S 52P .6 0 P .5 0 P .4 0 P .3 0 3 6 3 7 P .2 0 3 8P .0 2P .1 2P .2 2P .3 2P .4 2P .5 2P .6 2P .7 22 12 22 32 42 52 62 72 82 93 03 13 2P .7 0 3 33 43 5B Y1 5V 5K15V[DPY-1 实验板连接] 用 8 芯排线把 JP-LSH 连接到 JP12 上。用一根导线把 JK5 接到 P2.1 上。 [实验原理] 从图中可以看出 P2.1 在按键没有按下时接的是高电平, 按键按下时接的就是 低电平了。所以我们只要判断 P2.1 的电平就可以知道按键是否被按下了。 而在按键按下的过程中,由于抖动,将产生干扰,在按下的过程中,一旦有 干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时 候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情 况下,我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键 按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入 了稳定的状态。我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从 而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得 已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于 干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。 [C 语言源程序] #include &reg52.h& sbit BY1=P2^1; //定义按键的输入端 //按键计数,每按一下,count 加 1 unsigned char a,b;- 12 - 李俊良专属void delay10ms(void) //延时程序 { unsigned char i,j; for(i=20;i&0;i--) for(j=248;j&0;j--); } key() //按键判断程序 { if(BY1==0) //判断是否按下键盘 { delay10ms(); //延时,软件去干扰 if(BY1==0) //确认按键按下 { count++; //按键计数加 1 if(count==8) //计 8 次重新计数 { count=0; } //将 count 清零 } while(BY1==0);//按键锁定,每按一次 count 只加 1. } } move() //广告灯向左移动移动函数 { a=temp&& b=temp&&(8-count); P3=a|b; } main() { count=0; //初始华参数设置 temp=0 P3=0 P3= while(1) //永远循环,扫描判断按键是否按下 { key(); //调用按键识别函数 move(); //调用广告灯移动函数 } }四.数码管动态显示[实验任务] P0 端口接动态数码管的字形码笔段, 端口接动态数码管的数位选择端, P2 动态显示“1234”字样; [硬件电路]- 13 - 李俊良专属5V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VPD P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PSEN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g da b c d e f g dp a b f eC0a b c dpC2 C3a b c dpC4g df eg df eg db c dpc dp注意: P0 口还有 在 1K 的排阻作为上拉 电阻,在以后的电路 原理图中都是如此, 请大家不要忽略了P2_7 6P2_6 8P2_5 9C722 JK-Y 12 MC822AT89S52[DPY-1 实验板连接] 用排线把 JP-CODE 连到 JP8 是,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 JP-CS 连到 JP14 上,注意:4H 接 P2.4;3H 接 P2.5;2H 接 P2.6;1H 接 P2.7; [实验原理] 七段 LED 显示器内部由七个条形发光二极管和一个小圆点发光二极管组成, 根 据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED 数码管的 a-dp 七个发光二极管因以不同亮暗的组合就能形成不同的字 形,这种组合称之为字形码,下面给出共阴极的字形码 “0”3FH “1”06H “2”5BH “3”4FH “4”66H “5”6DH “6”7DH “7”07H “8”7FH “9”6FH “A”77H “b”7CH “C”39H “d”5EH “E”79H “F”71H 由于显示的数字 0-9 的字形码没有规律可循,只能采用查表的方式来完成我们 所需的要求了。这样我们按着数字 0-9 的顺序,把每个数字的笔段代码按顺序 排好!建立的表格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH, 07H,7FH,6FH 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用 人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输 出(字形选择) ,另一接口完成各数码管的轮流点亮(数位选择) 。 [C 语言源程序] #include &reg52.h& code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //显示段码 void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) //如果 tc 为 0 则终止延时 { //局部正整数变量 i for(i=0; i&100; i++); //执行 400 次将耗时 1 毫秒 tc--; //tc 计数减一 } } void Led(int date) //显示函数 {- 14 -P2_4 12P2_7 P2_6 P2_5 P2_4P1_0 11 7P1_1 4P1_2 2P1_3 1P1_4 P1_5 10 5P1_6 3P1_7DPY 4-LEDLED 李俊良专属P2=P2&0x7f; //P2.7 输出低电平,选通千位数 P0=seg7code[date/1000]; //取出千位数,查表,输出。 Delay(8); //延时 P2=P2|0xf0; //销隐 P2=P2&0 //P2.6 输出低电平,选通百位数 P0=seg7code[date%]; //取出百位数,查表,输出。 Delay(8); //延时 P2=P2|0xf0; //销隐 P2=P2&0 //P2.5 输出低电平,选通十位数 P0=seg7code[date%100/10]; //取出十位数,查表,输出。 Delay(8); //延时 P2=P2|0xf0; //销隐 P2=P2&0 P0=seg7code[date%10]; //取出个位数,查表,输出。 Delay(8); P2=P2|0xf0; } main() { int display_date=1234; //定义并赋值要显示的数据 while(1) { Led(display_date);//调用显示函数显示数据 display_date } }五.4×4 矩阵式键盘识别[实验任务] 用 AT89S51 的并行口 P3 接 4×4 矩阵键盘, P3.0-P3.3 作输入线, P3.4 以 以 -P3.7 作输出线;在每一个数码管上显示每个按键的“0-F”序号。 [硬件电路]5V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 JK-Y 12 M P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VPD P0 .7 P3 .0 /RxD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PSEN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /RD P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 210 4 8 C1 5 9 d2 6 A E3 7 b FC7 22 C8 22P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g dP 11 1_0 7 P 1_1 4 P 1_2 2 P 1_3 1 P 1_4 P 10 1_5 5 P 1_6 3 P 1_7a b c d e f g dp a b f c e dpC0a b f c e dpC2 C3a b f c e dpC4g dg dg db c dpP 2_7 6P 2_6 8P 2_5 9AT89S52[DPY-1 实验板连接] 用排线把 JP-CODE 连到 JP8 是,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 JP-CS 连到 JP14 上,注意:4H 接 P2.4;3H 接 P2.5;2H 接 P2.6;1H 接 P2.7;用排- 15 -P 2_4 12P2_7 P2_6 P2_5 P2_4DPY 4-LEDLED 李俊良专属线把 JP-KEY 连到 JP12 上,注意 1,2,3,4,5,6,7,8,分别对应 P3.0,P3.1, P3.3,P3.4…… [实验原理] 每个按键有它的行值和列值 , 行值和列值的组合就是识别这个按键的编码。 矩阵的行线和列线分别通过两并行接口和 CPU 通信。键盘处理程序的任务是:确 定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断 开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并 行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软 件查表,查出该键的功能。 [C 语言源程序] #include &reg52.h& unsigned char code seg7code[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay10ms(void) //延时程序 { unsigned char i,j; for(i=20;i&0;i--) for(j=248;j&0;j--); } void Getch ( ) { unsigned char X,Y,Z; P3=0 P3=0x0f; //先对 P3 置数 行扫描 if(P3!=0x0f) //判断是否有键按下 {delay10ms(); //延时,软件去干扰 if(P3!=0x0f) //确认按键按下 X = P3; { X=P3; //保存行扫描时有键按下时状态 P3=0xf0; //列扫描 Y=P3; //保存列扫描时有键按下时状态 Z=X|Y; //取出键值 switch ( Z ) //判断键值(那一个键按下) { case 0xee: k=0; //对键值赋值 case 0xde: k=1; case 0xbe: k=2; case 0x7e: k=3; case 0xed: k=4; case 0xdd: k=5; case 0xbd: k=6; case 0x7d: k=7; case 0xeb: k=8; case 0xdb: k=9;- 16 - 李俊良专属case 0xbb: k=10; case 0x7b: k=11; case 0xe7: k=12; case 0xd7: k=13; case 0xb7: k=14; case 0x77: k=15; } } } } //请注意写程序时的格式规范,此处是为了节省纸张 void main(void) { while(1) { P3=0 Getch(); P0=seg7code[k]; //查表 LED 输出 P2=0x0f; //输出相同的四位数据。 } }六.按键中断识别[实验任务] 采用中断技术,每按一下按键,计数器加 1,并用 LED 显示出来。 [硬件电路]5V 5K1 5V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VPD P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PS EN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g dP1_0 11 7P1_1 4P1_2 2P1_3 1P1_4 P1_5 10 5P1_6 3P1_7a b c d e f a b c dpC0g dp a a b c dpC4f eg db c dpC2f eC3g df eg db c dpINT0DPY 4-LEDC722 JK-Y 12 MC822AT89S52注意:我们只用了 4 位数码管中的两位。 [DPY-1 实验板连接] 用排线把 JP-CODE 连到 JP8 上,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 JP-CS 连到 JP14 上,注意: 2H 接 P2.0; 1H 接 P2.1; 中断按键已经接好。 [实验原理] 以上的两个关于按键识别的实验的程序都是采用扫描的方式来实现的,CPU 的利用率比较低,在实时性要求高比较高,要求快速响应的场合不太实用。中断 方式可以满足快速响应的要求。关于中断技术的具体内容,请大家参照教材。 [C 语言源程序] #include&reg52.h& unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char dispcount=0; //计数 sbit gewei=P2^0; //个位选通定义- 17 -12LED689 李俊良专属sbit shiwei=P2^1; //十位选通定义 void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) { for(i=0; i&100; i++); tc--; } } void ExtInt0() interrupt 0 //中断服务程序 { dispcount++; //每按一次中断按键,计数加一 if (dispcount==100) //计数范围 0-99 {dispcount=0;} } void LED( ) //LED 显示函数 { if(dispcount&=10) //显示两位数 { shiwei=0; P0=table[dispcount/10]; Delay(8); shiwei=1; gewei=0; P0=table[dispcount%10]; Delay(5); gewei=1; } else //显示一位数 { shiwei=1; gewei=0; P0=table[dispcount]; Delay(8); } } void main() { TCON=0x01; //中断设置 IE=0x81; while(1) //循环执行 { LED(); //只须调用显示函数 } }- 18 - 李俊良专属七.定时器 T0 的应用---9.9 秒计时设计[实验任务] 开始时,显示“00” ,第 1 次按下 BY1 后就开始计时。第 2 次按 BY1 后,计时 停止。 第 3 次按 BY1 后,计时归零。 [硬件电路] 5V 1 40 注意这一个电路图 5V P1 .0 VCC 2 39 P1_0 P1 .1 P0 .0 3 38 P1_1 与上一个的接法只 P1 .2 P0 .1 5K1 4 37 P1_2 P1 .3 P0 .2 5 36 P1_3 a b c d e f g dp P1 .4 P0 .3 是按键接的 I/O 口 6 35 P1_4 DPY P1 .5 P0 .4 7 34 P1_5 a a a a P1 .6 P0 .5 8 33 P1_6 不一样。所以只要 f b f b f b f b P1 .7 P0 .6 g g g g 9 32 P1_7 R ST/VP D P0 .7 10 31 e c e c e c e c P3 .0 /R xD EA/Vpp 5V 用导线把 JK5 接到 11 30 d d d d P3 .1 /Tx D ALE/PR OG 12 29 dp dp dp dp P3 .2 /INT0 PS EN BY1 13 28 P3.0 上就可以了。 P3 .3 /INT1 P2 .7 14 27 DPY 4-LEDC0 C2 C3C 7 22 JK-Y 12 M15 16 17 18 19 20P3 .4 /T0 P3 .5 /T1 P3 .6 /WR P3 .7 /R D XTAL2 XTAL1 GNDP2 .6 P2 .5 P2 .4 P2 .3 P2 .2 P2 .1 P2 .026 25 24 23 22 21C4P 11 1_0 7 P 1_1 4 P 1_2 2 P 1_3 1 P 1_4 P 10 1_5 5 P 1_6 3 P 1_712 6 8 9LEDC 8 22AT89S52[DPY-1 实验板连接] 用排线把 JP-CODE 连到 JP8 上,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3……把 JP-CS 连到 JP14,注意: 2H 接 P2.0; 1H 接 P2.1; 用导线把 JK5 接到 P3.0 上。 [C 语言源程序] #include &AT89X51.H& unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07, 0x7f,0x6f, }; //定义计数值,每过 1/10 秒,sec 加一 unsigned char keycnt=0; //键值判断 sbit gewei=P2^0; //个位选通定义 sbit shiwei=P2^1; //十位选通定义 void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) { for(i=0; i&100; i++); tc--; } } void LED() //LED 显示函数 { shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1; gewei=0;- 19 - 李俊良专属P0=table[sec%10]; Delay(5); gewei=1; } void KEY() //按键扫描程序 { unsigned char i,j; if(P3_0==0) { for(i=20;i&0;i--) //延时去干扰 for(j=248;j&0;j--); if(P3_0==0) { keycnt++; switch(keycnt) //按下次数判断 { case 1: //第一次按下 TH0=0x06; //对 TH0 TL0 赋值 TL0=0x06; TR0=1; //开始定时 case 2: //第二次按下 TR0=0; //定时结束 case 3: //第三次按下 keycnt=0; //重新开始判断键值 sec=0; //计数重新从零开始 } while(P3_0==0); } } } //请注意写程序时的格式规范,此处是为了节省纸张 void t0(void) interrupt 1 using 0 //定时中断服务函数 { tcnt++; //每过 250ust tcnt 加一 if(tcnt==400) //计满 400 次(1/10 秒)时 { tcnt=0; //重新再计 sec++; if(sec==100) //定时 10 秒,在从零开始计时 { sec=0; } } }- 20 - 李俊良专属void main(void) { TMOD=0x02; ET0=1; EA=1; sec=0; while(1) { KEY(); LED(); } }//定时器工作在方式 2八.利用定时器产生乐曲[实验任务] 利用单片机的 I/O 口演奏乐曲。 [硬件电路图]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 JK-Y19 12 M20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/ VP D P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PS EN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 5VRS 2K LS 15V 5VSP EAKER Q1 80 50C7 22 C8 22AT89S52[DPY-1 实验板连接] 用导线把 JK1 接到 P0.0 上就可以了。 [实验原理] 乐曲是按照一定的高低,长短和强弱关系组成的关系,在一首乐曲中,每一 个音符与频率有关。所以我们只要把有关频率的占空比数据做成表格,在通过查 表,在 I/O 口输出相关乐曲的方波,便产生了乐曲。 [C 语言源程序]#include &reg52.h& unsigned char C sbit _Speak =P0^0 ; //讯响器控制脚 unsigned char code SONG[] ={ //祝你平安 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,- 21 - 李俊良专属0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00, //路边的野华不要采 0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C, 0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20, 0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20, 0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26, 0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20, 0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F, 0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20, 0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B, 0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20, 0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,}; void Time0_Init() //初始化{TMOD = 0x01; IE = 0x82; TH0 = 0xD8; TL0 = 0xEF;//12MZ 晶振,10ms} void Time0_Int() interrupt 1 { TH0 = 0xD8; TL0 = 0xEF; Count++; //长度加 1 } void Delay_xMs(unsigned int x) //1MS 延时子程序 { unsigned int i,j; for( i =0;i &i++ ) {for( j =0;j&3;j++ );} } void Play_Song(unsigned char i) //:歌曲播放子程序 i 为播放哪一段曲目 { unsigned char Temp1,Temp2; unsigned int A Count = 0; //中断计数器清 0 Addr = i * 217; while(1)- 22 - 李俊良专属Temp1 = SONG[Addr++]; if ( Temp1 == 0xFF ) //休止符 {TR0 = 0; Delay_xMs(100); } else if ( Temp1 == 0x00 ) //歌曲结束符 {} else {Temp2 = SONG[Addr++]; TR0 = 1; while(1) { _Speak = ~_S Delay_xMs(Temp1); if ( Temp2 == Count ) {Count = 0; } } } } } //请注意写程序时的格式规范,此处是为了节省空间 void main() //主程序 {Time0_Init(); //定时器 0 中断初始化 while(1) {Play_Song(0);} //播放 }{九.数摸转换 ADC0804 的应用[实验任务] 从 ADC0804 的通道 IN+输入 0-5V 之间的模拟量,通过 ADC0804 转换成数字 量在数码管上以十进制形成显示出来。 [硬件电路图]5V205V被测电压输入 68 9 R2 10 K 19 CC6 10 4 4Vin (+) A-GND Vref/2P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g dP1_0 11 7 P1_1 4 P1_2 2 P1_3 1 P1_4 P1_5 10 5 P1_6 3 P1_7a b c d e f g dp a b f c e dpC0Vin (-)VccREF7lsbDB0 DB1 DB2 DB3 DB4 DB5 DB6 msbDB 7 INTR18 17 16 15 14 13 12 11 5 1 2 3C2C3C4CLK-R CLK-IN U6 ADC 080 4CS RD WRC 7 22 JK-Y 12 M1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 RST/VP D P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PROG P3 .2 /INT0 PS EN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .040 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21a b f c e dp g d b f c dp ea g d b c dp DPY 4-LEDg dP 2_7 6P 2_6 8P 2_5 9C 8 22AT89S52[DPY-1 实验板连接] 用短接帽把 JP3 和 JP4,JP11 和 JP12 全部短接,用排线把 JP-CODE 连到 JP8 是,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 JP-CS 连到 JP14 上,注意:4H 接 P2.4;3H 接 P2.5;2H 接 P2.6;1H 接 P2.7; [实验原理] ADC0804 是 8 位全 MOS 中速 A/D 转换器、它是逐次逼近式 A/D 转换器,片内 有三态数据输出锁存器,可以和单片机直接接口。单通道输入,转换时间大约为 100us。ADC0804 转换时序是:当 CS=0 许可进行 A/D 转换。WR 由低到高时,A/D- 23 -P 2_4 12P2_7 P2_6 P2_5 P2_4LED 李俊良专属开始转换,一次转换一共需要 66-73 个时钟周期。CS 与 WR 同时有效时启动 A/D 转换,转换结束产生 INTR 信号(低电平有效) ,可供查询或者中断信号。在 CS 和 RD 的控制下可以读取数据结果。 [C 语言源程序] /*注意:程序下载到 DPY-1 实验板单片机后一定要使 SW DIP1 的开关脱离 ON 档。 或者直接将下载线从实验板上拔下。因为下载线接在 I/O 口 P1.5,P1.6,P1.7 上,下载线的电平将会影响测量结果*/ #include &reg52.h& code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码 sbit int1=P3^3; //定义管脚功能 sbit cs=P3^2; sbit wr=P3^6; sbit rd=P3^7; void Delay(unsigned int tc) //显示延时程序 {while( tc != 0 ) { for(i=0; i&100; i++); tc--;} } unsigned char adc0804( void ) //读 AD0804 子程序 { unsigned char addata,i; rd=1;wr=1;int1=1; //读 ADC0804 前准备 P1=0 //P1 全部置一准备 cs=0;wr=0;wr=1; //启动 ADC0804 开始测电压 while(int1==1); //查询等待 A/D 转换完毕产生的 INT(低电平有效)信号 rd=0; //开始读转换后数据 i=i; i=i; //无意义语句,用于延时等待 ADC0804 读数完毕 addata=P1;//读出的数据赋与 addate rd=1;cs=1;//读数完毕 return(addata);//返回最后读出的数据 } unsigned int datpro(void)//ADC0804 读出的数据处理 { unsigned int dianyah, //用于存储读出数据的高字节和低字节 unsigned int dianya=0; //存储最后处理完的结果 注意数据类型 for(x=0;x&10;x++) //将 10 次测得的结果存储在 dianya 中 {dianya=adc0804()+ } dianya=dianya/10; //求平均值, 软件滤波啊,简单的就 ADC 数据取平均值,我取过//10 次的(ADC0804 做模数转换,在数码管上显示转换结果,当输入 //不变时数码管不停的变抖动,不只有人遇到没,是什么原因,怎 //么解决?显示值在一个范围内不停变化)dianyah=dianya&0xf0; //屏蔽低四位 dianyah=dianyah&&4; //右移四位 取出高四位- 24 - 李俊良专属dianyal=dianya&0x0f; //屏蔽高四位 取出低四位 dianya=dianyal*20+dianyah*320; //最后的结果是一个四位数,便于显示 return(dianya);//返回最后处理结果 } void Led() { date=datpro(); //调用数据处理最后结果 P2=P2&0 P0=seg7code[date/; //输出个位数和小数点,段选小数点是最高 //位,所以只要或 0x80 就可以了 Delay(8); P2=P2|0xf0; P2=P2&0 P0=seg7code[date%]; //输出小数点后第一位 Delay(8); P2=P2|0xf0; P2=P2&0 P0=seg7code[date%100/10]; //输出小数点后第二位 Delay(8); P2=P2|0xf0; P2=P2&0x7f; P0=seg7code[date%10]; //输出小数点后第三位 Delay(8); P2=P2|0xf0; } main() { while(1) { Led( ); //只需调用显示函数 } }九.摸数转换 DAC0832 的应用[实验任务] 用两个按键通过单片机控制 DAC0832 的输出,使 OUT 端可以输出 0―5V 的幅 值,频率为 1KHZ 的锯齿波和三角波两种波形。通上电源后;按下 INT1 则输出三 角波,在按下 INT0 输出锯齿波。 [硬件电路图]- 25 - 李俊良专属5V -12V115V205VA 2 3 1RFB+1 2V 5V 5V9 8 19 18 2RfbU1VrefDAC083210K 10k6 B 5500ILE WR2 WR1CS Xfer1 177 INT0 5V 5K1 INT1 5V 5K1 C7 12 M 22 22 JK-Y C8LM324OUT[DPY-1 实验板连接] 用排线把 JP32―DATA 连到 JP8 上,注意 D0 对应 P0.0;D1 对应 P0.1;D2 对应 P0.2…… 将 JP32―XT 连到 JP32―GND 上(使 0832 以直通方式工作) 。 按键可以直接使用 INT0 和 INT1 按键(程序中以扫描方式识别按键) 。 硬件电路图中的画框的部分,运放 LM324 的连接部分需要用户自己搭建,注 意 LM324 使用的是正负 12V 的双电源供电。 我们只使用 LM324 四个运放中的两个。 [实验原理] ADC0804 是 8 位全 MOS 中速 D/A 转换器,采用 R―2RT 形电阻解码网络,转换 结果为一对差动电流输出,转换时间大约为 1us。使用单电源+5VD+15V 供电。 参考电压为-10V-+10V。在此我们直接选择+5V 作为参考电压。DAC0832 有三种 工作方式: 直通方式, 单缓冲方式, 双缓冲方式; 在此我们选择直通的工作方式, 将 XFER WR 1WR2 CS 管脚全部接数字地。管脚 8 接参考电压,在此我们接的参考 电压是+5V。那么经过第一级运放后,输出电压将是-5V-0V,在经过第二级运放 反相放大 1 倍以后将可以输出 0V―5V 了。 我们在控制 P1 口输出数据有规律的变 化将可以产生三角波,锯齿波,梯型波等波形了。 [C 语言源程序] #include &AT89X51.H& unsigned char keycnt=0; unsigned char tcnt=0; //键值判断 bit sjz=0; //产生三角波时用到的标志 void delayl() //延时子程序 { unsigned char i,j; for(i=20;i&0;i--) for(j=248;j&0;j--); } void KEY() //按键扫描程序 { if(P3_2==0)- 26 -1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20P 1. 0 V CC P 1. 1 P 0. 0 P 1. 2 P 0. 1 P 1. 3 P 0. 2 P 1. 4 P 0. 3 P 1. 5 P 0. 4 P 1. 6 P 0. 5 P 1. 7 P 0. 6 R S T/ V P D P 0. 7 P 3. 0/ R xD EA / V pp P 3. 1/ TxDA LE/ P R O G P 3. 2/ IN T0 P S EN P 3. 3/ IN T1 P 2. 7 P 3. 4/ T0 P 2. 6 P 3. 5/ T1 P 2. 5 P 3. 6/ WR P 2. 4 P 3. 7/ R D P 2. 3 X TA L2 P 2. 2 X TA L1 P 2. 1 G ND P 2. 0LM3244OUT212V ccOUT111Iout1 Iout2lsbDI0 DI1 DI2 DI3 DI4 DI5 DI6 msbDI77 6 5 4 16 15 14 1340 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21AT89S52 李俊良专属{ delayl(); //延时跳过按下时的抖动 if(P3_2==0) { keycnt=0; //定时器产生锯齿波标志 TR0=0; //暂时停止波形输出 TH0=0x256-40; //对 TH0 TL0 赋值 TL0=0x256-40; TR0=1; //开始定时,产生锯齿波 while(P3_2==0); //如果一直按着键,则等待松键开 delayl(); //延时跳过松开后的抖动 } } if(P3_3==0) { delayl(); //延时跳过按下时的抖动 if(P3_3==0) { keycnt=1; //定时器产生三角波标志 TR0=0; //暂时停止波形输出 TH0=0x256-40; //对 TH0 TL0 赋值 TL0=0x256-40; TR0=1; //开始定时 产生三角波 } while(P3_2==0); //如果一直按着键,则等待松键开 delayl(); //延时跳过松开后的抖动 } } //请注意写程序时的格式规范,此处是为了节省纸张 void t0(void) interrupt 1 using 0 //定时中断服务函数 { if(keycnt==0) //产生锯齿波 { P0= tcnt=+0x0a; //步进 0.2V/一次中断 if(tcnt==0xfb) {tcnt=0;} } if(keycnt==1) //产生三角波 { if(sjz==0) {P0= tcnt=+0x0a;//步进 0.2V/一次中断 if(tcnt==0xfa) {sjz=1;} } if(sjz==1)- 27 - 李俊良专属{ P0= tcnt=-0x0a; if(tcnt==0) {sjz=0;} } } } void main(void) { TMOD=0x02; //定时器工作在方式 2 ET0=1; EA=1; while(1) { KEY(); } }十.24CO8 的读写操作[实验任务] 利用 24C08 断电以后存储的数据不消失的特点,可以做一个断电保护装置。 首先利用单片机做一个 0-99 秒的自动计时器。然后随机关断电源,在 通电以 后计时器接着断电前的状态继续计时。 [硬件电路图]5V 5V U5 1 2 3 4 A0 A1 A2 GND 24 C0 8接P3. 4 接P3.55V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VP D P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PS EN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21VCC HOLD SC L SDA8 7 6 5 SC L SDA C C4 10 4R 241 5K1R 242 5K1P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g dP1_0 11 7P1_1 4P1_2 2P1_3 1P1_4 P1_5 10 5P1_6 3P1_7a b c d e f g dp a b c dpC0a b c dpC2 C3a b c dpC4f eg df eg df eg db c dpDPY 4-LEDJK-Y 12 MC822AT89S52 [DPY-1 实验板连接] 用短接帽把 JP11 和 JP12 对应 P3.4 和 P3.5 短接。 用排线把 JP-CODE 连到 JP8 是, 注意: 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 a JP-CS 连到 JP14 上,注意:4H 接 P2.0;3H 接 P2.1; [实验原理] 首先简单的说明以下 I2C 总线,I2C 总线是一种串行数据总线,只有二根信 号线,一根是双向的数据线 SDA,另一根是时钟线 SCL。在 I2C 总线上传送的 一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必 须跟一位应答位。数据传送首先传送最高位(MSB),数据传送按图 1 所示格式进 行。首先由主机发出启动信号“S”(SDA 在 SCL 高电平期间由高电平跳变为低电 平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊- 28 -12C722LED689 李俊良专属含义:高七位是从机的地址,第八位是传送方向位,0 表示主机发送数据(写),1 表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方 式。标准 I2C 总线的设备都有一个七位地址,所有连接在 I2C 总线上的设备都接 收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地 址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向 SDA 线送出低电平 作为应答。 除了第一字节是通用呼叫地址或十位从机地址之外第二字节开始即数 据字节。数据传送完毕,由主机发出停止信号“P”(SDA 在 SCL 高电平期间由低 电平跳变为高电平)。 AT24C 系列串行 E2PROM 具有 I2C 总线接口功能,功耗小,宽电源电压(根 据不同型号 2.5V~6.0V),工作电流约为 3mA,静态电流随电源电压不同为 30μA~110μA,AT24C 系列串行 E2PROM 参数如下型 号 容 量 器件寻址字节(8 位) 一次装载字节数 A0 R/W A0 P0 R/W R/W R/W R/W 4 8 16 16 16 AT24C01 128×8 AT24C02 256×8 AT24C04 512×8AT24C08 0A2P1P0 AT24C16 0P2P1P02由于 I C 总线可挂接多个串行接口器件,在 I2C 总线中每个器件应有唯一的 器件地址,按 I2C 总线规则,器件地址为 7 位数据(即一个 I2C 总线系统中理论上 可挂接 128 个不同地址的器件),它和 1 位数据方向位构成一个器件寻址字节, 最低位 D0 为方向位(读/写)。器件寻址字节中的最高 4 位(D7~D4)为器件型号地 址, 不同的 I2C 总线接口器件的型号地址是厂家给定的, AT24C 系列 E2PROM 如 的型号地址皆为 1010,器件地址中的低 3 位为引脚地址 A2 A1 A0,对应器 件寻址字节中的 D3、D2、D1 位,在硬件设计时由连接的引脚电平给定。 对 AT24C 系列 E2PROM 的读写操作完全遵守 I2C 总线的主收从发和主发从 收的规则。 [C 语言源程序] #include &AT89X52.H& #include &stdio.h& #include &absacc.h& unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07, 0x7f,0x6f,}; //定义计数值,每过 1 秒,sec 加 1 //定时中断次数 bit write=0; //写 24C08 的标志; sbit gewei=P2^0; //个位选通定义 sbit shiwei=P2^1; //十位选通定义 /////////24C08 读写驱动程序//////////////////// sbit scl=P3^4; // 24c08 SCL sbit sda=P3^5; // 24c08 SDA void delay1(unsigned char x) { for(i=0;i&x;i++); ;}- 29 - 李俊良专属void flash() { ; ;} void x24c08_init() //24c08 初始化子程序 {scl=1; flash(); sda=1; flash();} void start() //启动 I2C 总线 {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();} void stop() //停止 I2C 总线 {sda=0; flash(); scl=1; flash(); sda=1; flash();} void writex(unsigned char j) //写一个字节 { unsigned char i, temp=j; for (i=0;i&8;i++) {temp=temp&&1; scl=0; flash(); sda=CY; flash(); scl=1; flash();} scl=0; flash(); sda=1; flash(); } unsigned char readx() //读一个字节 { unsigned char i,j,k=0; scl=0; flash(); sda=1; for (i=0;i&8;i++) { flash(); scl=1; flash(); if (sda==1) j=1; else j=0; k=(k&&1)|j; scl=0;} flash(); return(k); } void clock() // I2C 总线时钟 { unsigned char i=0; scl=1; flash(); while ((sda==1)&&(i&255))i++; scl=0; flash(); } ////////从 24c02 的地址 address 中读取一个字节数据///// unsigned char x24c08_read(unsigned char address) { start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop();- 30 - 李俊良专属delay1(10); return(i); } //////向 24c02 的 address 地址中写入一字节数据 info///// void x24c08_write(unsigned char address,unsigned char info) { EA=0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA=1; delay1(50); } /////////////24C08 读写驱动程序完///////////////////// void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) { for(i=0; i&100; i++); tc--;} } void LED() //LED 显示函数 { shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1; gewei=0; P0=table[sec%10]; Delay(5); gewei=1; } void t0(void) interrupt 1 using 0 //定时中断服务函数 { TH0=()/256; //对 TH0 TL0 赋值 TL0=()%256; //重装计数初值 tcnt++; //每过 250ust tcnt 加一 if(tcnt==20) //计满 20 次(1 秒)时 { tcnt=0; //重新再计 sec++; write=1; //1 秒写一次 24C08 if(sec==100) //定时 100 秒,在从零开始计时 {sec=0;} } } void main(void) { TMOD=0x01; //定时器工作在方式 1- 31 - 李俊良专属ET0=1; EA=1; x24c08_init(); //初始化 24C08 sec=x24c08_read(2);//读出保存的数据赋于 sec TH0=()/256; //对 TH0 TL0 赋值 TL0=()%256; //使定时器 0.05 秒中断一次 TR0=1; //开始计时 while(1) { LED(); if(write==1) //判断计时器是否计时一秒 { write=0; //清零 x24c08_write(2,sec); //在 24c08 的地址 2 中写入数据 sec } } }十一.PC 机与单片机通信(RS232 协议)[实验任务] 单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。 个人电脑作为上位机,向下位机单片机系统发送十六进制或者 ASCLL 码,单片机 系统接收后,用 LED 显示接收到的数据和向上位机发回原样数据。 [硬件电路图]DB9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 RST/VPD P0 .7 P3 .0 /RxD EA/Vpp P3 .1 /Tx D ALE/PROG P3 .2 /INT0 PSEN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /RD P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 5V5V C3 U2 1 C 22 10 4 3 4 5 6 7 8 C6 10 4 10 4 16 15 14 13 12 RXD 11 TXD 10 9CC2 10 4P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75V1 6 2 7 3 8 4 9 5DPY a f e g dP 11 1_0 7 P 1_1 4 P 1_2 2 P 1_3 1 P 1_4 P 10 1_5 5 P 1_6 3 P 1_7a b c d e f g dp a b f c e dpC0a b f c e dp g d b f c e dpC3 C4a g d b c dp DPY 4-LEDg d10 4C2C4C1+ VCC V+ GND C1- T1 OUT C2+ R 1IN C2- R1OUT VT1 IN T2 OUTT2 IN R2IN R2OUT MAX20 2C7 22 JK-Y11.0592MC8 22AT89S52[DPY-1 实验板连接] 用短接帽把 JP11 和 JP12 对应 P3.0 和 P3.1 短接。 用排线把 JP-CODE 连到 JP8 是, 注意: 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 a JP-CS 连到 JP14 上,注意:4H 接 P2.0;3H 接 P2.1; 用串口连接线 DB9 和个人电脑的串口连接起来。 [实验原理] RS-232 是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串- 32 -12LED689 李俊良专属行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。 RS-232 串行接口总线适用于:设备之间的通讯距离不大于 15m,传输速率最大为 20kBps。RS-232 协议以-5V-15V 表示逻辑 1;以+5V-15V 表示逻辑 0。 我们是 用 MAX232 芯片将 RS232 电平转换为 TTL 电平的。 一个完整的 RS-232 接口有 22 根线,采用标准的 25 芯插头座。我们在 这里使用的是简化的 9 芯插头座。 注意我们在这里使用的晶振是 11.0592M 的,而不是 12M。因为波特率的设置 需要 11.0592M 的。 “串口调试助手 V2.1.exe” 软件的使用很简单,只要将串口选择‘CMO1’波 特率设置为‘9600’ 数据位为 8 位。打开串口(如果关闭) 。然后在发送区里 输入要发送的数据,单击手动发送就将数据发送出去了。注意,如果选中‘十六 进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中, 则发送的是 ASCLL 码,那么单片机控制的数码管将显示 ASCLL 码值。 [C 语言源程序] #include &reg52.h& //包函 8051 内部资源的定义 //用于存储单片机接收发送缓冲寄存器 SBUF 里面 的内容 sbit gewei=P2^0; //个位选通定义 sbit shiwei=P2^1; //十位选通定义 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07, 0x7f,0x6f,}; void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) { for(i=0; i&100; i++); tc--;} } void LED() //LED 显示接收到的数据(十进制) { shiwei=0; P0=table[dat/10]; Delay(8); shiwei=1; gewei=0; P0=table[dat%10]; Delay(5); gewei=1; } ///////功能:串口初始化,波特率 9600,方式 1///////// void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; } /////主程序功能:实现接收数据并把接收到的数据原样发送回去/////// void main()- 33 - 李俊良专属{ Init_Com();//串口初始化 while(1) { if ( RI ) //扫描判断是否接收到数据, { dat = SBUF; //接收数据 SBUF 赋与 dat RI=0; //RI 清零。 SBUF = //在原样把数据发送回去 } LED(); //显示接收到的数据 } } ///这一个例子是以扫描的方式编写的, 还可以以中断的方式编写, 请大家思考//////十二.DS18B20 测量温度系统[实验任务] 用一片 DS18B20 构成测温系统,测量的温度精度达到 0.1 度,测量的温度的 范围在-20 度到+50 度之间,用 4 位数码管显示出来。 [硬件电路图]5V 5V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VPD P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PSEN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21RSD JP-DS 4.7KVCC 3 DATE 2 1GNDP1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_75VDPY a f e g dP 11 1_0 7 P 1_1 4 P 1_2 2 P 1_3 1 P 1_4 P 10 1_5 5 P 1_6 3 P 1_7a b c d e f g dp a b f c e dpC0a b f c e dpC2 C3a b f c e dpC4g dg dg db c dpDS 18B20C 7 22 JK-Y 12 MP 2_7 6P 2_6 8P 2_5 9C 8 22AT89S52[DPY-1 实验板连接] 用排线把 JP-CODE 连到 JP8 是,注意:a 接 P0.0;b 接 P0.1;c 接 P0.3…… 把 JP-CS 连到 JP14 上,注意:4H 接 P2.4;3H 接 P2.5;2H 接 P2.6;1H 接 P2.7; 连接好 DS18B20 注意极性不要弄反,否则可能烧坏。DS18B20 的外型与常用 的三极管一模一样,上面右图是它的管脚分布。用导线将 JK―DS 的 DA 端连到 P3.1 上。 [实验原理] DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire,即单总线器件,具有线 路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根- 34 -P 2_4 12P2_7 P2_6 P2_5 P2_4DPY 4-LEDLED 李俊良专属通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点(1) 、只要求一个 I/O 口即可实现通信。 、在 DS18B20 中的每个器件上都有独一无二的序列号。 (2) (3) 、实际应用中不需要外部任何元器件即可实现测温。 (4) 、测量温度范围在 -55。C 到+125。C 之间。 、数字温度计的分辨率用户可以从 9 位到 12 位选 (5) 择。 (6) 、内部有温度上、下限告警设置。 DS18B20 详细引脚功能描述 1 GND 地信号;2 DQ 数据输入/输出引脚。开漏单 总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;3 VDD 可选择 的 VDD 引脚。当工作于寄生电源时,此引脚必须接地。 DS18B20 的使用方法。由于 DS18B20 采用的是 1-Wire 总线协议方式,即在一根 数据线实现数据的双向传输,而对 AT89S51 单片机来说,我们必须采用软件的方 法来模拟单总线的协议时序来完成对 DS18B20 芯片的访问。 由于 DS18B20 是在一 根 I/O 线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20 有 严格的通信协议来保证各位数据传输的正确性和完整性。 该协议定义了几种信号 的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总 线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开 始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数 据接收。数据和命令的传输都是低位在先。 [C 语言源程序] #include&reg52.h& code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 显 示 段码 void Delay(unsigned int tc) //显示延时程序 {while( tc != 0 ) { for(i=0; i&100; i++); tc--;} } sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚 DQ,根据情况设定//测量到的温度的整数部分 unsigned char xiaoshu1;//小数第一位 unsigned char xiaoshu2;//小数第二位 u//两位小数 bit fg=1; //温度正负标志 void dmsec (unsigned int count) //延时部分 { while(count--) {for(i=0;i&115;i++);} } void tmreset (void) //发送复位 { TMDAT=0; for(i=0;i&103;i++);- 35 - 李俊良专属TMDAT = 1; for(i=0;i&4;i++); } bit tmrbit (void) //读一位// { TMDAT = 0; i++; TMDAT = 1; i++; i++; //微量延时 // dat = TMDAT; for(i=0;i&8;i++); return (dat); } unsigned char tmrbyte (void) //读一个字节 { unsigned char i,j, dat = 0; for (i=1;i&=8;i++) { j = tmrbit(); dat = (j && 7) | (dat && 1); } return (dat); } void tmwbyte (unsigned char dat) //写一个字节 { unsigned char j,i; for (j=1;j&=8;j++) { testb = dat & 0x01; dat = dat && 1; if (testb) { TMDAT = 0; //写 0 i++; i++; TMDAT = 1; for(i=0;i&8;i++); } else { TMDAT = 0; for(i=0;i&8;i++); TMDAT = 1; i++; i++;} } } void tmstart (void) { tmreset(); //复位//写 0//发送 ds1820 开始转换- 36 - 李俊良专属dmsec(1); //延时 tmwbyte(0xcc); //跳过序列号命令 tmwbyte(0x44); //发转换命令 44H, } void tmrtemp (void) //读取温度 { unsigned char a,b; tmreset (); //复位 dmsec (1); //延时 tmwbyte (0xcc); //跳过序列号命令 tmwbyte (0xbe); //发送读取命令 a = tmrbyte (); //读取低位温度 b = tmrbyte (); //读取高位温度 if(b&0x7f) //最高位为 1 时温度是负 {a=~a; b=~b+1; //补码转换,取反加一 fg=0; //读取温度为负时 fg=0 } sdata = a/16+b*16; //整数部分 xiaoshu1 = (a&0x0f)*10/16; //小数第一位 xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位 xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位 } void DS18B20PRO(void) { tmstart(); //dmsec(5); //如果是不断地读取的话可以不延时 // tmrtemp(); //读取温度,执行完毕温度将存于 TMP 中 // } void Led() { if(fg==1) //温度为正时显示的数据 { P2=P2&0 P0=seg7code[sdata/10]; //输出十位数 Delay(8); P2=P2|0xf0; P2=P2&0 P0=seg7code[sdata%10]|0x80; //输出个位和小数点 Delay(8); P2=P2|0xf0; P2=P2&0 P0=seg7code[xiaoshu1]; //输出小数点后第一位 Delay(8); P2=P2|0xf0; P2=P2&0x7f; P0=seg7code[xiaoshu2]; //输出小数点后第二位 Delay(4); P2=P2|0xf0; } if(fg==0) //温度为负时显示的数据 { P2=P2&0 P0=seg7code[11]; //负号 Delay(8); P2=P2|0xf0; P2=P2&0- 37 - 李俊良专属P0=seg7code[sdata/10]|0x80; //输出十位数 Delay(8); P2=P2|0xf0; P2=P2&0 P0=seg7code[sdata%10]; //输出个位和小数点 Delay(8); P2=P2|0xf0; P2=P2&0x7f; P0=seg7code[xiaoshu1]; //输出小数点后第一位 Delay(4); P2=P2|0xf0; } } main() {fg=1; while(1) { DS18B20PRO(); Led(); } }- 38 - 李俊良专属十三.128X64 液晶显示器的基本应用[实验任务] 利用 128X64 点阵液晶显示屏显示图片,字符,汉字,画点,实现其基本显示 功能。 [硬件电路图]5V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1 .0 VCC P1 .1 P0 .0 P1 .2 P0 .1 P1 .3 P0 .2 P1 .4 P0 .3 P1 .5 P0 .4 P1 .6 P0 .5 P1 .7 P0 .6 R ST/VP D P0 .7 P3 .0 /R xD EA/Vpp P3 .1 /Tx D ALE/PR OG P3 .2 /INT0 PS EN P3 .3 /INT1 P2 .7 P3 .4 /T0 P2 .6 P3 .5 /T1 P2 .5 P3 .6 /WR P2 .4 P3 .7 /R D P2 .3 XTAL2 P2 .2 XTAL1 P2 .1 GND P2 .0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21P0_0 P0_1 P0_2 P0_3 P0_4 P0_5 P0_6 P0_75V EN RW RS C S1 C S25V RS RW ENP0_0 P0_1 P0_2 P0_3 P0_4 P0_5 P0_6 P0_7C S1 C S2C722JK-Y 12 M C8 2289S52128X64液晶接口1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20GND VCC GND RS RW EN DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 C S1 C S2 R ES GND NC GNDLCD IS -D[DPY-1 实验板连接] 用短接帽把 JP8 和 JP9 对应所有的 I/O 短接。 用短接帽把 JP14 和 JP15 对应 所有的 I/O 短接。 将 128X64 液晶显示器插到 LCD-DISPLAY 的架子上。 [实验原理] 关于液晶显示的原理请用户自行其查找资料,这里只介绍 128X64 点阵液晶 显示屏的具体应用。驱动程序为用户提供了一个应用框架,大家只要直接应用驱 动程序提供的功能将可以了。在编程序前要先用液晶字模提取软件提取字模(我 们在 QQ 共享资源里提供了两个) ,复制到 hzzi.h 文档,再在主程序里面编写程 序。我们使用的液晶没有自带字库,必须提取字模到程序里。 由于 DPY-1 实验板只有 5V 稳压电源,所以没有点亮液晶的背光。 [C 语言源程序] //注意:以下提供程序并没有包含 128X64 液晶显示驱动程序,只有主程序。 //请大家到 QQ 群资源共享里面去下 #include&reg52.h& #include&lcd12864.h& //包含 128X64 驱动程序 #include&hzzi.H& //包含图片和汉字库 void delay(int x) //延时程序 { int i,j; for(i=0;i&600;i++) for(j=0;j&x;j++); }- 39 - 李俊良专属void main(void) { //定义列 //定义行 lcd_init(); //初始化液晶驱动硬件 lcd_clr(); //清屏 while(1) { lie=15;//列的值可以是 0--127 任意一个 hang=0;//行的值视情况而定 lcd_clr(); Disp_Img(yema);//显示一张 128X64 的点阵的图片 delay(200); //延时等待 lcd_clr(); //清屏使残留的点不影响后面的显示 hz_disp(lie+0, hang, da);//在第 15 列,第 0 行显示汉字&#39;大&#39; hz_disp(lie+16,hang, jia);//显示汉字&#39;家&#39; hz_disp(lie+32,hang, yi);//显示汉字&#39;一&#39; hz_disp(lie+48,hang, qi);//显示汉字&#39;起&#39; hz_disp(lie+64,hang, lai);//显示汉字&#39;来&#39; hz_disp(lie+80,hang, xue);//显示汉字&#39;学&#39; hang=2;//换行 一行有 8 个点阵 一列只有一个 hz_disp(lie+24,hang, dan );//显示汉字&#39;单&#39; hz_disp(lie+40,hang, pian);//显示汉字&#39;片&#39; hz_disp(lie+56,hang, ji);//显示汉字&#39;机&#39; hang=4;//换行 hz_disp(lie+0, hang, huan); hz_disp(lie+16,hang, ying); hz_disp(lie+32,hang, jia1); hz_disp(lie+48,hang, ru); hz_disp(lie+64,hang, qq); hz_disp(lie+80,hang, qun); lie=32; hang=7;//换行.换列. delay(50); lcd_putchar8x8(lie+0, hang, 1+&#39;0&#39;);//显示 8X8 字符 delay(50);//延时 达到一个字一个字往外蹦的效果 lcd_putchar8x8(lie+8, hang, 9+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+16,hang, 3+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+24,hang, 0+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+32,hang, 5+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+40,hang, 2+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+48,hang, 5+&#39;0&#39;);delay(50); lcd_putchar8x8(lie+56,hang, 5+&#39;0&#39;); delay(200);//延时显示 lcd_clr();- 40 - 李俊良专属hang=0; for(lie=0;lie&128;lie++) {//画点时 行取值 0--64,列取值 0--128 set_point(lie,hang); hang++; if(hang==32){hang=0;} delay(5); } delay(200); hz_disp128x32(0,0,qian33);//显示 128X32 的图片 hz_disp128x32(0,4,dpy); delay(300); } } ////除了以上的例子外,还可以显示 12X12.32X32.120X2.点阵图形/// ///用法和上面的例子差不多,大家实践几次就可以熟练应用了/////- 41 -
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 电动车高电平刹车 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信