大赛期间训练程序总结报告(一).doc

上传人:文库蛋蛋多 文档编号:4271849 上传时间:2023-04-13 格式:DOC 页数:50 大小:463.50KB
返回 下载 相关 举报
大赛期间训练程序总结报告(一).doc_第1页
第1页 / 共50页
大赛期间训练程序总结报告(一).doc_第2页
第2页 / 共50页
大赛期间训练程序总结报告(一).doc_第3页
第3页 / 共50页
大赛期间训练程序总结报告(一).doc_第4页
第4页 / 共50页
大赛期间训练程序总结报告(一).doc_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《大赛期间训练程序总结报告(一).doc》由会员分享,可在线阅读,更多相关《大赛期间训练程序总结报告(一).doc(50页珍藏版)》请在三一办公上搜索。

1、大赛训练期间程序总结报告(一)-显示类 一、显示类:(LED、数码管、LCD)对于显示类的单片机外设,总结起来常用的不过就是:LED(发光二极管)、数码管(由发光二极管组成),LCD(液晶显示屏),它们又分为两大类:一是:即时显示器件。送入数据信号就能马上显示出效果,如:LED和数码管。 二是:有存储功能的显示器件。这类器件送入数据信号不能马上显示(在其内部存在具有存储功能的芯片),而是要等待用户送入一定的操作指令,才能按用户的需求显示数据。由于LCD存在较多的控制接口、相关的存储器件和相关的指令,加之显示操作还要进行寻址,故其操作更复杂,但其能满足用户更多特殊的要求,所以其广泛地应用于日常生

2、活和工业控制中。1、 LDE 跑马灯:对于LED相关的特性及工作原理,我相信各位非常了解,在此我就不再累赘,下面我就直接给出相关的代码:/* 实验目的:学习和掌握发光二极管驱动 */* 程序功能:D2D9依次点亮,点亮间隔为 500ms,然后D9D2依次点亮,点亮间隔为500ms,然后D2D9 闪烁5次(500ms亮,500ms灭)如此循环 */ 包含文件#include STC12C56.H#include STC12C56IO.H#include / 函数申明void Delay_500ms(void);/ 主函数void main(void)uchar i;LED_PWM = 0;whi

3、le(1)P2 = 0xff;/ D1D8全部熄灭Delay_500ms();/ 延时500msD2 = 0;/ 点亮D2Delay_500ms();/ 延时500msD3 = 0;Delay_500ms();D4 = 0;Delay_500ms();D5 = 0;Delay_500ms();D6 = 0;Delay_500ms();D7 = 0;Delay_500ms();D8 = 0;/ 点亮D8Delay_500ms();/ 延时500msD9 = 0;/ 点亮D9Delay_500ms();/ 延时500msP2 = 0xff;/ D1D8全部熄灭Delay_500ms();/ 延时5

4、00msD9 = 0;/ 点亮D9Delay_500ms();/ 延时500msD8 = 0;/ 点亮D8Delay_500ms();/ 延时500msD7 = 0;Delay_500ms();D6 = 0;Delay_500ms();D5 = 0;Delay_500ms();D4 = 0;Delay_500ms();D3 = 0;Delay_500ms();D2 = 0;/ 点亮D2Delay_500ms();/ 延时500msfor(i=0; i5; i+)/ 闪烁5次P2 = 0xff;/ D2D9全部熄灭Delay_500ms();/ 延时500msP2 = 0;/ D2D9全部点亮D

5、elay_500ms();/ 延时500ms/ 延时500msvoid Delay_500ms()/ 12.000MHzunsigned char i, j, k;i = 23;j = 205;k = 120;dodowhile (-k); while (-j); while (-i);对于上序程序进行一个小结:单片的IO口与LED的负极直接相连,程序直接通过控制单片机IO的电平输出直接来控制LED的亮灭,然后综合延时,以达到跑马灯的效果。2、 数码管显示类: 数码管在51单片机设计中是应用最广泛的显示外设之一,一般用于数字显示(如:显示日期、时间、测控到环境的温度、湿度、光照强度,电机(含轴

6、器件)的转速等等),因此也是广泛地应用于日常生活和工业控制。在接下来的大部分项目中我们将直接接触到数码管的应用。对于数码管的结构我提醒的是:A、 一定要注意我们所用数码管是阴极数码管还是阳极数码管。B、 如果是多位的8段数码管,那么一定要分清楚数码管的数据端及控制端(位选端,电源端),然后要辨别出数码管的每一端口与单片机的那个管脚相连,各实现什么功能。C、 由于不同数码管的结构可能存在一定的差异,所以这里我就不详细的给出数码管的字模,以免在程序设计的时候出现错误,不过当你对数码管的结构相当了解后,再用相关的求数码管数模的软件,就能快速而准确的求出来。LED数码管要正常显示,就要用驱动电路来驱动

