求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 
单片机教程
第一章 单片机入门
1.单片机简介
2.开发板选择
3.前期准备
第二章 LED及入门
1.初识原理图
2.程序点灯
3.实际LED硬件连接
4.点亮LED
5.闪烁的LED
6.软件调试查看运行时间
7.延时1秒
8.函数封装
9.函数传参调用
10.流水灯
11.数组与移位
第三章 蜂鸣器
1.蜂鸣器原理
2.无源蜂鸣器鸣叫
3.无源蜂鸣器题目
4.无源蜂鸣器+LED
第四章 数码管
1.数码管原理
2.数组&数码管
3.数码管&LED
4.多个数码管显示
5.同时显示不同的数字
6.高位不显示0
7.数码管小数点
8.分钟秒表
第五章 独立按键
1.按键入门
2.按键&蜂鸣器&数码管
3.按键猜想
4.按键用法
5.按键模式
6.不支持连按
7.静态变量
8.支持连按与全局变量
9.再次优化不支持连按的代码
10.流水灯的优化解说
11. 代码对比
12.双模式函数封装
13.第一阶段综合例程(上)
14.第一阶段综合例程(下)
15.第一阶段的总结
第六章 多文件编程
1.多文件编写
2.模块初始化
3.数码管显示函数
4.多文件编程首次测试
5.带返回值的函数
6.新按键程序
7.最终按键程序
8.最终的function文件
第七章 外部中断
1.寄存器
2.中断函数
3.进一步理解中断函数
4.中断的实验现象
5.外部中断测脉冲个数
第八章 定时器
1.定时器概念
2.定时器工作模式
3.定时时长的做法
4.定时器简单运用
5.定时器工作模式2
6.定时器中断函数的使用
7.定时器初始化新写法
8.隐形漏洞
9.代码参考
10.微调定时精确时间
11.单独文件封装
12.输入捕获
13.数据类型强制转换
14.定时器&数码管扫描显示
15.呼吸灯
第九章 舵机与超声波模块
1.舵机入门
2.舵机与按键
3.超声波模块
第十章 串口通信
1.串口通信入门
2.简洁式串口通信
3.详细理解ASCII码
4.串口printf系列函数
第十一章 1602液晶屏
1.液晶屏代码讲解
2.指向数组的指针
3.液晶屏代码单独文件
4.各功能代码的运用
第十二章 IIC通信
1.IIC入门代码讲解
2.EEPROM简单使用
3.IIC&EEPROM合成文件
第十三章 红外遥控与温度传感器
1.红外遥控
2.代码文件和测试
3.温度传感器代码解析Ⅰ
4.温度传感器代码解析Ⅱ
5.温度传感器代码独立文件
第十四章 AD与DA
1.AD与DA合成文件
第十五章 混合例程
1.电位器控制舵机
2.遥控器控制舵机
3.温度传感器与串口
4.模拟倒车雷达报警
5.再次熟悉串口
6.串口&液晶屏Ⅰ
7.串口&液晶屏Ⅱ
8.串口&液晶屏Ⅲ
9.串口&EEPROM
10.实践操作
11.结束语
 

 
目录
多个数码管显示
来源:C语言网    作者:继承叔    编辑:Alice(火龙果软件)
515 次浏览
5次  

1.余晖效应

流水灯如果在流速太快的基础上再加速,那么我们看到的则是一排灯都在亮着,这就叫人眼的余晖效应。同理,我们想让多个数码管同时亮,那么就要让三八译码器的IO0~IO5每个输出引脚轮流快速切换出低电平,需要显示什么数字再由P0的8个IO端口控制。

这里提供了一段代码供大家调试玩玩,用实验现象领悟余晖效应。

#include <reg52.h> 
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
 
void main()
{  
    unsigned char i=1;
    unsigned int x;
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    P0=0xC0;  //让6个数码管都显示0
    while(1)
    {  
        switch(i)
        {
            case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;break;//让IO0输出低电平
            case 2: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;break;//让IO1输出低电平
            case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;break;//让IO2输出低电平
            case 4: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;break;//让IO3输出低电平
            case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;break;//让IO4输出低电平
            case 6: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i=0;break;//让IO5输出低电平
        }
        i++;
        for(x=0;x<5000;x++);//这里是延时,大家把5000不断地改小到200,中间不断地下载进开发板来领悟余晖效应,
                            //其实我们做的只是让三八译码器的不同IO输出持续时间不同而已,然后就产生了不一样的实验效果
    }              
}

2.题目

如果我们既要6个数码管同时亮,还要使6个数码管都同时间隔一秒地显示0~F的状态不停循环,模拟图像如下

EEEEEE //持续一秒

FFFFFF //持续一秒

000000 //持续一秒

……

请思考如何下手?

提示:软件调试仿真出1秒内所要执行的内容。

还有大家别傻乎乎加个“delay_ms(1000);”用来实现间隔1秒的数字自加,这样做我们怎么去实现IO0~IO5的快速切换出低电平呀。

请大家先自己思考尝试动手练练写写,实在没头绪再参考一下这些代码,其实这跟无源蜂鸣器的间隔鸣叫的编程技巧是一样的

#include <reg52.h> 
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
 
unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化
 
void main()
{  
    unsigned int i,x;
    unsigned char sec;//定义一个一秒之后自增1的变量
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    P0=0xC0;  //先让所有数码管显示0
    while(1)
    {    
        for(x=0;x<28492;x++)//软件调试得出这个循环耗时1秒
        
            switch(i)
            {
                case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;break;//让IO0输出低电平
                case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;break;//让IO1输出低电平
                case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;break;//让IO2输出低电平
                case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;break;//让IO3输出低电平
                case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;break;//让IO4输出低电平
                case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i=0;break;//让IO5输出低电平
            }   
        
        sec++;//一秒之后变量自加1
        if(sec>=16)sec=0;
        P0=LedChar[sec];//取数组元素中标号为0~15的元素  
    }
}

我们把i放到了前面的case语句中自加,这样阅读起来更加快速明白switch语句是每条都要按顺序轮流去执行的意思(参考了宋老师的代码)。还有大家别把i定义成unsigned char型,不然无论怎么修改x的值都调试不出for循环持续1秒。

学到这里需要大家进一步学会自己分析整体代码的系统结构了。

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



515 次浏览
5次