1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STC89C52单片机 数码管动态显示

STC89C52单片机 数码管动态显示

时间:2020-07-29 03:54:02

相关推荐

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 charsbit 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 charsbit DU = P2^6;//数码管段选sbit WE = P2^7;//数码管段选//共阴数码管段选表0-9uchar 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 = 2shi = i % 100 / 10;//236 % 100 / 10 = 3ge = i % 10;//236 % 10 =6//第一位数码管 P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = 0XFE; //1111 1110WE = 0;//锁存位选数据DU = 1;//打开段选锁存器P0 = tabel[bai];//DU = 0;//锁存段选数据delay(5);//第二位数码管P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = 0XFD; //1111 1101WE = 0;//锁存位选数据DU = 1;//打开段选锁存器P0 = tabel[shi];//DU = 0;//锁存段选数据delay(5);//第三位数码管P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = 0XFB; //1111 1011WE = 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 charsbit DU = P2^6;//数码管段选sbit WE = P2^7;//数码管段选//共阴数码管段选表0-9uchar 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 1110WE = 0;//锁存位选数据DU = 1;//打开段选锁存器P0 = tabel[num1];//DU = 0;//锁存段选数据delay(1);/*第二位显示*/P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = 0XFD; //1111 1101WE = 0;//锁存位选数据DU = 1;//打开段选锁存器P0 = tabel[num2];//DU = 0;//锁存段选数据delay(1);/*第三位显示*/P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = 0XFB; //1111 1011WE = 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); //数码管显示函数}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。