7、数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。 A、静态显示驱动: 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动,或者使用如74HC138的3-8译码器进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O占用多,如驱动5个数码管静态显示则需要5840根I/O口来驱动,要知道我们使用的SCT12C5208AD单片机可用的所有端口才28个呢。故实际应用时必须增加驱动器进行驱动,增加了硬体电路的复杂性。 B、动态显示驱动: 数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,

8、动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。 最后来个小的总结:A、静态显示LED接口:(1) 连接方法 各数码管的公共极固定接有效电平,各数码管的字形控制端分别由各自的控制信号控制。 (2)优点 LED显示亮度温度,容易调节,编程容易,工作时占用C

9、PU时间短。 (3)缺点 若直接用单片机输出各位数码管的字形信号时,占用单片机的I/O口线较多。一般仅适用于 显示位数较少的应用场合。 B、动态显示LED接口 (1)连接方法 各位数码管的字形控制端对应地并在一起,由一组I/O端口进行控制,各位的公共极相互独 立,分别由不同的I/O控制信号控制。 (2)优点 节省I/O端口线 (3)缺点 显示亮度不够稳定,影响因素较多;编程较复杂,占用CPU时间较多。 (注:由于静态显示相对很简单,所以训练代码中只涉及到了动态显示)这里需要指出的是我们在训练所使用的数码管是共阳极的数码管。下面在来看看我们训练项目中所涉及的一些代码:2.1.1 4位共阳8段数码

10、管动态显示/* 实验目的:学习和掌握8段共阳极数码管的动态驱动 */* 程序功能:8段数码管显示1,2,3,4,延时1秒后 显示5,6,7,8,延时1秒后显示8,9 */ 包含文件#include STC12C56.H#include STC12C56IO.H#include / 定义全局变量uchar FIR_Number;uchar SEC_Number;uchar THI_Number;uchar FOU_Number;/ 8段数码管(共阳极)0,1,2,3,4,5,6,7,8,9的字模/ 数字0的字模为0x0a,依次类推code uchar Segments = 0x0a,0xfa,0

11、x4c,0x68,0xb8,0x29,0x09,0x7a,0x08,0x28,0xff;/说明:下边所用到的DIG1_CS 、DIG2_CS、DIG3_CS、DIG4_CS为数码管的位选端,控/制数码管的显示/ 选择第1个数码管 void SEL_FIR() DIG1_CS = 0;DIG2_CS = 1;DIG3_CS = 1;DIG4_CS = 1/ 选择第2个数码管 void SEL_SEC(void)DIG1_CS = 1;DIG2_CS = 0;DIG3_CS = 1;DIG4_CS = 1;/ 选择第3个数码管 void SEL_THI(void)DIG1_CS = 1;DIG2_

12、CS = 1;DIG3_CS = 0;DIG4_CS = 1;/ 选择第4个数码管 void SEL_FOU(void)DIG1_CS = 1;DIG2_CS = 1;DIG3_CS = 1;DIG4_CS = 0;/ 延时1msvoid Delay_1ms()/ 12.000MHzunsigned char i, j; _nop_(); _nop_();i = 12;j = 168;dowhile (-j); while (-i);/ 八段数码管显示数据 void SEG_Display(void)P2 = 0xff; /显示前对P2口(与数码管的数据位相连)先让所有的数码管都不显示。SEL

13、_FIR();/ 选第一个数码管P2 = SegmentsFIR_Number;/ 第一个数据Delay_1ms();/ 延时1msSEL_SEC(); / 选第二个数码管P2 = SegmentsSEC_Number;Delay_1ms();SEL_THI();P2 = SegmentsTHI_Number;Delay_1ms();SEL_FOU();P2 = SegmentsFOU_Number;Delay_1ms();/ 主函数void main(void)uint i;LED_PWM = 0; /清脉冲调制端口P3.5,在这里实际不起很大作用,对运行没的影响/循环的显示1,2,3,4,

14、延时1秒后 显示5,6,7,8,延时1秒后显示8,9while(1) FIR_Number = 0;SEC_Number = 1;THI_Number = 2;FOU_Number = 3;for(i=0;i100;i+)SEG_Display();/ 显示0,1,2,3FIR_Number = 4;SEC_Number = 5;THI_Number = 6;FOU_Number = 7;for(i=0;i100;i+)SEG_Display();/ 显示6,7,8,9FIR_Number = 8;SEC_Number = 9;THI_Number = 10;FOU_Number = 10;f

15、or(i=0;i100;i+)SEG_Display();/ 显示6,7,8,9点评:实际每个数码管都接受到了数据,这里动态的控制数码管的显示主要是靠数码管的位选端进行控制。对于数码管的驱动硬件电路其实是数码管的P2的8个IO口都充当了数据端,直接来向数码管的数据端输送数据,这点我们可以在我们的原理图资料中详细的分析出来! -2013年10月16日晚2.2.2 8位共阴8段数码管138动态显示这个小项目不是通过单片机的IO口直接与数码管的管脚相连来驱动数码显示的,而是借用了一个型号为74HC138的38译码器,这里我简单的将器管脚排列图及真值表给出,其它详细信息可以参考我提供的相关芯片资料。由

16、于我们训练所提供的板子上没有该单元模块,故在此给出相关的驱动电路图:驱动电路连接说明:在上图的电路中P2口是数码管的数据输入端,直接控制数码管的数字显示,通过P1.0、P1.1和P3.7口控制38译码器的数据输入端,通过单片机的这三个端口可以产生000111(二进制数)共8种情况,然后通过38译码器译码在数据输出端Y0Y7(分别与8位数码管的每个为选相连),来控制数码管的循环显示。至于译码器与数码管为何如此相连,再此就不再赘言。下面给出控制该数码显示的代码:3、 /* 实验目的:1.学习和掌握8段共阴极数码管的动态驱动 4、 2.学习和掌握74HC138的3-8译码功能 */5、6、 /* 程

17、序功能:8段数码管显示1,2,3,4,5,6, 7, 7、 延时2秒后,显示8,9,A,B,C,D,E,8、 F,如此循环 */ 9、10、 / 包含文件11、 #include reg51.H12、 #include 13、14、 #define uchar unsigned char15、 #define uint unsigned int16、 /定义8段数码管对应的I/O口 定义为高电平17、 #define SEG_A 0x8018、 #define SEG_F 0x4019、 #define SEG_B 0x2020、 #define SEG_G 0x1021、 #define S

18、EG_C 0x0822、 #define SEG_DP 0x0423、 #define SEG_D 0x0224、 #define SEG_E 0x0125、 /定义38译码器数据输入端、使能端与单片机的连接关系26、 sbit HC138_A = P10;27、 sbit HC138_B = P11;28、 sbit HC138_C = P37;29、 sbit HC138_E1_E2 = P34;30、31、 / 定义全局变量,分别表示第几个数码管。32、 uchar FIR_Number;33、 uchar SEC_Number;34、 uchar THI_Number;35、 ucha

19、r FOU_Number;36、 uchar FIV_Number;37、 uchar SIX_Number;38、 uchar SEV_Number;39、 uchar EIG_Number;40、 / 定义8段数码管的字模41、 code uchar Segments =42、 /*43、 SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F, / 044、 SEG_B|SEG_C, / 145、 SEG_A|SEG_B|SEG_D|SEG_E|SEG_G, / 246、 SEG_A|SEG_B|SEG_C|SEG_D|SEG_G, / 347、 SEG_B|SEG_C|

20、SEG_F|SEG_G, / 448、 SEG_A|SEG_C|SEG_D|SEG_F|SEG_G, / 549、 SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G, / 650、 SEG_A|SEG_B|SEG_C, / 751、 SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G,/ 852、 SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G, / 953、 SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G, / A54、 SEG_C|SEG_D|SEG_E|SEG_F|SEG_G, / B5

21、5、 SEG_A|SEG_D|SEG_E|SEG_F, / C56、 SEG_B|SEG_C|SEG_D|SEG_E|SEG_G, / D57、 SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, / E58、 SEG_A|SEG_E|SEG_F|SEG_G, / F59、 */60、 0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,61、 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7162、 ;63、 /通过单片机输出的数据到38译码器,然后由38译码器解码对数码管位选进行控制;64、 / 选择第1个数码管 65、 v

