单片机应用技术项目教程(C语言版)项目三 数码管显示
c语言数码管显示多位数字的程序
标题:C语言实现数码管显示多位数字的程序一、引言在嵌入式系统中,数码管是一种常见的数字显示设备,常用于显示温度、湿度、时间等信息。
本文将介绍如何使用C语言编写程序,实现数码管显示多位数字的功能。
二、基本原理数码管是由许多LED灯组成的,每一个LED代表一个数字或者一个字母。
常见的数码管有共阴极数码管和共阳极数码管两种。
在本文中,我们以共阴极数码管为例进行讲解。
1. 共阴极数码管共阴极数码管的基本构造是共阴极和若干个LED管组成的显示器。
共阴极数码管的特点是:所有LED管的阴极是公用的,阳极分别接到每一位数字的引脚上。
通过控制每个数字管的阳极输入信号,可以实现控制数码管显示不同的数字和字符。
2. 显示多位数字要实现显示多位数字,首先需要确定每一个数码管的数据输入引脚,根据接线原理将对应的引脚连接到单片机的IO口。
然后通过C语言编写程序,控制每个数码管显示对应的数字。
三、C语言实现多位数字显示程序示例下面以8051单片机为例,展示一个简单的C语言程序,实现数码管显示多位数字的功能。
```c#include <reg52.h>// 定义控制数码管的引脚sbit DIG1 = P1^0;sbit DIG2 = P1^1;sbit DIG3 = P1^2;sbit DIG4 = P1^3;// 定义数码管显示的数字unsigned char code smgduan[16]={0x3f, //00x06, //10x5b, //20x4f, //30x66, //40x6d, //50x7d, //60x07, //70x7f, //80x6f, //90x77, //A0x7c, //B0x39, //C0x5e, //D0x79, //E0x71 //F};// 数码管扫描函数void display(unsigned char *dat) {DIG1 = 0;P0 = dat[0];DIG1 = 1;DIG2 = 0;P0 = dat[1];DIG2 = 1;DIG3 = 0;P0 = dat[2];DIG3 = 1;DIG4 = 0;P0 = dat[3];DIG4 = 1;}void main(){while(1){unsigned char num[4] = {0, 1, 2, 3}; // 要显示的数字数组 display(smgduan[num[3]]);delay(1);display(smgduan[num[2]]);delay(1);display(smgduan[num[1]]);delay(1);display(smgduan[num[0]]);delay(1);}}```在上述示例中,我们先定义了数码管的引脚和显示的数字所对应的编码。
单片机应用技术项目教程(C语言版)全书教案完整版课程设计整本书电子教案单元设计
项目一 发光二极管LED控制课时(学时)8学时终极目标1.能完成单片机最小系统和输出电路设计;2.能应用C语言程序完成单片机输入输出控制,实现对LED控制的设计、运行及调试。
促成目标1.了解AT89S52单片机结构;2.掌握AT89S52单片机的引脚功能;3.掌握AT89S52单片机最小系统电路设计;4.掌握C语言基本构成和基本语句;5.会利用单片机I/O口实现点亮一个LED和控制LED闪烁。
教学重点1.AT89S52单片机引脚功能;2.AT89S52单片机最小系统电路设计;3.C语言基本构成和基本语句;4.LED闪烁控制设计与实现。
教学难点 1. AT89S52单片机的引脚功能;2. AT89S52单片机最小系统电路设计;3. LED闪烁控制设计与实现。
教学内容一、工作模块1点亮一个LED;1.AT89S52单片机结构;2.AT89S52单片机引脚功能;3.AT89S52单片机最小系统。
二、工作模块2 LED闪烁控制设计与实现;1.C语言程序的基本构成;2.C语言基本语句。
教学手段多媒体演示及实训练习相结合教学方法设计1.项目驱动2.教学做一体项目二 LED循环点亮控制课时(学时)10学时终极目标 1.能完成单片机的输入输出电路设计;2.能应用C语言程序完成单片机输入输出控制,实现对LED循环点亮控制的设计、运行及调试。
促成目标 1. 掌握P0、P1、P2和P3功能及应用技能;2. 掌握内部数据存储器的地址分配及特殊功能寄存器;3. 掌握C语言数据类型、常量和变量;4. 会利用单片机I/O口实现开关控制LED循环点亮和步进机电控制。
教学重点 1. AT89S52单片机P0、P1、P2和P3功能;2.内部数据存储器的地址分配及特殊功能寄存器;3.C语言数据类型、常量和变量;4.开关控制LED循环点亮。
教学难点 1.电路图的设计;2.51单片机的内存空间地址分配。
教学内容 一、工作模块3 LED循环点亮控制模块1.工作任务要求;2. LED循环点亮电路设计;3. LED循环点亮程序设计;4. 并行I/O端口电路介绍。
第3节-数码管驱动(项目3)
}
void main (void)
{
unsigned char i;
ห้องสมุดไป่ตู้
// 变量 i 作为数组的0~9编号
P2 = 0;//P2.0 = 0,通过反相器反相后,加在数码管公共端上的电压
while (1)
{ P0 = seven_seg[i]; delay(50000); i++;
//输出0~9到共阳七段显示器 //调用时间延迟函数delay()
在程序设计时,库函数可以很方便的被用户程序调用。 例如,利用库函数实现的跑马灯程序为
/************************/
#include<reg51.h> #include<intrins.h>//库函数的头文件
void delay(unsigned int x)
while (1)
{ …….. delay(1000); …… }
}
//调用时间延迟函数,实参为1000
三、有返回值函数
如果函数中要返回数值时,必须使用return命令。 并且返回值的类型必须与函数的类型一致。如把8位8421二 进制码转换成8421BCD码函数。
unsigned char DEC_BCD_conv(unsigned char x)
if(i == 10)
i = 0;
}
}
当程序中使用常量数据时,如共阳数码管数字显示编 码、液晶显示器的汉字编码等,一般希望这些数据当程序 下载到单片机时存放在单片机的ROM区,对此类数据声明前 面需要加上关键字code或const,如数码管的显示编码。
利用数码管也可以显示日期和时间,但是在本项目中, 数字变化时间是由延时函数实现的,由于C语言程序进过编 译后的生成的汇编程序与直接采用汇编语言编写的程序
单片机实验报告,数码管显示
单片机实验报告,数码管显示实验目的1、掌握数码管动态扫描显示的原理和编程实现方法;2、掌握软件延时程序的使用。
实验任务利用数码管动态显示,设计一个两位秒表,计时0-59,时间到了显示“FF”,使用软件延时实现。
实验原理数码管动态显示的连接方式是将所有数码管的段码a、b、c、d、e、f、g、dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。
所谓动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
具体过程是:当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的位选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中每位数码管的点亮时间为2ms左右,由于人的视觉暂留现象及发光极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
实现延时通常有两种方法:一种是硬件延时,这需要用到单片机的定— 1 —时器,这种方法可以提高CPU的工作效率,也能做到精确控制时间,此方法将在实验四中再学习;另一种方法是软件延时,这种方法主要采用循环体进行。
可以采用for循环以及for循环嵌套的方式达到粗略的长时间延时,利用Keil软件可以调试和观察for语句的延时时间。
实验结果:总结:本次实验我很好的复习了有关C语言的相关语句知识点,合理的运用到了单片机的程序编码中去,但实验过程中,也出现了很多问题。
比如在运行过程中,数码管会乱码,检查后发现是扫描信号端口错误,将扫描信号端口顺序调换,重新运行则解决了乱码问题。
共阴数码管电路0到15的显示参数代码表要记清楚。
单片机3数码管显示功能的实现
实验3 数码管显示功能的实现1、实验目的1、了解发光二极管的使用方法;2、熟悉串行、并行输出扩展接口的方法;3、学习常用指令用法和简单程序编写技巧。
2、实验要求1、对照图1.2.6和图3.1.3、图3.1.4,理解图1.2.6所示的电路工作原理;2、读懂串行接口和并行接口的LED显示参考示例程序;3、分别运行并验证参考示例程序;4、要让次低位LED数码管显示中总是带有小数点,即显示的6位数值中包括一位小数,请修改参考程序实现;5、利用实验箱通用板上的电路模块,自行设计4位LED数码管显示器的串行静态、并行静态显示电路,参照图3.1.3、图3.1.4画出实验电路原理图,并按所设计电路图搭接实验电路;6、根据所设计搭接的实验电路,自行编写4位数码管显示器的串行静态、并行静态显示程序,并调试通过。
3、实验原理LED数码管显示器由于经济实用、亮度高、控制简单,在测量与控制系统中被广泛用于显示被测物理量或内部参数。
根据LED数码管显示器与单片机连接方式的不同,有静态显示和动态显示两种。
所谓静态显示,就是所有的数码管同时点亮,需要的器件较多,占用印刷电路板的面积要大一些,消耗的电源电流也要大一些,但是占用的CPU的时间则要少一些。
所谓动态显示,是指每位数码管分时依次点亮,由于人眼的视觉暂留现象,给人的感觉是同时都是点亮的。
动态显示需要的器件数量、印刷电路板的面积、功率消耗都要少一些,但是CPU必需经常刷新,占用CPU的时间要多一些。
无论是动态显示还是静态显示,根据电路的不同,都可再分为串行接口和并行接口两种控制方式。
串行接口需要的CPU口线要少一些,但是占用CPU的时间要长一些。
反之,并行接口需要的CPU 的口线要多一些,但是占用CPU的时间要少一些。
实际应用时,应根据系统的特点,选择不同的显示方式。
在CPU运行时间许可的情况下,应尽量选择串行动态显示方式,以实现“用时间换硬件资源”的目的。
1、数码管电路结构常见LED数码管显示器的外形如图3.1.2(a)所示,内部电路结构如图3.1.2(b)所示,内部8 个发光二极管处于不同的位置,每个发光二极管显示一个笔画,称为一段;通过外接电路控制点亮不同的发光二极管组合,显示一位相应的数字(符号)。
单片机C语言程序(数码管动态静态显示)
0123动态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id di splay();v oid m ain(){E A=1;ET1=1;T MOD=0x10;TH1=(65536-500)/256;TH0=(65536-500)%256;TR1=1;nu m=0;whil e(1){if(nu m==20){n um=0;i f(num du==4)numdu=0;if(numwe==4)nu mwe=0;displ ay();n umdu++;numw e++;}}}v oid t ime1() int errup t 3{TH1=(65536-500)/256;T H0=(65536-500)%256;num++;}voiddispl ay(){P0=0xff;we la=1;wel a=0;P0=t abled u[num du];dula=1;dula=0;P0=tab lewe[numwe];w ela=1;we la=0;}0123静态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id de lay(u char);voi d mai n(){EA=1;E T1=1;TMO D=0x10;T H1=(65536-50000)/256;TH0=(65536-50000)%256;TR1=1;while(1){P0=0xf f;wela=1;wela=0;P0=t abled u[0];du la=1;du la=0;P0=tabl ewe[0];wela=1;wela=0;P0=0x ff;wela=1; wel a=0;P0=table du[1];d ula=1;d ula=0;P0=tab lewe[1];wela=1;wela=0;P0=0xff;wel a=1;we la=0;P0=tabl edu[2];dula=1;dula=0;P0=ta blewe[2];wel a=1;wel a=0;P0=0xff;we la=1;w ela=0;P0=tab ledu[3];dula=1;dula=0;P0=t ablew e[3];we la=1;we la=0;} }0-999循环跳变#in clude<reg52.h>#defi ne uc har u nsign ed ch ar#d efine uint unsi gnedintu int a,b,co unt,n um,nu mdu,n umwe; ucha r cod e tab ledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u charcodetable we[]={0xf e,0xf d,0xf b,0xf7};s bit d ula=P2^6;sbitwela=P2^7;void dela y(uch ar);voiddispl ay(uc har,u char,uchar); vo id ma in(){EA=1;ET1=1;TM OD=0x10;TH1=(65536-50000)/256;T H0=(65536-50000)%256;TR1=1;coun t=0;whil e(1){if(nu m==20){nu m=0;if(count==1000)count=0;c ount++;}d ispla y(cou nt/100,cou nt%100/10,count%10);}}void time1() i nterr upt 3{T H1=(65536-50000)/256;TH0=(65536-50000)%256;num++;}void disp lay(u charbai,u charshi,u charge){P0=0xff;wel a=1;wela=0;P0=ta bledu[bai];du la=1;dul a=0;P0=t ablew e[1];wel a=1;wela=0;delay(1);P0=0xff;wela=1;wela=0;P0=tab ledu[shi];dul a=1;dula=0;P0=ta blewe[2];wela=1;wela=0;d elay(1); P0=0xff;wela=1;wela=0;P0=tab ledu[ge];dula=1;dula=0;P0=tab lewe[3];wela=1;w ela=0;de lay(1);}voiddelay(ucha r x){uc har a,b;for(a=x;a>0;a--)f or(b=200;b>0;b--); }。
单片机数码管显示实验
单片机数码管显示实验单片机数码管显示实验一、实验目的本实验旨在通过单片机控制数码管显示,掌握单片机的基本操作和数码管显示原理,培养实践能力和创新意识。
二、实验原理1.单片机基本原理单片机是一种微型计算机,广泛应用于各种嵌入式系统中。
它具有体积小、功耗低、功能强大、可靠性高等优点。
本实验采用常见的8051单片机进行操作。
2.数码管显示原理数码管是一种常见的电子显示器件,可以显示数字和某些特定字符。
它由多个LED段组成,通过控制不同段的亮灭来显示不同的数字或字符。
本实验采用共阴极数码管进行显示。
三、实验步骤1.硬件准备(1)选择合适的单片机开发板和数码管;(2)连接数码管的阳极和单片机的某个端口;(3)连接数码管的各个段到单片机的其他端口;(4)连接电源和地线。
2.程序编写使用单片机开发软件(如Keil)编写程序,控制数码管显示不同的数字或字符。
程序中需要定义数码管的段码,以及选择要显示的数字或字符。
3.调试与测试将程序下载到单片机中,接通电源,观察数码管是否正常显示。
如果出现问题,检查硬件连接是否正确,或者修改程序中的控制逻辑。
四、实验结果与分析在本实验中,我们成功地实现了数码管的显示。
通过编写程序,我们可以控制数码管显示不同的数字和字符。
例如,我们可以编写一个循环程序,让数码管依次显示0-9的数字,或者某个特定的字符。
通过实验,我们深入了解了单片机的操作和数码管显示原理。
在实践中,我们需要注意硬件连接的正确性,以及控制程序的逻辑性。
如果硬件连接不正确,可能会导致数码管无法正常显示;如果程序逻辑有误,则可能导致显示的数字或字符不正确。
因此,我们需要认真检查硬件连接和程序逻辑,确保实验结果的准确性。
五、实验总结与展望本实验通过单片机控制数码管显示,使我们对单片机的操作和数码管显示原理有了更深入的了解。
在实验过程中,我们需要注意硬件连接的正确性和程序逻辑的准确性。
通过不断调试和测试,我们可以提高自己的实践能力和创新意识。
单片机指令的数码管显示学习如何使用单片机指令进行数码管显示
单片机指令的数码管显示学习如何使用单片机指令进行数码管显示在学习如何使用单片机指令进行数码管显示之前,我们首先需要了解什么是单片机和数码管。
一、单片机简介单片机是一种集成电路芯片,具有微处理器、存储器和各种接口电路等功能。
它具有体积小、功耗低、成本低等特点,广泛应用于电子设备、通信设备、汽车电子等领域。
二、数码管简介数码管是一种电子数字显示器件,常用来显示数字信息。
常见的数码管有共阴极数码管和共阳极数码管,其中共阴极数码管的极性是负极大,共阳极数码管的极性是正极大。
接下来,我们将学习如何使用单片机指令控制数码管进行显示。
1. 准备工作首先,我们需要准备以下材料:- 单片机开发板- 数码管(可以根据需要选择共阴极还是共阳极数码管)- 面包板- 连接线2. 硬件连接将数码管的引脚与单片机开发板上的引脚相连接,确保连接稳固。
3. 编写代码使用单片机开发工具(如Keil、Arduino等)编写相应的代码。
下面以Keil例举一个简单的示例。
```#include <reg51.h>sbit digit1 = P2^0;sbit digit2 = P2^1;sbit digit3 = P2^2;sbit digit4 = P2^3;sbit segA = P0^0; // 数码管A段sbit segB = P0^1; // 数码管B段sbit segC = P0^2; // 数码管C段sbit segD = P0^3; // 数码管D段sbit segE = P0^4; // 数码管E段sbit segF = P0^5; // 数码管F段sbit segG = P0^6; // 数码管G段sbit segDP = P0^7; // 数码管小数点段void delay(unsigned int n){unsigned int i, j;for(i = 0; i < n; i++)for(j = 0; j < 120; j++);}void displayDigit(unsigned char digit){switch(digit){case 0:segA = 0; segB = 0; segC = 0; segD = 0; segE = 0; segF = 0; segG = 1; segDP = 1;break;case 1:segA = 1; segB = 0; segC = 0; segD = 1; segE = 1; segF = 1; segG = 1; segDP = 1;break;case 2:segG = 0; segDP = 1;break;case 3:segA = 0; segB = 0; segC = 0; segD = 0; segE = 1; segF = 1; segG = 0; segDP = 1;break;case 4:segA = 1; segB = 0; segC = 0; segD = 1; segE = 1; segF = 0; segG = 0; segDP = 1;break;case 5:segA = 0; segB = 1; segC = 0; segD = 0; segE = 1; segF = 0; segG = 0; segDP = 1;break;case 6:segA = 0; segB = 1; segC = 0; segD = 0; segE = 0; segF = 0; segG = 0; segDP = 1;break;case 7:segG = 1; segDP = 1;break;case 8:segA = 0; segB = 0; segC = 0; segD = 0; segE = 0; segF = 0; segG = 0; segDP = 1;break;case 9:segA = 0; segB = 0; segC = 0; segD = 1; segE = 1; segF = 0; segG = 0; segDP = 1;break;default:break;}}void main(){unsigned char i;while(1){for(i = 0; i < 10; i++){displayDigit(i);delay(1000);}}}```4. 烧写程序将编写好的代码烧写到单片机开发板上。
单片机3数码管显示1234PPT课件
精选PPT课件
5
程序流程图
开始
N 条件?
Y 位显示
显示数字
延时
结束
精选PPT课件
6
编程与调试
• 建项目、选芯片 • 建C文件 • 编译、连接、生成HEX文件 • 调试
精选PPT课件
7
任务(2)分析
• 判断是否有按键按下 • 加入按防抖和放手防抖 • 判断按下键 • 将最右侧显示数值移位 • 将按键值送入显示存储器
z=P3;
if (z!=0xff)
{ a=0x7f;
for (i=1;i<=6;i++)
{if (z==a)
{
table1[0]=table1[1]; //将低位移出
table1[1]=table1[2];
table1[2]=table1[3]; table1[3]=i; delay(200);
while (P3!=0xff); delay(200);
精选PPT课件
8
程序(2)
• 参考程序
• //头文件: 显示输入
• #include "reg51.h"
• #include "intrins.h"
• #define uchar unsigned char
• //变量定义:
• unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};
• 2、计算机、KEIL uVISION软件、 STC-ISP-V3.1软件和等 。
精选PPT课件
4
分析
• 分析控制方法: • (1)、选择4个位控制端口置个十百千万
03.项目三 数码管显示
应当注意if与else的配对关系,C语言规定:else 总是与它上面的最近的if配对
项目三 数码管显示
计算机科学系
单片机应用技术项目教程(C语言版)
swich语句
Switch的一般形式如下:
项目三 数码管显示
计算机科学系
单片机应用技术项目教程(C语言版)
循环结构控制语句
在一个实用的程序中,循环结构是必不可少的。 循环是 反复执行某一部分程序行的操作。通过下面C语言程序, 来看如何利用这些循环语句编写循环程序。
void Delay() void main() { { unsigned char i, j; while(1) for (i=0;i<255;i++) {;} {……} } } 这段程序中有两处用到了循环语句,首先是主程序使用了: while(1) {……} 这样的循环语句写法,在{}中的所有程序将会不断地循环执行, 直到断电为止;其次是延时程序,使用了for循环语句的形式。
switch(表达式) { case 常量表达式1:语句1 case 常量表达式2:语句2 „„ case 常量表达式n:语句n default:语句n+1 }
当表达式的值与某一个case后面的常量表达式相等时,就执行此 case后面的语句; 若所有的case中的常量表达式的值都没有与表达式值匹配的,就 执行default后面的语句; 每一个case的常量表达式的值必须不相同; 各个case和default的出现次序不影响执行结果。
单分支if语句
项目三 数码管显示
计算机科学系
单片机 第三讲 数码管显示
第三讲 数码管显示原理及应用实现
uchar code table []={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; viod delayms(uint); viod main() { while(1) { dula=1; p0=table[1]; dula=0;
第三讲 数码管显示原理及应用实现
dula=1; p0=table[3]; dula=0; p0=0xff; wela=1; p0=0xfb; wela=0; delayms(500); dula=1; p0=table[4]; dula=0; p0=0xff; wela=1; p0=0xf7;
第三讲 数码管显示原理及应用实现
第三讲 数码管显示原理及应用实现
p0=0xff;送位选数据前关闭所有显示,防止打开位选锁存时 wela=1; p0=0xfe;送位选数据 wela=0; delayms(500); dula=1; p0=table[2]; dula=0; p0=0xff; wela=1; p0=0xfd; wela=0; delayms(500);
一个闹钟我将它定时在一个闹钟我将它定时在11个小时后闹响换言之也个小时后闹响换言之也可以说是秒针走了可以说是秒针走了36003600次所以时间就转化为秒针走次所以时间就转化为秒针走的次数的也就是计数的次数了可见计数的次数和时的次数的也就是计数的次数了可见计数的次数和时间之间的确十分相关
第三讲 数码管显示原理及应用实现
3.1数码管显示原理
LED数码管,实际上是由七个发光管组成8字形构成的, 加上小数点就是8个。当数码管特定的段加上电压后,这 些特定的段就会发亮。
单片机C语言模块化编程之数码管显示电子万年历篇
单片机C语言模块化编程之数码管显示电子万年历篇————————————————————————————————作者:————————————————————————————————日期:数码管显示模块化显示电子万年历数码管共阳极7407驱动共阴极max7221/7419驱动Ds1302 实时时间显示Ds18b20 温度显示芯片/*delay.h*/#ifndef _DELAY_H#define _DELAY_H_#define uint unsigned int#define uchar unsigned charvoid delay(uint xms); //秒级延时void delayms(uint xms); //毫秒级延时,不可以更改,若更改,DS18B20将显示异常#endif/*delay.c*/#include "delay.h"void delay(uint xms){uint i;uchar j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void delayms(uint xms) //毫秒级别延时{while(xms--);}/*ds1302.h*/#ifndef _DS1302_H_#define _DS1302_H_#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit IO=P1^0; //ds1302跟单片机接口sbit SCLK=P1^1;sbit RST=P1^2;extern unsigned char datetime[7]; //存储获得的时间值extern void gettime(); //读取时间值函数#endif/*ds1302.c*/#include <intrins.h>#include "ds1302.h"uchar datetime[7]={0,0,0,0,0,0,0}; //用来接收获得的时间值void write_a_byte_to_ds1302(uchar X){uchar i;for(i=0;i<8;i++){IO=X&0X01;SCLK=1;SCLK=0;X>>=1;}}uchar get_a_byte_from_ds1302(){uchar i,b=0x00;for(i=0;i<8;i++){b|=_crol_((uchar )IO,i);SCLK=1;SCLK=0;}//return b/16*10+b%16; //返回的BCD码转换为十进制return (b>>4)*10+(b&0x0f); //注意运算的优先级}uchar read_data(uchar add){uchar dat;RST=0;SCLK=0;RST=1;write_a_byte_to_ds1302(add);dat=get_a_byte_from_ds1302();SCLK=1;RST=0;return dat;}void gettime() //ds1302读取当前时间存储在datetime中{uchar i,add=0x81;for(i=0;i<7;i++){datetime[i]=read_data(add);add+=2;}}/*max7221.h*/#ifndef _MAX7221_H_ //注:Max7221只能用来驱动共阴数码管,对共阳的没效#define _MAX7221_H_#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit DIN=P2^0; //max7221与单片机接口DIN..CSB..CLK..sbit CSB=P2^1;sbit CLK=P2^2;sbit DIN1=P2^3;sbit CSB1=P2^4;sbit CLK1=P2^5;extern void write(unsigned char addr , unsigned char dat); //max7221写数据,转换数据函数,num的值为1,或者2,当num为1时,片选的是第一块Max7221,同理亦然。
项目3单片机应用技能实训(C语言)教案
项目3单片机应用技能实训(C语言)教案
单片机应用技能实训(C语言)教案—项目3
项目3 电动机正反转控制电路制作
任务1 项目相关知识学习
二、教学实施过程
图3-2 图3-3
图3-4是光耦工作原理示意图。
图3-4光耦工作原理示意图
光电耦合器的主要优点是:信号单向传输,
全实现了电气隔离,输出信号对输入端无影响,抗干扰能力强,工作稳定,无触点,使用寿命长,传输效率高。
图3-5 光耦与单片机的连接图3-6电动机正反转控制
三、直流电动机正反转控制原理
图3-6是永磁式直流电动机的正反转控制电路示意图,由两个开关SW1、SW2的状态来控制电动机的正转、反转及停止。
图3-8 图3-9
通常去抖动有硬件、软件两种方法。
用硬件去抖动的方法通常用RS触发器组成的去抖动电路如图3-9所示。
任务2 电动机正反转控制电路硬件、软件设计
二、教学实施过程
2、元件选择
(1)复习晶振电路元件及复位电路元件的选择。
(2)发光二极管电路元件选择。
(3)光电隔离电路及电动机正反转控制电路元件的选择。
任务3 电动机正反转控制电路的计算机仿真
二、教学实施过程
1、将所需元器件加入到对象选择器窗口
AT89S51用AT89C51代替,红色发光二极管、黄色发光二极管、绿色发光二极管的英文
“LED-YELLOW”、“LED-GREEN
…”或者点击工具栏的新建文件按钮
任务4 电动机正反转控制电路的制作与调试
二、教学实施过程
四、电路连接
1、根据电路接线图进行各元件之间的连接。
单片机c语言版数码管动态显示实验报告
数码管动态显示实验一、实验要求1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连,P2.0~P2.3引脚输出选控制信号3.在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned intshow_value的值(show_value的值范围为0000~9999),即把show_value的千百十个位的值用数码管显示出来。
二、实验目的1.巩固Proteus软件和Keil软件的使用方法2.学习端口输入输出的高级应用3.掌握7段数码管的连接方式和动态显示法4.掌握查表程序和延时等子程序的设计三.实验说明(条理清晰,含程序的一些功能分析计算)如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P3.2和P3.3分别接PB1与PB2,实现数字的增减。
所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。
在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,disp[0]=show/1000; //显示千位的值 disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的值 disp[3]=show%10; //显示个位的值本实验需要用到IE寄存器与TCON寄存器。
四、硬件原理图及程序设计(一)硬件原理图设计图(五)开始运行proteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。
(二)程序流程图设计三)程序设源代码#include<reg51.h> //定义8051寄存器头文件#define SEG7P P1 // 定义数码管输入信号接P1 #define SCANP P2 //定义数码管扫描信号接P2 char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组void delay_ms(int x); //声明延迟函数char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号char i,j; //声明变量void display(); //显示数组diso的内容int show=0000; //定义初始值void get_disp(); //声明返回diap main() //主程序开始{IE=0X85; //开IE寄存器,允许INT0和INT1中断TCON=0X05; //开INT0,INT1while(1) //无穷循环{get_disp();display();}void delay_ms(int x) //声明延迟函数{ int i,j; //定义变量for (i=0;i<x;i++) //开始计数,计数x次for (j=0;j<120;j++); //计数120次,延迟1ms }void display() //声明显示函数{for(i=0;i<4;i++) //开始计数,计数4次{ j=disp[3-i]; //diap的值附到变量j SCANP=scan[i]; //显示扫描信号SEG7P=TAB[j]; //显示数字到数码管delay_ms(4); //延迟4ms}}void INT0_ISR(void) interrupt 0 //INT0中断子程序开始 {if(show<9999) //如果显示数值小于9999show++; //显示数值自增1else show=0; //否则显示数值0}void_INT1_ISR(void) interrupt 2 //INT1中断子程序开始{if(show>0) //如果显示数值大于0show--; //显示数值自减1else show=9999; //否则显示数值9999}void get_disp (){disp[0]=show/1000; //显示千位的值disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的disp[3]=show%10; //显示个位的值}五.实验总结实验过程中遇到的问题及解决方法、体会问题1:运行电路原理图时,数码管都不亮。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态显示功能实现分析
电路接法:在多位LED显示时,为了降低成本和 功耗,将所有位的段选控制端并联起来,由一个8 位端口控制(本任务中用P0口);各位数码管的 公共端(com端),用作“位选端”,由另一个 端口进行显示位的控制(本任务中用P1口)。 原理:由于段选端是公用的,要让各位数码管显 示不同的字符,就必须采用扫描方式,即动态扫 描显示方式。动态扫描是采用分时的方法轮流点 亮各位数码管的显示方式,它在某一时间段,只 让其中一位数码管的“位选端”(com端)有效, 并送出相应的字型编码。
• • • •
8个发光二极管组成 通过不同组合显示数字和字符(举例) 引脚排列 F 有共阴和共阳两种结构,分别 讲其工作原理
E
A
B G
C
D
DP
共阴数码管
片选
共阳数码管
片选
2、数码管的字型编码 要使数码管显示某个字符,必须使8段二极管加上相应的电平组合,即一 个8位数据,这个数据就叫字符的字型编码 。这个8位数据和各段对应关系见图3-2,要显示的字符和共阴共阳字型 编码(互为反码)对应关系见表3-1。举例。 3、数码管的显示方法(动态和静态) ▲动态:概念、使用场合(多、显示不同数字)、特点(节省I/O资 源,电路简单、稳定度差、占用更多CPU时间)
思考题
如何修改程序,实现六位LED数码管只显示 其中的两位(1和6)?显示112233? 显示5~0?算符和关系表达式(P77)
3.1 工作模块6 数码管循环显示 0~9
• 工作任务:
利用AT89S52 单片机的P2端口的P2.0-P2.6 连接到一个 共阴数码管的a-g 7个引脚上,数码管的公共端接地。在 数码管上循环显示 0-9 数字。 3.1.1 认识数码管 重要的显示器部件 。 分类:LED和LCD。 LED 特点:价格低廉、体积小、功耗低、可靠性好。 1、数码管的结构和工作原理
“十二五”职业教育国家规划教材
(经全国职业教育教材审定委员会审定)
单片机应用技术项目教程--C语言版 (第二版)
项目三 数码管显示控制
教学目的
掌握LED数码管的结构、工作原理和显示方式; 掌握LED数码管静态显示的原理、电路和程序设 计; 掌握LED数码管动态显示的原理、电路和程序设 计; 掌握C语言的语句结构、数组及函数的相关知识。
▲静态:概念、使用场合(少、显示相同数字)、特点(占用CPU时间 少、编程简单、 占I/O资源多、电路复杂、成本高)
3.1.2数码管循环显示 0~9 电路设计
1、74LS245
74LS245是8路同相三态 双向数据总线驱动芯片, 具有双向三态功能,既可 以输出,也可以输入数据。
/G为低电平有效; DIR=“1”,信号由 A 向 B 传输。
引出端符号:
A B /G 总线端 总线端 三态允许端(低电平 有效) DIR 方向控制端
2、电路设计
3、数码管显示程序(C程序)
1. #include <AT89X52.H> 2. unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x 6f}; 3. unsigned char dispcount; 4. void delay (void) 5. { 6. unsigned int j,k; 7. for(j=1000;j>0;j--) 8. for(k=124;k>0;k--); 9. } 1. void main(void) 2. { 3. while(1) 4. { 5. for(dispcount=0;dispcount< 10;dispcount++) 6. { 7. P1=table[dispcount]; 8. delay (); 9. } 10. } 11. }
1. void main() // 同时显示123456 2. { unsigned char j; 3. while(1) 4. { for(j=1;j<7;j++) 5. { P0=Tab[j]; 6. P1=Col[j-1]; //开第一个(共阴)数码管 7. Delay(); 8. P1=0xff; //关数码管 9. Delay();} 10. } 11.}
思 考
1、如何在数码管上循环显示 9 - 0数字? 2、如何在数码管上显示5~9再显示9~5, 如此循环? 3、数码管共阳接法,程序怎么修改?
3.3 工作模块7 多个数码管动态扫描 显示
工作任务: 显示器由6个共阴极LED数码管构成; P0口输出显示段码,经由一片74LS245驱动输出 给LED管; P1口输出位码(片选),输出给LED管。 通过动态扫描程序使6个数码管显示’’123456’’.
首先从段选线上(P0)送出字型编码,再控制位选端 (P1),字符就显示在指定数码管上,其他位选端无效 的数码管都处于熄灭状态,持续1.5ms时间,然后关闭所 有显示;
接下来又送出新的字型编码,按照上述过程又显示在另外 一位数码管上,直到每一位数码管都扫描完为止,这一过 程即为动态扫描显示。
数码管其实是轮流依次点亮的,但由于人的视觉驻留效应, 因此当每个数码管点亮的时间小到一定程度时,人就感觉 不出字符的移动或闪烁,觉得每位数码管都一直在显示, 达到一种稳定的视觉效果。
3.3.1 LED动态扫描显示电路
3.3.2 控制程序
1. #include <AT89X52.h> 2. unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D ,0x7D,0x07,0x7F,0x6F}; 3. unsigned char code Col[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; 4. void Delay() 5. { unsigned char i; 6. for(i=0;i<250;i++);}