stc89c52数码管怎么左右移动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stc89c52数码管怎么左右移动相关的知识,希望对你有一定的参考价值。
数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。数组的一般格式定义如下:
数据类型 数组名[常量表达式] = 元素表;
例如:
unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];
P0 = tabel[0]; // P0此时的值为0x3F
数码管动态显示数字 123
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
// 毫秒级延时函数定义
void delay(uint z) // 毫秒级延时函数定义
uint x, y;
for (x = z; x > 0; x--)
for (y = 114; y > 0; y--)
void main() // main函数自身会循环
while(1)
/*第一位显示 数字 1*/
P0 = 0XFF; // 清除断码 如果没有为P0 初始化赋值 0XFF,那么 P0的值会是上一个打开段选锁存器过程中赋予的值,执行到这里 会把段选值赋给锁存器中P0,导致数码管显示错误。
WE = 1; // 打开位选锁存器
P0 = 0XFE; // 1111 1110 选通第一位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = 0X06; // 0000 0110 显示“1”
DU = 0; // 锁存段选数据
delay(5); // 对每次数码管的切换进行 5毫秒延时操作
/*第二位显示 数字 2*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XFD; // 1111 1101 选通第二位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = 0X5B; // 0101 1011 显示“2”
DU = 0; // 锁存段选数据
delay(5);
/*第三位显示 数字 3*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XFB; // 1111 1011 选通第三位数码管
// P0 = 0X00; // 0000 0000 表示选通所有位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = 0X4F; // 0100 1111 显示“3”
DU = 0; // 锁存段选数据
delay(5);
数码管动态显示数字 123 (代码优化)
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,;
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
/*====================================
函数 :display(uchar i)
参数 :i 显示数值,取值范围0-255
返回值 :无
描述 :三位共阴数码管动态显示
====================================*/
void display(uchar i)
uchar bai, shi, ge;
bai = i / 100; //236 / 100 = 2
shi = i % 100 / 10; //236 % 100 / 10 = 3
ge = i % 10;//236 % 10 =6
//第一位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[bai];//
DU = 0;//锁存段选数据
delay(5);
//第二位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[shi];//
DU = 0;//锁存段选数据
delay(5);
//第三位数码管
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFB; //1111 1011
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[ge];//
DU = 0;//锁存段选数据
delay(5);
void main()//main函数自身会循环
while(1)
display(123); //数码管显示函数
数码管动态显示数字 12345678 (代码优化)
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,;
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
/*====================================
描述 :八位共阴数码管动态显示
====================================*/
void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8)
/*第一位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num1];//
DU = 0;//锁存段选数据
delay(1);
/*第二位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num2];//
DU = 0;//锁存段选数据
delay(1);
/*第三位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFB; //1111 1011
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num3];//
DU = 0;//锁存段选数据
delay(1);
/*第四位显示*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XF7; // 1111 0111 选通第四位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = tabel[num4];//
DU = 0; // 锁存段选数据
delay(1);
/*第五位显示*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XEF; // 1110 1111 选通第五位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = tabel[num5];//
DU = 0; // 锁存段选数据
delay(1);
/*第六位显示*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XDF; // 1101 1111 选通第六位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = tabel[num6];//
DU = 0; // 锁存段选数据
delay(1);
/*第七位显示*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0XBF; // 1011 1111 选通第七位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = tabel[num7];//
DU = 0; // 锁存段选数据
delay(1);
/*第八位显示*/
P0 = 0XFF; // 清除断码
WE = 1; // 打开位选锁存器
P0 = 0X7F; // 0111 1111 选通第八位数码管
WE = 0; // 锁存位选数据
DU = 1; // 打开段选锁存器
P0 = tabel[num8];
DU = 0; // 锁存段选数据
delay(1);
void main()//main函数自身会循环
while(1)
display(1, 2, 3, 4, 5, 6, 7, 8); //数码管显示函数
更多相关内容
0832+STC89C52RC数码管电压表
采用ADC0832、STC89C52RC制作了数码管显示的数字电压表,电路简洁,初学者容易制作成功。
stc89c52单片机数码管动态显示
在单片机开发板上,通过单片机控制数码管动态显示5201314,并闪烁显示
单片机学习
STC89C52驱动数码管
1.硬件设计数码管实验硬件设计中使用到的数码管是共阳极类型的。因为数码管的片选引脚“1/2/3/4”都通过PNP 三极管来提供高电平,为什么要选用PNP 三极管和共阳极数码管的组合?因为共阳极数码管共阳端直接接电源,... 展开全文
c语言c52数码管
STC89C52单片机数码管介绍以及代码示例
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件数码管分为共阳极连接和共阴极连接两种:1,共阴极连接就是说3,8这一头连得是负极,所以在下面的那头给上高电平(即置... 展开全文
STC89C52单片机 数码管静态显示
数码管显示原理 数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。 静态与动态显示 静态显示: LED显示器工作方式有两种:...
STC89C52RC - 12 - 静、动数码管显示
这里的 静态 动态 指的是 数码管 发光的时候 控制它的io口 状态 或者 数码管 发光段的状态 1、硬件介绍 1数码管 分为 共阴或者共阳 数码管里面封装的都是 LED小灯珠 共阳 阳极都连在一起 阳极接正 负极都是分开...
8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 code ...
动态扫描
延时函数液晶时钟_数码管_时钟_STC89C52_
基于stc89c52的数码管时钟按键修改时间晶振频率11.0592
STC89C52与数码管的详细接线图
适合静态显示,共阳数码管或共阴数码管都可以
stc89c52单片机开发板电路原理图
stc89c52单片机开发板电路原理图。主要包括模拟量采集ADC,AD/DA转换。485传输,点阵模块接口,红外发送,温湿度传感器,蜂鸣器,超声波模块,按键,指示灯,最小系统,外扩接口,USB供电以及串口传输,4位七段...
Dan_数码管_STC89C52_
基于stc89c52单片机,在数码管上左右移动显示字符
STC89C52单片机 数码管动态显示_ʚVVcatɞ的博客_单片机数...
WE = 1; // 打开位选锁存器 P0 = 0XFE; // 1111 1110 选通第一位数码管 // P0 = 0X00; // 0000 0000 表示选通所有位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = 0X06; // 0000 ...
【Keil5 C51】AT89C52 数码管的动态显示_Lisiluan的博客_keil...
数码管的动态显示原理第一个数码管显示0,1s后第二个数码管显示1,直到第六个数码管显示5后又重新开始#include <reg52.h>#define uint unsigned int#define uchar unsigned char sbit LE_D = P2^6;sbit LE_W = P2^7;u...
(单片机作业一)STC89C52动态数码管显示520
设计背景 单片机老师要求在520当天,利用手上的单片机,实现一个专属计算机专业的浪漫。 设计基础目的 ... stc89c52做个基础表白 #include<reg51.h> #include<intrins.h> typedef unsign
STC89C52RC单片机学习板PDF原理图+配套试验例程KEIL源码程序(105例)
STC89C52RC单片机学习板PDF原理图+配套试验例程KEIL源码程序(105例): 10 LED循环左移 100.12864液晶基础显示 101.1602动态显示 102.红外解码1602液晶显示 103.红外解码数码管显示 105 NRF24L01开发板一 11 LED循环...
51单片机STC89C52 数码管动态_昵称90天可改的博客
DELAY3 DJNZ R1,DELAY4 CLR RS1 RET TABLEK: ;共阴数码管 DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H TABLEW: ;位选控制 DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH ...
单片机STC89C52实验 DAY 2 数码管_马踏飞燕&lin_li的博客
动态数码管显示 #include<reg51.h>#include<intrins.h>typedefunsignedcharu8;typedefunsignedintu16;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;voiddelay(inti)while(i--);//段选u8 code smgduan[]=0x3f,0x06,0x5b,...
基于stc89c52的44矩阵键盘输入数码管
本系统以STC89C52单片机为核心,使用4×4矩阵键盘作为数据输入方式,完成独立按键的测试,含有电路图及语言程序设计。
小白上路之51单片机(STC89C52)--数码管
目录数码管介绍显示器及其接口(本文主要针对LED显示器来介绍)开发板原理图数码管是如何显示出字符的静态数码管工作原理数码管静态显示原理74HC573芯片的使用源程序--静态数码管动态数码管工作原理数码管动态显示...
8051单片机(STC89C52)八段数码管轮流显示0~7_好梦成真Kevin的博客-CS...
在8个数码管上自右开始, 轮流显示 0 ~ 7. #include<STC89C5xRC.H> voiddelay()//提供时延 inti, j; for(i =0; i <300; i++) for(j =0; j <300; j++) ;
51单片机STC89C52 数码管静态_昵称90天可改的博客
【51单片机】STC89C52数码管静态显示实验,含c代码(5) 1.参考教程:清翔51单片机教程2.基本原理 : 1)数码管位数:几个数码管连在一起,就是几位。 2)数码管共级:共阴极-数码管中间的线是GND。共阳极-数码管中间的线是VCC。用万用...
基于 STC89C52 单片机 DS1302 时钟芯片定时开关的设计
绍一种以STC89C52单片机、DS1302,1602液晶显示为核心,具备调节时间,设置开启时间与关闭时间的定时开关的实现过程。采用C语言编写,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能,并通过Protues...
基于STC89C52单片机跆拳道比赛计时计分系统设计与实现
采用STC89C52单片机进行控制,设计并实现了一套跆拳道比赛计时计分系统。在进行跆拳道比赛时,可以在计分器上同步显示参赛队伍双方实时得分。该计时计分系统的特点是在比赛进行到一半需要交换场地停止计时,以及在每...
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动
我们看一下数码管内部结构的示意图: 数码管分为共阳和共阴两种: 共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。 同理共阳数码管就是阳极接在一起。 看到这里我们就不难猜出,...
STC 89C52 单片机引脚对应的功能以及实例讲解_Gorit的博客_s...
二、数码管的使用 三、矩阵键盘的使用 四、液晶显示补充 先附上一张stc89C52引脚图 光看引脚是不够的,下面我们看看实物图是什么样子的 一、P1^0~7 对应八个二极管 二级管的实物图如下 从上往下 分别对应引脚中的 P1^0 ~ P1^7...
单片机课设stc89c52.zip
由stc89c52控制的四位倒计时秒表,里边有c语言代码和仿真, 实现的功能如下: 1.通过按键设定倒计时时间; 2.逐秒倒计时; 3.使用4位一体数码管显示时间; 4.时间到数码管闪烁显示0000
基于单片机STC89C52的LED数码管温度显示及报警器的实现
基于单片机STC89C52的LED数码管温度显示及报警器的实现,资源不错,希望对您有用。 参考技术A 按下K1按键并松开时,LED向左移动一位,按下K2按键时LED向右移动一位。 java servlet 51单片机STC89C52控制LED流水灯左移动。 参考技术B 数码管移位循环显示原理
其实数码管的移位循环显示还是通过一位一位的显示,循环显示的主要特点就是所有数码管的段选线并联到一起,由位控制线控制哪一位数码管有效。循环显示其实说的就是单片机轮流向各位数码管送出相应的字形码与相应的位选吗。利用发光管得余辉和视觉暂留作用,使人们感觉所有数码管都是在同时显示。循环显示的亮度效果会比静态数码管显示的亮度暗一些,所以在选择限流电阻的过程中阻值应小于静态数码管的阻值。 参考技术C 数码管移位循环显示原理
其实数码管的移位循环显示还是通过一位一位的显示,循环显示的主要特点就是所有数码管的段选线并联到一起,由位控制线控制哪一位数码管有效。循环显示其实说的就是单片机轮流向各位数码管送出相应的字形码与相应的位选吗。利用发光管得余辉和视觉暂留作用,使人们感觉所有数码管都是在同时显示。循环显示的亮度效果会比静态数码管显示的亮度暗一些,所以在选择限流电阻的过程中阻值应小于静态数码管的阻值。 参考技术D 数码管移位循环显示原理
其实数码管的移位循环显示还是通过一位一位的显示,循环显示的主要特点就是所有数码管的段选线并联到一起,由位控制线控制哪一位数码管有效。循环显示其实说的就是单片机轮流向各位数码管送出相应的字形码与相应的位选吗。利用发光管得余辉和视觉暂留作用,使人们感觉所有数码管都是在同时显示。循环显示的亮度效果会比静态数码管显示的亮度暗一些,所以在选择限流电阻的过程中阻值应小于静态数码管的阻值。
Hdu 1043 Eight (八数码问题)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1043
题目描述:
3*3的格子,填有1到8,8个数字,还有一个x,x可以上下左右移动,问最终能否移动到12345678x的状态?
hint:每一个3*3的格子从上到右,从左到右,一行一行读。
解题思路:
比较简单的八数码问题,大一暑假老师讲过,一直手懒脑懒并没有亲自尝试过。因为是多实例,先从12345678x的状态bfs出来所有可以到达的状态,并且记录下来路径。八数码最重要的就是保存状态,如果这个题目用十进制保存状态的话,至少要到达10^9的数量级。可以利用康拓展开hash搜索到的状态,空间可以缩小到9!(? •?_•?)?
1 #include <stdio.h> 2 #include <string.h> 3 #include <string> 4 #include <queue> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 #define maxn 370000 10 struct node 11 { 12 string path;//路径 13 int s[10]; //state 14 int loc; //9的位置 15 int ct; //康拓hash 16 }; 17 int fac[10] = {1, 1, 2, 6, 24, 120, 720, 720*7, 720*7*8, 720*7*8*9}; 18 //0!,1!,2!....9! 19 int dir[4][2] = {0,1, 0,-1, -1,0, 1,0}; // r, l, u, d 20 int vis[maxn]; 21 char di[5] = "lrdu"; //l, r, d, u 22 string path[maxn]; 23 void init () 24 { 25 memset (vis, 0, sizeof(vis)); 26 } 27 28 int cantor (int a[]) //康拓hash 29 { 30 int sum = 0; 31 for (int i=0; i<9; i++) 32 { 33 int m = 0; 34 for (int j=i+1; j<9; j++) 35 if (a[j] < a[i]) 36 m ++; 37 sum += m * (fac[9-i-1]); 38 } 39 return sum + 1; 40 } 41 42 void bfs () 43 { 44 node cur, next; 45 queue <node> Q; 46 47 for(int i=0; i<8; i++) 48 cur.s[i] = i + 1; 49 cur.s[8] = 0; 50 cur.ct = cantor (cur.s); 51 cur.loc = 8; 52 53 Q.push (cur); 54 vis[cur.ct] = 1; 55 path[cur.ct] = ""; 56 57 while (!Q.empty()) 58 { 59 cur = Q.front(); 60 Q.pop (); 61 62 for (int i=0; i<4; i++) 63 { 64 int x = cur.loc / 3 + dir[i][0]; 65 int y = cur.loc % 3 + dir[i][1]; 66 if (x<0 || x>2 || y<0 || y>2) 67 continue; 68 next = cur; 69 next.loc = x * 3 + y; 70 next.s[cur.loc] = next.s[next.loc]; 71 next.s[next.loc] = 0; 72 next.ct = cantor (next.s); 73 if (!vis[next.ct]) 74 { 75 vis[next.ct] = 1; 76 path[next.ct] = di[i] + path[cur.ct]; 77 Q.push (next); 78 } 79 } 80 } 81 82 } 83 84 int main () 85 { 86 init (); 87 bfs (); 88 char s[2]; 89 int a[10]; 90 91 while (scanf ("%s", s) != EOF) 92 { 93 if (s[0] == ‘x‘) 94 a[0] = 0; 95 else 96 a[0] = s[0] - ‘0‘; 97 98 for (int i=1; i<9; i++) 99 { 100 scanf ("%s", s); 101 if (s[0] == ‘x‘) 102 a[i] = 0; 103 else 104 a[i] = s[0] - ‘0‘; 105 } 106 int m = cantor (a); 107 if (vis[m]) 108 cout<<path[m]<<endl; 109 else 110 puts ("unsolvable"); 111 } 112 return 0; 113 }
以上是关于stc89c52数码管怎么左右移动的主要内容,如果未能解决你的问题,请参考以下文章
51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动