22、oid SEL_FIR(void)66、 67、 HC138_A = 0;68、 HC138_B = 0;69、 HC138_C = 0;70、 71、 / 选择第2个数码管 72、 void SEL_SEC(void)73、 74、 HC138_A = 1;75、 HC138_B = 0;76、 HC138_C = 0;77、 78、 / 选择第3个数码管 79、 void SEL_THI(void)80、 81、 HC138_A = 0;82、 HC138_B = 1;83、 HC138_C = 0;84、 85、 / 选择第4个数码管 86、 void SEL_FOU(void)87、

23、88、 HC138_A = 1;89、 HC138_B = 1;90、 HC138_C = 0;91、 92、 / 选择第5个数码管 93、 void SEL_FIV(void)94、 95、 HC138_A = 0;96、 HC138_B = 0;97、 HC138_C = 1;98、 99、 / 选择第6个数码管 100、 void SEL_SIX(void)101、 102、 HC138_A = 1;103、 HC138_B = 0;104、 HC138_C = 1;105、 106、 / 选择第7个数码管 107、 void SEL_SEV(void)108、 109、 HC138_A

24、 = 0;110、 HC138_B = 1;111、 HC138_C = 1;/ Y6112、 113、 / 选择第8个数码管 114、 void SEL_EIG(void)115、 116、 HC138_A = 1;117、 HC138_B = 1;118、 HC138_C = 1;/ Y7119、 120、 / 延时800us 121、 void Delay_800us()122、 123、 uint n = 50000;124、 uint i = 1000;125、 for( ;i 0; i-)126、 127、 for( ; n 0;n-);128、 129、 130、 / 八段数码管

25、显示数据 131、 void SEG_Display(void)132、 133、 P2 = 0x00;/ 熄灭上一个数码管显示数据134、 SEL_FIR();/ 选择第1个数码管有效135、 P2 = SegmentsFIR_Number;/ 显示想相应的数据136、 Delay_800us();/ 延时1毫秒137、138、 P2 = 0x00;/ 熄灭上一个数码管显示数据139、 SEL_SEC(); 140、 P2 = SegmentsSEC_Number;141、 Delay_800us();142、143、 P2 = 0x00;/ 熄灭上一个数码管显示数据144、 SEL_THI

26、();145、 P2 = SegmentsTHI_Number;146、 Delay_800us();147、148、 P2 = 0x00;/ 熄灭上一个数码管显示数据149、 SEL_FOU();150、 P2 = SegmentsFOU_Number;151、 Delay_800us();152、153、 P2 = 0x00;/ 熄灭上一个数码管显示数据154、 SEL_FIV();155、 P2 = SegmentsFIV_Number;156、 Delay_800us();157、158、 P2 = 0x00;/ 熄灭上一个数码管显示数据159、 SEL_SIX();160、 P2 =

27、 SegmentsSIX_Number;161、 Delay_800us();162、163、 P2 = 0x00;/ 熄灭上一个数码管显示数据164、 SEL_SEV();165、 P2 = SegmentsSEV_Number;166、 Delay_800us();167、168、 P2 = 0x00;/ 熄灭上一个数码管显示数据169、 SEL_EIG();170、 P2 = SegmentsEIG_Number;171、 Delay_800us();172、 173、 / 主函数 174、 void main(void)175、 176、 uint i;177、 /LED_PWM =

