1、 51单片机驱动两片74HC595级联动态驱动8位数码管 功能 : 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选 平台 : STC89C52 11.0592MHz 现象 : 8位数码管从第一位开始从0计数,满10进位 版本说明 : 第0版本没有使用定时器中断,同时定义了一个 unsigned long int 变量计数,再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,而且没有用 unsigned long int 之类的变量,而是用数组 Val[8] 来计数, 主函数只负责显示,其它的在中断函数里面处理,这样
2、显示一点都不闪屏,
备注 : 可以用 ULN2003A 接在数码管的 com 口来提高驱动能力,ULN2003A里面有7个NPN三极管, 可以大大提高驱动能力
#include
3、igned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选 unsigned char Val[8] = {0}; // 要显示的数据 ************************ 函数声明 ************************ void interrupt_init(void); void timer_init(void); 控制74HC595输出数据 void Output(void) { RCK = 0; RCK
4、 1; } 向74HC595中写入一字节数据 void Write_Byte(unsigned char dat) { unsigned char i = 0; for(i=0; i<8; i++) { SCK = 0; SI = dat & 0x80; SCK = 1; dat <<= 1; } } 显示函数 void Display(unsigned char * p) { unsigned char * pt = Wei
5、 Write_Byte(*(pt+0)); Write_Byte(SMG[*(p+7)]); Output(); Write_Byte(*(pt+1)); Write_Byte(SMG[*(p+6)]); Output(); Write_Byte(*(pt+2)); Write_Byte(SMG[*(p+5)]); Output(); Write_Byte(*(pt+3)); Write_Byte(SMG[*(p+4)]); Output();
6、 Write_Byte(*(pt+4)); Write_Byte(SMG[*(p+3)]); Output(); Write_Byte(*(pt+5)); Write_Byte(SMG[*(p+2)]); Output(); Write_Byte(*(pt+6)); Write_Byte(SMG[*(p+1)]); Output(); Write_Byte(*(pt+7)); Write_Byte(SMG[*(p+0)]); Output(); } int ma
7、in(void) { timer_init(); interrupt_init(); while(1) { Display(Val); } return 0; } void interrupt_init(void) { EA = 1; //开总中断 ET0 = 1; //开定时器0中断 ET1 = 1; //开定时器1中断 } void timer_init(void) { TMOD = TMOD | 0x01; //定时器0工作方式1 TMOD = TMOD & 0x
8、FD; TH0 = 0x4B; //装初值,50ms计数 TL0 = 0xFF; TR0 = 1; //开启定时器0 } void timer0() interrupt 1 { static unsigned char counter0 = 0; counter0++; TH0 = 0x4B; //重新装入初值,定时器0从头开始计数,计数50ms TL0 = 0xFF; if(2 == counter0) //2*50 ms = 100ms = 0.1s { counter0 = 0; //counter0置零,定时
9、器0从头开始计数 Val[0]++; if(10==Val[0]) { Val[0] = 0; Val[1]++; if(10==Val[1]) { Val[1] = 0; Val[2]++; if(10==Val[2]) { Val[2] = 0;
10、 Val[3]++; if(10==Val[3]) { Val[3] = 0; Val[4]++; if(10==Val[4]) { Val[4] = 0;
11、 Val[5]++; if(10==Val[5]) { Val[5] = 0; Val[6]++; if(10==Val[6]) {
12、Val[6] = 0; Val[7]++; if(10==Val[7]) { Val[7] = 0; } } } } } } } } } }






