⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8-spi595数码管.c

📁 AVR例子程序和protues仿真
💻 C
字号:
 /***************************************************/
  #include <avr/io.h>
  #include <avr/interrupt.h>
  #include <avr/signal.h>
  #include <avr/delay.h>
  #define  uchar  unsigned char 
  #define  uint unsigned int
  //宏定义
  #define EnDS1302 PORTB|= (1<<2)	// 置CE为高电平,使能SPI接口
  #define DiDS1302 PORTB&=~(1<<2)	// 置CE为低电平,关闭SPI接口
 /***************************************************/
  void port_init();
  void delayms(uint k);
  void spi_init();
  uchar spi_send(uchar BYTE);
  void uart();
  void sendstr(uchar *s);
  unsigned char disp[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};		   
 /**************************************************/

  int main()
  {
   uchar i;
   port_init();
   uart();
   sendstr("AVR-SPI595 SEG");						
   spi_init();		//设定SPI接口
   delayms(3000);
  
   while(1)
   {
    for(i=0;i<10;i++)
	{
	 spi_send(disp[i]);
     delayms(2800);
	}
	delayms(5000);
	for(i=9;i>0;i--)
	{
	 spi_send(disp[i]);
     delayms(2800);
	}
   }
  }
 /***************************************************/
  void port_init()
  {
  DDRC=0xFF;
  PORTC=0x7e;
  DDRD=0XFF;
  PORTD=0xFf;
  DDRD=(1<<1);					//串口的输出

  }
 /*****************************************************/
  void spi_init()  //主机模式,高位先传输
  {
  
   PORTB|=~((1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5));	 //SS拉高,使AVR处于主机模式,同时用来控制DS1302的RST脚
    									//DS1302带内部下拉电阻
   DDRB|=(1<<PB0)|(1<<PB2)|(1<<PB3)|(1<<PB5);	/* 设置SS输出,不影响SPI功能,可以用来控制从机控制脚,MOSI 和SCK 为输出,其他为输入 */
  
   SPCR = (1<<SPE) | (1<<MSTR)   //CPOL CPHA 00,SPI模式0,上升沿采样,下降沿设置完成。DORD=0,从MSB开始传输(高位),ds1302是从低位开始传送的
		  |(0<<DORD)|(1<<SPR0);	/* 使能SPI主机模式,设置时钟速率为fck/16   0X51*/
   
  }


/**************发送时间到串口***************************************/
/******************************************************/
  uchar spi_send(uchar BYTE)
  {
    PORTB|=1<<PB2;
	SPDR = BYTE;   //装入数据寄存器  	/* 启动数据传输 */
	while (!(SPSR&(1<<SPIF)));	 /* 查询SPI中断位,等待传输结束 */
    return SPDR; //紧接着访问SPDR寄存器,会自动清0 中断标志位SPIF
  }

  /******************************************/
  void uart()   //特别注意写UCSRC时,要把最高位置1,否则写不进去
  {
    UCSRB  = 0x00;     //先不使能发送接收
    UCSRA  = 0x00;     //Bit1为1则倍速发送,这里不倍速
    UCSRC  = 0x86;   //8位数据格式,异步方式,URSEL=1时,写UCSRC寄存器
    UBRRL  = 25;     //波特率:9600 Bps 8MHZ时钟 51 1MHZ  6  2MHZ 12 4MHZ 25
    UBRRH  = 0x00;     //误差率:0.156%
    UCSRB  = 0x98;  //使能发送接收,使能接收中断
  }

    //-----------------------------------------------------------
	//串口接收字节子程序
	//-----------------------------------------------------------
	unsigned char Getchar(void)
	{
	   while(!(UCSRA& (1<<RXC)));
	   return UDR;
	}
  /******************************************/
  void sendstr(uchar *s)
  {
   while (*s)
   {
      while (!(UCSRA&(1<<UDRE)));
      UDR=*s;
      s++;
   }
   while (!(UCSRA&(1<<UDRE)));
      UDR=0x0a;   //回车换行
   while (!(UCSRA&(1<<UDRE)));
      UDR=0x0d;
  }
 /******************************************************/
 void delayms(uint k)
 {
  uint i,j;
   for(i=0;i<k;i++)
  {
    for(j=0;j<100;j++)
     {;}
   }
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -