工艺宣传网站建设,东莞网站建设化工,制作宣传册的步骤,网站自动答题脚本怎么做数码管是51单片机学习中比较基础的一个模块#xff0c;为简化电路连接#xff0c;提高系统可靠性#xff0c;降低制造成本#xff0c;多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当#xff0c;数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很…数码管是51单片机学习中比较基础的一个模块为简化电路连接提高系统可靠性降低制造成本多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很多初学者会在主函数中使用while(1)循环结合delay函数不断扫描但这样得不断调用display扫描如果单片机还要执行别的程序时就会由于扫描不及时导致各种问题。此外在控制段选位选的先后顺序上如果程序不当则会造成显示重影等问题。在此给出一个稳定可靠的程序方案。 电路连接P1口通过两个74HC573分别连接到八位数码管的段选和片选段选、位选由P3.4和P3.5控制低电平锁存 #include reg52.h#define DIGI_PORT P1 // 宏定义数码管端口如果端口改变只需修改这一句即可#define DIGI_NUM 8 // 宏定义数码管个数sbit DULA P3^4;sbit WELA P3^5;unsigned char digiBuf[DIGI_NUM]; //数码管缓冲区unsigned char code DigiTable[] {0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x00,/* */};/* 初始化定时器0方式111.0592MHz晶振时每5ms进一次中断如果只有4位数码管10ms即可间隔长度根据实际情况调整在保证不闪烁的情况下尽可能加长间距以减小对CPU资源的消耗*/void initDigi(){TMOD 0x01;TH0 0xEE;TL0 0x00;EA 1;ET0 1;TR0 1;}void main(){digiBuf[0] 10; // 为10则该位不显示digiBuf[1] 1;digiBuf[2] 2;digiBuf[3] 3;digiBuf[4] 4;digiBuf[5] 5;digiBuf[6] 6;digiBuf[7] 7;initDigi();while(1);}// 定时器0函数每隔一段时间运行一次void displayTimer0() interrupt 1{static unsigned char digiPos 0; // 当前需要显示的数码管此处使用静态局部变量或者全局变量不可使用默认局部变量TH0 0xEE;TL0 0x00;// 位选关闭所有数码管否则可能出现重影下面段选改变之后位选改变之前上一次已经位选打开的数码会显示错误的信息DIGI_PORT 0xFF; //这一句如果和下一句位置交换可能产生重影具体见http://blog.csdn.net/jzj1993/article/details/8563337WELA 1;WELA 0;// 这里进行段选此时所有数码管都已关闭不会显示错误信息DIGI_PORT DigiTable[digiBuf[digiPos]];DULA 1;DULA 0;// 这里根据digiPos进行位选switch(digiPos) {case 0: DIGI_PORT ~(1 0); break; // 打开第0个数码管case 1: DIGI_PORT ~(1 1); break; // 打开第1个数码管case 2: DIGI_PORT ~(1 2); break; // 打开第2个数码管case 3: DIGI_PORT ~(1 3); break; // 打开第3个数码管case 4: DIGI_PORT ~(1 4); break; // 打开第4个数码管case 5: DIGI_PORT ~(1 5); break; // 打开第5个数码管case 6: DIGI_PORT ~(1 6); break; // 打开第6个数码管case 7: DIGI_PORT ~(1 7); break; // 打开第7个数码管}WELA 1;WELA 0;// 改变digiPos值为下一次进入此函数做准备digiPos;if(digiPos DIGI_NUM)digiPos 0;}Proteus仿真通过 源码及Proteus仿真文件点此链接下载