8位数码管动态显示仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /* 设计题目: 基于51单片机的数码管动态扫描显示
- /* 功能 :让8个数码管显示不同的数字
- /* 说明 :每一个数码管扫描时间不要超过5ms
- /************************************************/
- #include <reg51.h> // 12M 晶振
- #define SEG P0 // 定义段码端口
- #define SCAN P2 // 定义位扫描端口
- #define uchar unsigned char
- #define uint unsigned int
- ///////////////////////////////////////////////////////////
- // Name : 段码和位选数据
- // In :
- // Out :
- // Function : 用于段码和位选输出
- // Explain : 段码为共阳型,位选时,高电平关闭,低电平选通
- ///////////////////////////////////////////////////////////
- uchar seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x98};
- uchar sel[8] = {0xfe,0xfd,0xfb,0xf7, // 从右向左选择数码管,共8个
- 0xef,0xdf,0xbf,0x7f}; // 0xfe,表示选择最右一个数码管
-
- ///////////////////////////////////////////////////////////
- // Name : 延时函数
- // In : uint x
- // Out :
- // Function : 用于延时一定时间
- // Explain : 用12M晶振时,大概延时1ms,
- ///////////////////////////////////////////////////////////
- void delay_1ms(uint x) // 用12M晶振时,延时1ms,
- {
- uint i,j;
- for(i=0; i<x; i++)
- for(j=0; j<120; j++);
- }
- ///////////////////////////////////////////////////////////
- // Name : 主函数
- // In :
- // Out :
- // Function : 实现数码管的动态扫描显示
- // Explain :
- ///////////////////////////////////////////////////////////
- void main(void)
- {
- uchar cnt=0;
- while(1) // 无限循环
- {
-
- SCAN = ~0xff; // 送数据时,先关闭显示,以避免重影现象
- SEG = seg[cnt]; // 送数据
- SCAN = ~sel[cnt]; // 送出数据后,选择对应的数码管
- delay_1ms(1); // 延时1ms(延时时间不能太长,最好不要超过5ms)
- cnt++; // 指向下一个状态
- if(cnt == 8) // 判断是否取完所有状态
- cnt = 0;
- }
- }
复制代码
所有资料51hei提供下载:
prj3_SEG7.rar
(42.84 KB, 下载次数: 67)
|