51单片机数码管显示数字及小数点

51单片机数码管显示(共阴极)


1.先看一下显示的结果:

在这里插入图片描述
源代码:

#include <reg51.h>

typedef unsigned int u16;
typedef unsigned char u8;

u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{	
	while(i--);
}
/*显示函数*/
void display()
{
    u16 x = 0;
    while(1)
    {
        switch(x)
        {
            case 0:P2 = 0x0e;P0 = smg[num / 1000];break;              //显示2
            case 1:P2 = 0x0d;P0 = smg[(num % 1000) / 100];break;      //显示0
            case 2:P2 = 0x0b;P0 = smg[(num % 1000) % 100 / 10];break; //显示2
            case 3:P2 = 0x07;P0 = smg[num % 10]; break;               //显示1
        }
        delay(100);//延时,增大延时我们可以看到数码管是交替点亮的
        P0=0x00;//消隐(消隐一定要在延时函数后)
        x = ++x % 4;//取模,当x=4时,通过与4取模就让x的值重新变回0
    }
}
/*主函数*/
void main()
{
		display();
}

2.如何在数码管显示小数点呢?

        对与共阴极数码管来说,直接将要显示的数字与0x80相或
        例如:
                 要想在数码管上显示数字2,对于本电路图来说,直接让P0=0x5b即可; 0x5b=01011011,
                 但怎么显示'2.'呢? 对于共阴极数码管来说,只需要让P0=0x5b | 0x80, 即P0=11011011,即点亮dp位

显示结果:在这里插入图片描述
源代码:

 #include <reg51.h>

typedef unsigned int u16;
typedef unsigned char u8;

u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{	
	while(i--);
}
/*显示函数*/
void display()
{
    u16 x = 0;
    while(1)
    {
        switch(x)
        {
            case 0:P2 = 0x0e;P0 = smg[num / 1000]|0x80;break;         //显示2.  只修改了此语句
            case 1:P2 = 0x0d;P0 = smg[(num % 1000) / 100];break;      //显示0
            case 2:P2 = 0x0b;P0 = smg[(num % 1000) % 100 / 10];break; //显示2
            case 3:P2 = 0x07;P0 = smg[num % 10]; break;               //显示1
        }
        delay(100);//延时,增大延时我们可以看到数码管是交替点亮的
        P0=0x00;//消隐(消隐一定要在延时函数后)
        x = ++x % 4;//取模,当x=4时,通过与4取模就让x的值重新变回0
    }
}
/*主函数*/
void main()
{
		display();
}
                     

一个问题:

之前我是在proteus上进行仿真的,没有进行消隐运行结果也是正确的,但是放到开发板上就有些看不清出,添加消隐处理就正常了.由此我们要知道用proteus仿真的结果正确,但在开发板上运行就不一定正确,大家学习硬件最好还是用实物!!!.
未消隐处理:

请添加图片描述

消隐处理:

请添加图片描述


以上就是51单片机数码管显示数字及小数点了,但仅仅以共阴极数码管为例,大家还可以思考一下如何用共阳极数码管实现

proteus中数码管: 7-SEG-MPX4 (CC是共阴极,CA是共阳极)

下面是一个简单的51单片机实现超声波测距并数码管显示代码,精确到小数点后两位: ``` #include <reg51.h> #define TRIG P1_0 #define ECHO P1_1 #define DIGIT P2 #define SEG P0 unsigned int distance = 0; void delay_us(unsigned int us) { while(us--) { _nop_(); } } void delay_ms(unsigned int ms) { while(ms--) { delay_us(1000); } } void init() { TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0; // 定时器0初始值 TL0 = 0; } void start_measure() { TRIG = 1; // 发射超声波 delay_us(10); TRIG = 0; while(!ECHO); // 等待超声波回波 TR0 = 1; // 启动定时器0 while(ECHO); // 等待超声波回波结束 TR0 = 0; // 停止定时器0 distance = (TH0 << 8) | TL0; // 计算距离 distance /= 58; } void display_distance(unsigned int distance) { unsigned char digit[4] = {0, 0, 0, 0}; digit[0] = distance / 1000; digit[1] = distance / 100 % 10; digit[2] = distance / 10 % 10; digit[3] = distance % 10; DIGIT = 0x00; // 所有数码管关闭 SEG = 0xff; // 所有数码管段关闭 SEG = 0x7f; // 小数点段打开 DIGIT = 0x01; // 第一个数码管打开 SEG = ~(0x3f & digit[0]); // 显示第一个数码管的数字 delay_ms(1); DIGIT = 0x02; // 第二个数码管打开 SEG = ~(0x3f & digit[1]); // 显示第二个数码管的数字 delay_ms(1); DIGIT = 0x04; // 第三个数码管打开 SEG = ~(0x3f & digit[2]); // 显示第三个数码管的数字 delay_ms(1); DIGIT = 0x08; // 第四个数码管打开 SEG = ~(0x3f & digit[3]); // 显示第四个数码管的数字 delay_ms(1); } void main() { init(); while(1) { start_measure(); display_distance(distance * 100); // 将距离值乘以100后取整显示 } } ``` 注:以上代码仅为参考,需要根据具体硬件和需求进行调整和修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值