28、0;178、 HC138_E1_E2 = 0;/ E1和E2使能端清0,允许138显示179、 while(1)180、 181、 for(i=0;i100;i+)182、 183、 FIR_Number = 0;184、 SEC_Number = 1;185、 THI_Number = 2;186、 FOU_Number = 3;187、 FIV_Number = 4;188、 SIX_Number = 5;189、 SEV_Number = 6;190、 EIG_Number = 7;191、 SEG_Display();/显示0,1,2,3,4,5,6,7192、 /193、 /for(

29、i=0;i然后数据会送到内部的输出寄存器-输出。当SCLR(10引脚)为高电平,OE(13引脚)为低电平时,数据在SCK(SHCP 上升沿进入移位寄存器,在LCK(STCP上升沿输出到并行端口。接着我们具体来看下代码: /* 实验目的:1.学习和掌握8段共阳极数码管的动态驱动 2.学习和掌握74HC595的串并转换功能 */* 程序功能:8段数码管显示1,2,3,4,5,6, 7, 延时2秒后,显示8,9,A,B,C,D,E,F,如此循环 */ 包含文件/#include STC12C56.H/#include STC12C56IO.H#includereg51.h#include #defi

30、ne uchar unsigned char#define uint unsigned int / 宏定义延时1s #define Delay_1us _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_()/ 8段数码管位选74595 并口I/O定义/ QHQG QF QE QD QC QA QB#define SEL_EIG 0x80#define SEL_SEV 0x40#define SEL_SIX 0x20#define SEL_FIV 0x10#d

31、efine SEL_FOU 0x08#define SEL_THI 0x04#define SEL_SEC 0x02#define SEL_FIR 0x01/ 8段数码管段选74595 并口I/O定义#define SEG_A 0xfe#define SEG_G 0xfd#define SEG_DP 0xfb#define SEG_D 0xf7#define SEG_E 0xef#define SEG_B 0xdf#define SEG_C 0xbf#define SEG_F 0x7f/ 74HC595串口I/O口定义sbit DIN = P10; /单片机数据输出口sbit E_595 =

32、P11;sbit SCK = P12;/ 全局变量定义uchar FIR_Number;uchar SEC_Number;uchar THI_Number;uchar FOU_Number;uchar FIV_Number;uchar SIX_Number;uchar SEV_Number;uchar EIG_Number;/ 8段数码管(共阳极)0,1,2,3,4,5,6,7,8,9的字模code uchar Segments =/*SEG_A&SEG_B&SEG_C&SEG_D&SEG_E&SEG_F, / 0 SEG_B&SEG_C, / 1 SEG_A&SEG_B&SEG_D&SEG_

33、E&SEG_G, / 2 SEG_A&SEG_B&SEG_C&SEG_D&SEG_G, / 3 SEG_B&SEG_C&SEG_F&SEG_G, / 4 SEG_A&SEG_C&SEG_D&SEG_F&SEG_G, / 5 SEG_A&SEG_C&SEG_D&SEG_E&SEG_F&SEG_G, / 6 SEG_A&SEG_B&SEG_C, / 7 SEG_A&SEG_B&SEG_C&SEG_D&SEG_E&SEG_F&SEG_G,/ 8 SEG_A&SEG_B&SEG_C&SEG_D&SEG_F&SEG_G, / 9 SEG_A&SEG_B&SEG_C&SEG_E&SEG_F&SEG_G,

34、/ A SEG_C&SEG_D&SEG_E&SEG_F&SEG_G, / B SEG_A&SEG_D&SEG_E&SEG_F, / C SEG_B&SEG_C&SEG_D&SEG_E&SEG_G, / D SEG_A&SEG_D&SEG_E&SEG_F&SEG_G, / E SEG_A&SEG_E&SEG_F&SEG_G, / F*/0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/ 串行数据输出到595并口void Output_595(uchar DIS_NUM1, uchar

35、DIS_NUM2)uchar i;/ 输出8位段码 这里给数码管输数据相当于串行通信;for(i=0; i8; i+) DIN = (bit)(DIS_NUM1 & 0x80);/将最高位,也就是送入P1.0的数据判断DIS_NUM1 = 0x01;/将送入的数据的每一位都移到最高位SCK = 0; Delay_1us; Delay_1us;SCK = 1;/ 输出8位位选for(i=0; i8; i+) DIN = (bit)(DIS_NUM2 & 0x80);DIS_NUM2 = 0x01;SCK = 0; Delay_1us; Delay_1us;SCK = 1; Delay_1us;

36、Delay_1us;E_595 = 0;/ 拉低锁存器控制端Delay_1us; Delay_1us;E_595 = 1;/ 上升沿,将数据输出到锁存器Delay_1us; Delay_1us;E_595 = 0;/ 拉低锁存器控制端Delay_1us; Delay_1us;/ 延时1msvoid Delay_1ms()/ 12.000MHzunsigned char i, j;_nop_();_nop_();i = 12;j = 168;dowhile (-j); while (-i);/ 主函数void main(void)uchar SEG_SEL = 0;uchar SEG_NUM =

37、 0;uint i;/LED_PWM = 0;while(1)for(i=0; i139; i+)SEG_SEL = SEL_FIR;SEG_NUM = Segments0;Output_595(SEG_NUM, SEG_SEL);/ 第1个数码管显示0Delay_1ms();SEG_SEL = SEL_SEC;SEG_NUM = Segments1;Output_595(SEG_NUM, SEG_SEL);/ 第2个数码管显示1Delay_1ms();SEG_SEL = SEL_THI;SEG_NUM = Segments2;Output_595(SEG_NUM, SEG_SEL);/ 第3个数码管显示2Delay_1ms();SEG_SEL = SEL_FOU;SEG_NUM = Segments3

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号