STM8单片机课件 流水灯和数码管
任务四键控流水灯和数码管显示优秀课件
0,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x8C,0xFF,0x89};//共
阳字型表数组
unsigned r=1; //位输出口初值,选中最左位LED
void delay1 (unsigned int); //延时1ms子函数原ed chaar i=0,a; //定义变量i —显示缓冲区数组元素
main()
{
while (1)
display( );
}
display( ) // LED动态扫描显示子函数
{ r=1; //1位选通,要根据数码管类型和硬件电路决
定,若0选通应该为r=0xfe;
i=0;
while (r!=0x40) // 6个数码管没全扫完,继续扫描
{ P3=r;
//选通某位
a=dt[i]; //显示缓冲区去该位要显示的内容
7 8 9 ABC D EF 0x8C,0x89, 0xFF,0x91 };
(显示: P H 熄灭 Y )
Proteus演示——硬件图
练习: 1、画出单片机控制6共阳LED数码管显示的电 路图1,P0和P3口分别为字型口和位选口。 2、用主子函数结构调试6管LED动态扫描程序 3、在图1的基础上,将其改为6位共阴数码管, P2和P3分别为位选和字型口。编程调试。
P0=TAB_Font[a];//查字型表向字型口输出字型
delay1 (1); //延时1ms
r<<=1; r|=1; //移位选中下一数码管,指针修正
j++;
}
P0=0x00; // 6个数码管没全完,输出熄灭字型。
}
/*延时程序*/ void delay1 (unsigned int ms) {
单片机课程设计花样流水灯2
单⽚机课程设计花样流⽔灯2前⾔随着⼈们⽣活环境的不断改善和美化,在许多场合可以看到彩⾊霓虹灯不断变化闪烁。
LED灯由于其丰富的灯光⾊彩,低廉的造价以及控制简单等特点⽽得到了⼴泛的应⽤,⽤彩灯来装饰街道和城市建筑物已经成为⼀种时尚。
但⽬前市场上各式样的LED灯控制器⼤多数⽤全硬件电路实现,电路结构复杂、功能单⼀,这样⼀旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。
这种彩灯控制器结构往往有芯⽚过多、电路复杂、功率损耗⼤等缺点。
此外从功能效果上看,亮灯模式少⽽且样式单调,缺乏⽤户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进⾏改进。
流⽔灯是⼀串按⼀定的规律像流⽔⼀样连续闪亮。
流⽔灯控制是可编程控制器的⼀个应⽤,其控制思想在⼯业控制技术领域也同样适⽤。
流⽔灯控制可⽤多种⽅法实现,但对现代可编程控制器⽽⾔,利⽤移位寄存器实现最为便利。
通常⽤左移寄存器实现灯的单⽅向移动;⽤双向移位寄存器实现灯的双向移动。
本案例利⽤价格低廉的AT89C51系列单⽚机控制基⾊LED灯泡从⽽实现丰富的变化。
1、课程设计的⽬的和要求1.1 设计⽬的近年来随着科技的发展,单⽚机的应⽤正在不断⾛向深⼊,同时带动传统控制检测⽇新⽉异更新,在实时检测和⾃动控制的单⽚机应⽤系统中,单⽚机往往是作为⼀个核⼼部件来使⽤,单⽚机⽅⾯知识是不够的,还应根据具体硬件结构,以及针对具体应⽤对象点的软件结合,加以完善。
流⽔灯,可以更简单、⽅便的使⽤。
通过本课程设计使学⽣进⼀步巩固单⽚机原理及应⽤的基本概念、基本理论,分析问题的基本⽅法,增强系统地运⽤已学的理论知识解决实际问题的能⼒和查阅资料的能⼒。
培养⼀定的⾃学能⼒和独⽴分析问题、解决问题的能⼒,能通过独⽴思考、查阅⼯具书、参考⽂献,寻找解决⽅案。
1.2 设计要求设计流⽔灯的基本要求:设计⼀个流⽔灯,应⽤AT89C51试验系统,电路开启后红、绿两种颜⾊的灯在时钟信号作⽤下按⼀定规律转换状态。
单片机设计(流水灯、矩阵键盘、数码管倒计时)
单片机结业作业1.电路图2.程序:#include <reg51.h>sbit P1_6=P1^6;sbit P1_7=P1^7;unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char clock[2]={59,59}; //60秒倒计时缓冲数组unsigned char *dis_p;unsigned char keytest(); //键盘检测函数unsigned char search(); //查键值函数void display(unsigned char *p); //显示函数void main(){unsigned char i,a,c;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;dis_p=clock;while(1){P0=0x80;c=P0;for(i=0;i<8;i++){c>>=1;P0=c;a=keytest();if(a==0x0f) display(dis_p);else{display(dis_p);a=keytest();if(a!=0x0f){P3=0x00;a=search();switch(a){case 0x00:P2=0x3f;break;case 0x01:P2=0x06;break;case 0x02:P2=0x5b;break;case 0x03:P2=0x4f;break;case 0x04:P2=0x66;break;case 0x05:P2=0x6d;break;case 0x06:P2=0x7d;break;case 0x07:P2=0x07;break;case 0x08:P2=0x7f;break;case 0x09:P2=0x6f;break;case 0x0a:P2=0x77;break;case 0x0b:P2=0x7c;break;case 0x0c:P2=0x39;break;case 0x0d:P2=0x5e;break;case 0x0e:P2=0x79;break;case 0x0f:P2=0x71;break;default:break;}while((a=keytest())!=0x0f);}}}}}//**********************************主函数完void display(unsigned char *p){unsigned char buffer[]={0,0,0,0};unsigned char k,i,j,m,temp;buffer[0]=p[0]%10;buffer[1]=p[0]/10;buffer[2]=p[1]%10;buffer[3]=p[1]/10;for(k=0;k<3;k++){temp=0x10;for(i=0;i<4;i++){P3=~temp;j=buffer[i];P2=led[j];temp<<=1;for(m=0;m<200;m++);}}}//*******************************显示函数完unsigned char keytest(){unsigned char c;P1=0x0f;c=P1;c=c&0x0f;return(c);}//*******************键盘检测函数完unsigned char search(){unsigned char a,b,c,d,e;c=0xfe;a=0;while(1){P1=c;d=P1;d=d&0xf0;if(d==0x70){b=0;break;}else if(d==0xb0){b=1;break;}else if(d==0xd0){b=2;break;}else if(d==0xe0){b=3;break;}a++;c<<=1;}e=a*4+b;return(e);}//*****************查键值函数完void daojishi() interrupt 1{unsigned char a;EA=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;if(a==20){a=0;if(clock[0]==0){clock[0]=59;clock[1]=59;}else{clock[0]--;clock[1]--;}}EA=1;}。
流水灯实验教学PPT学习教案
第11页/共28页
3.4 整型变量
整型变量是整数类型的数据。整型变量是最常用 的数据类型。整型变量的定义格式是“类型说明 符 变量标识符,变量标识符…”。示例如下:
第5页/共28页
2. LED流水灯原理
2.1 流水灯原理图部分
第6页/共28页
2.2 管脚电气信息
第7页/共28页
2.3 灌电流和拉电流 灌电流(sinking current) ,对一个端口而言,如果电流方
向是向其内部流动的则是“灌电流”,比如一个IO通过一 个电阻和一个LED连接至VCC,当该IO输出为逻辑0时可 以点亮LED。 拉电流(sourcing current),对一个端口而言,如果电流 方向是向其外部流动的则是“拉电流”,比如一个IO通过 一个电阻和一个LED连至GND,当该IO输出为逻辑1时能 不能点亮LED。
第17页/共28页
3.8 运算符和表达式
位运算符是对字节或字中的二进制位(bit)进行逐位逻辑处理或移位的运算符。C51 语言中的位运算符如下所示。
“&” 运算符:进行逻辑与(AND)运算。 “|” 运算符:进行逻辑或(OR)运算。 “^” 运算符:进行逻辑异或(XOR)运算。 “~” 运算符:进行按位取补(NOT)运算。 “>>”运算符:进行右移运算。 “<<”运算符:进行左移运算。 位运算符的操作对象整型和字符型数据的字节或字,位操作不能用于float、double、
在循环体语句中一定要加入能够 改变while表达式取值的语句,保 证循环在一定条件满足的时候能 够结束,防止出现死循环的情况。
数码管加流水灯
实验报告班级学号姓名实验日期实验名称:数码管及流水灯显示一、实验目的了解数码管动态显示原理,学会LPC2103通用I/O口的使用。
二、实验内容1.用LPC2103控制8个LED闪烁形成的流水灯效果;2.用LPC2103控制数码管循环显示的效果三、实验原理1.本实验中共接入了8个共阳八段数码管(数码管阳极连在一起),演示数码管中的某一段点亮只需在对应的位置写入“0”即可。
在这里74HC595实现了数据串并转换的功能,试验中用到的两片74HC595分别用于控制八个数码管的位选和其中每个数码管的段选。
本实验循环显示了十六进制数码“0—9”。
2.为了最大程度的利用芯片的I/O口资源,在硬件设计时显示模块和数入模块都采用了芯片74HC59,74HC59是一种串行输入转并行输出的芯片,与I/O口连接的共有三个引脚:引脚SH_CP为移位暂存器的输入,上升沿时移位暂存器中的数据依次移动一位,下降沿移位寄存器的数据不变;引脚ST_CP为寄存器的时序输入,上升沿时移位暂存器的数据进入存储寄存器,下降沿时存储寄存器的数据保持不变,使用时通常将ST_CP置为低电平,移位结束后再在ST_CP端产生一个正脉冲更新数据,还有一个引脚为数据输入端DS.四、实验步骤1.用protues设计流水灯控制电路;2.在Keilc51中编写流水灯控制程序,编译通过后,与protues联合调试;3.按动k1键,观察是否达到演示效果;4.用中断方式编写程序,功能实现后再改为查询方式,比较二者的区别。
五、实验流程图六、实验源程序#include "config.h"#define SPI_CS 1<<8//P0.8定义为hc595的片选信号线,用于数码管显示数据的输出#define SPI_CS1 1<<11//P0.11定义为hc595的片选信号线,用于数码管的位选#define SPI_DATA 1<<6//P0.6输出数码管要显示的数#define SPI_DATA1 1<<7//P0.7控制那一位数码管亮#define SPI_CLK 1<<4//P0.4时钟控制信号线void DelayNS(uint32 dly){uint32 i;for(;dly>0;dly--)for(i=0;i<5000;i++);}void HC595_SendDat(uint8 dat)//待显示数据的输出{uint8 i;IOCLR = SPI_CS;//SPI_CS=0,选中芯片 for(i=0;i<8;i++)//发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0,产生输出时钟if((dat&0x80)!=0) IOSET = SPI_DATA;//发送1else IOCLR = SPI_DATA;//发送0dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1,产生输出时钟}IOSET = SPI_CS; //SPI_CS=1,输出显示数据主程序流程图 数码管显示子程序流程图}void HC595_SendDat1(uint8 dat)//要显示数据位的控制{uint8 i;IOCLR = SPI_CS1; //SPI_CS=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0if((dat&0x80)!=0) IOSET = SPI_DATA1;else IOCLR = SPI_DATA1;dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1}IOSET = SPI_CS1; //SPI_CS=1,输出显示数据}int Num_show(){const uint8 DISP_TAB[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码显示段码表 0 1 2 3 4 5 6 7 8 9 a b c d e fconst uint8 DISP_TAB1[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码显示位码表第1位 (8)uint8 i;for(i=0;i<8;i++){HC595_SendDat(DISP_TAB[i]);//与下面一条语句共同控制在第i位显示i(i<8)HC595_SendDat1(DISP_TAB1[i]);DelayNS(100);HC595_SendDat(0xff);//与下面一条语句共同控制关闭第i位数码显示HC595_SendDat1(DISP_TAB1[i]);}for(i=0;i<8;i++){HC595_SendDat(DISP_TAB[i+8]);//与下面一条语句共同控制在第i位显示i(7<i<=f)HC595_SendDat1(DISP_TAB1[i]);DelayNS(100);HC595_SendDat(0xff);//与下面一条语句共同控制关闭第i位数码显示HC595_SendDat1(DISP_TAB1[i]);}return(0);}extern void DelayNS(uint32 dly);extern void HC595_SendDat(uint8 dat);extern void HC595_SendDat1(uint8 dat);#include "config.h"#include "Num show.h"#define SPI_IOCON 0x000009d0//SPI接口的IO设置字int main(){PINSEL0=0x00000000;//设置所有引脚连接GPIOPINSEL1=0x00000000;IODIR=SPI_IOCON; //定义连接595的引脚为输出while(1){Num_show();}return(0);}#define IN_TARGET#include "config.h"void __irq IRQ_Exception(void){while(1); // 这一句替换为自己的代码}void FIQ_Exception(void){ while(1); // 这一句替换为自己的代码}void TargetInit(void){ }void TargetResetInit(void){ /* 设置系统各部分时钟 *//* PLLCON = 1;#if ((Fcclk / 4) / Fpclk) == 1VPBDIV = 0;#endif#if ((Fcclk / 4) / Fpclk) == 2VPBDIV = 2;#endif#if ((Fcclk / 4) / Fpclk) == 4VPBDIV = 1;#endif#if (Fcco / Fcclk) == 2PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);#endif#if (Fcco / Fcclk) == 4PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);#endif#if (Fcco / Fcclk) == 8PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);#endif#if (Fcco / Fcclk) == 16PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);#endifPLLFEED = 0xaa;PLLFEED = 0x55;while((PLLSTAT & (1 << 10)) == 0);PLLCON = 3;PLLFEED = 0xaa;PLLFEED = 0x55;*/ /* 设置存储器加速模块 */MAMCR = 2; //MAMCR 8u2 00-MAM 功能被禁止、01-MAM功能部分使能、10-MAM功能完全使能/* MAMTIM 8u3000=0-保留001=1-一段时间内只有 1 个处理器时钟(cclk)用于 MAM 取指。
八位数码管+流水灯案例原理与测试说明
“八位数码管+流水灯”案例原理与测试说明
1程序设计目标及程序运行效果说明
本程序是动态扫描所有的数码管,从左到右8个数码管分别显示1、2、3、4、5、6、7、8。
LED灯从右到左依次亮起。
2程序相关电路及工作原理说明
2.1 LED数码管电路
2.2 LED数码管引脚定义
2.3 工作原理
P0口的8位输出分别控制8个发光二极管L0~L7的阳极;而P2.3经反相器U4C控制8个发光管阴极E3;当阳极为高(对应P0口位为1)、阴极为低时,对应的二极管将会发光。
而P2.3经反相器U4C控制74HC138的使能信号E3,结合P2.0、P2.1、P2.2这3个位选控制信号确定8个LED数码管中的哪个被点亮;电阻R15~R22为限流电阻。
当段选为高、使能信号有效时,对应的LED管将会发光。
通过以一定频率扫描位选信号,选择段选信号进行数码管点亮一段时间,从而给人视觉上几个数码管几乎同时显示的效果;同时扫描led,使led从左到右不断亮起。
3测试方法
(1)用STC ISP默认设置,打开工程中的HEX并下载
(2)下载后观察现象为:从左到右8个数码管分别显示1、2、3、4、5、6、7、8 ; led从右至左,依次亮起。
(3)本案例无需辅助操作。
单片机实例之数码管PPT课件
unsigned char dispcount; void delaynms(unsigned char n) { unsigned char i,j;
for(i=n;i>0;i--) for(j=250;j>0;j--);
}
void main(void) { while(1)
{ for(dispcount=0;dispcount<8;dispcount++) { P1=tabledu[dispcount]; P0=tablewe[dispcount]; delaynms(20); //10ms,12MHz }
void main(void) void delay02s(void) unsigned char x=0,a,b;
数码管段码
表4-2 共阳数码管显示数字的段码表
四、程序设计
要实现0~9的显示,设
计方法与前面彩灯花样显示
类似,首先写出0~9的显示
数据(表4-1中的字型码数
据,注意电路中选用的是共
图4-6 数码管原理图
动态显示达到一定速度时,由于人眼的视觉暂
留特性,在观察时,数码管所有内容如同静态显 示一样,不会产生闪烁。所以,对动态扫描的频 率有一定的要求,频率太低,LED数码管将出现 闪烁现象。如频率太高,由于每个LED数码管点 亮的时间太短,LED数码管的亮度太低,无法看 清。所以,显示时间一般取几个ms左右为宜。在 编写程序时,常采用调用延时子程序来达到要求 的保持时间。程序工作时,使电路选通某一位数 码管后,该数码管被点亮后并保持一定的时间。
{ while(1) 本任务是实现0~99999999的加1计数显示。 静态显示电路连接特点是单片机端口的每一位与数码管的一个端相连接,相当于单片机的一个引脚外接一只发光二极管。 图4-7 动态显示流程图 例如:显示一个“3”字,那么应当是a亮、b亮、c亮、d亮、e不亮、f不亮、g亮、dp不亮。 mov r6,#5 程序的设计框图见图4-5。 24进制计数和前面的十进制计数不同的是,当计数到24时,个位数要变为0,同时十位数也要变为0。 SS:MOV R7, #200 共阴极就是将8个LED的阴极连接到一起组成公共端COM,接负极,当相应字段为高电平“1”时,可以点亮该字段; for(k=248;k>0;k--); void delay02s(void) void main(void) mov r6,#5 2s的0-9数字显示。
任务二 单片机控制流水灯PPT文档共148页
6、纪律是自由的第一条件。——黑格 尔 7、纪律是集体的面貌,集体的声音, 集体的 动作, 集体 表情, 集体的 信念。 ——马 卡连柯
8、我们现在必须完全保持党的纪律, 否则一 切都会 陷入污 泥中。 ——马 克思 9、学校没有纪律便如磨坊没有水。— —夸美 纽斯
10、一个人应该:活泼而守纪律,天 真而不 幼稚, 勇敢而 鲁莽, 倔强而 有原则 ,热情 而不冲 动,乐 观而不 盲目。 ——马 克思
31、只有永远躺在泥坑里的人,才不会再掉进坑里。——黑格尔 32、希望的灯一旦熄灭,生活刹那间变成了一片黑暗。——普列姆昌德 33、希望是人生的乳母。——科策布 34、形成天才的决定因素应该是勤奋。——郭沫若 35、学到很多东西的诀窍,就是一下子不要学很多。——洛克