用51单片机连接max7219芯片做秒计时器,求帮看下程序

用51单片机连接max7219芯片做秒计时器,求帮看下程序,第1张

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

sbit pinDIN = P3^0//DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。

sbit pinLOAD = P3^1//LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。

sbit pinCLK = P3^2//在时钟的上升沿, 数据移入内部移位寄存器。 下降沿时, 数据从DOUT端输出。

uchar code LEDcode[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x00 }

/*

void delay1000( void )

{

unsigned char a, b, c for ( c = 1 c > 0 c-- )

for ( b = 142 b > 0 b-- )

for ( a = 2 a > 0 a-- )

}

*/

//【增加】 延时1秒 函数

void delay1s(void)   //@12MHz

{

    unsigned char a,b,c

    for(c=46c>0c--)

        for(b=152b>0b--)

            for(a=70a>0a--)

    _nop_()  //if Keil,require use intrins.h

}

void sendbyte( uchar dat )

{

uchar i, temp 

_nop_() 

for ( i = 0 i < 8 i++ )

{

temp = dat & 0x80

dat = dat << 1 

if ( temp )

pinDIN = 1

else 

pinDIN = 0

pinCLK = 0

_nop_()

pinCLK = 1

}

}

void sendword( uchar addr, uchar dat )

{

pinLOAD = 0

_nop_()

sendbyte( addr )

_nop_()

sendbyte( dat )

_nop_()

pinLOAD = 1 

delay1000()

}

void init7219( void )

{

sendword( 0x0c, 0x01 )

sendword( 0x0a, 0x09 )

sendword( 0x0b, 0x03 )

sendword( 0x09, 0x00 )

sendword( 0x0f, 0x00 )

}

void clear7219( void )

{

uchar i for ( i = 8 i > 0 i-- )

{

sendword( i, 0x00 )

}

}

void main( void )

{

int n = 60 

int s = 0 

int g = 0 

init7219() 

while ( 1 )

{

//clear7219() //【屏蔽】不然不显示

if ( n > 0 )

{

n = n - 1 

s = n / 10 

g = n % 10 

//LEDcode[s] //【屏蔽】

//LEDcode[g] //【屏蔽】

}

sendword( 0x01, LEDcode[s] )//【增加】显示十位数

sendword( 0x02, LEDcode[g] )//【增加】 显示个位数

delay1s()//【增加】 延时一下,不然变化太快,看不到效果

/* //【屏蔽以下语句】

sendword( 0x01, LEDcode[1] )

sendword( 0x02, LEDcode[2] | 0x80 )

sendword( 0x03, LEDcode[3] )

sendword( 0x04, LEDcode[4] )

sendword( 0x05, LEDcode[5] )

sendword( 0x06, LEDcode[6] )

sendword( 0x07, LEDcode[7] )

sendword( 0x08, LEDcode[8] )

//*/

}

}

已在protues中仿真通过。

我以前项目中用过4个max7219级联,用得比较稳定。你这个现象是因为CLK,LOAD引脚窜入了干扰信号,而7219是边沿触发,容易受到干扰。解决方法:1、可以在靠近7219芯片的地方,给CLK,DIN加101 - 104的滤波电容,效果比较明显。2、在程序中,加入抗干扰的驱动程序,定期重新配置72193、可以选用完全兼容的max7221代替

亲,嗮出来的程序不够全哦,不过既然用MAX7219,那么对它的通信部分则都是一样的

MAX7219 除了电源两根线之外,还需要三根信号线连接至单片机

1、使能,即用来控制MAX7219是否允许写入数据的

2、时钟、每更换一位字节数据则需要输出一个脉冲,作为时钟信号

3、数据、在脉冲有效状态下传送数据,此数据是二进制位传递,非0即1

只要对MAX7219的数据传输摆弄明白,那么久可以随意控制MAX7219驱动的电子元件了,数码管也好,LED点阵也罢,都在掌握之内

MAX7219在进行通信的时候,是需要先送地址再送数据的,就是说要传递一个数据,就要进行两次通信

打个比方,例如想把鞋子收起来,然而鞋柜却很多,那么收起鞋子的步骤只能是 先确定要放在哪里,然后再将鞋子放进去,所以MAX7219的通信原理就是这么简单

话不多说,贴出个经过硬件测试通过的程序出来,供大家参考!

这是一个利用一片MAX7219的八位数码管显示模块,程序中只是为了试验,所以只显示固定数字12-34-56,程序中的星号是各个函数之间区分用的,可以删除

#include <REG52.h>//通用89C52头文件

sbit DN=P3^7sbit CS=P3^6sbit CL=P3^5//MAX7219 端口定义

void MaxINT(void)void Max(char Xi,char Yi)void MaxR(char ch)// Max7219

void XSa(void)

/***************************************************************************/

void main(void)//主函数

{

MaxINT()// MAX7219初始化

while(1)

{

XSa() //数据显示

}

}

/***************************************************************************/

void XSa(void)//显示时钟数据

{

Max(1,6)Max(2,5)Max(3,0x0a)

Max(4,4)Max(5,3)Max(6,0x0a)

Max(7,2)Max(8,1)

}

/***************************************************************************/

void MaxINT(void)// MAX7219初始化

{

Max(0x0b,0x07)// 设置扫描界限

Max(0x09,0xff)// 设置译码模式

Max(0x0a,0x0a)// 设置亮度

Max(0x0c,0x01)// 设置工作模式

}

/***************************************************************************/

void Max(char Xi,char Yi)// Max7219 数据写入 主函数

{CS=0MaxR(Xi)MaxR(Yi)CS=1}

/***************************************************************************/

void MaxR(char ch)// Max7219 数据写入 子函数

{

char m,temp

for (m=0m<8m++)

{

temp=ch&0x80ch=ch<<1

if(temp){DN=1CL=0CL=1}

else{DN=0CL=0CL=1}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11073066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存