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

📄 wspilm74.c

📁 C8051F.rar
💻 C
字号:
//参考程序A  :  SPI调试程序  :WSPILM74.c
//SPI调试程序  :WSPILM74.c
#include <C8051F020.h>	
#include <intrins.h>
#define PORTA		0x8000	       /*8255的A口*/
#define	PORTB		0x8001     /*8255的B口*/
#define	PORTC		0x8002     /*8255的C口*/
#define	PORTCON		0x8003     /*8255的控制口*/
typedef unsigned char uchar;
typedef unsigned int uint;
uint h;
uchar xdata  *idata Pointm;	
uchar HMS[6],rr[3],h1,h2,h3,h4,i,j,k0,k1;
uchar WE[6]={1,2,4,8,0x10,0x20};   //位选
uchar ZI[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71,0x40};/*字选:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,-*/
void PORT_Init (void);
void displayled(void);
void delay1ms(uint time){//延迟1ms
	uint ii;
	uint jj;
	for (ii=0;ii<time;ii++){
		for(jj=0;jj<300;jj++);
	}
	}
exch();    //数据转换
void PORT_Init ();
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn)//SPI配置函数
{
	 SPI0CFG = spicfg;	//设定寄存器SPI0CFG=0C7H
	 SPI0CKR = spickr;	//设定寄存器SPI9CKR=27H
     SPI0CN = spicn;	//设定寄存器SPI0CN =03 
     EIE1|= 0x01;
}
void config (void)  //config function
{
    WDTCN = 0xDE;  	//看门狗禁止
    WDTCN = 0xAD;
	XBR0 = 0x02;/*交叉开关配置,SPI总线SCK配置到P0.0口,
	            MOSI为P0.2口, NSS为P0.3,MISO配置到P0.1口*/
	XBR1 = 0x00;	
	XBR2 = 0x40;   /*允许功能选择开关有效*/
    P0MDOUT = 0x0D;/*SCK、MOSI和NSS为推拉式输出,MISO为开漏式.*/
}  
void main()   //主程序
{
    PORT_Init ();
	config();
	spi_cfg(0x0C7,0x27,0x03);//设定寄存器SPI0CFG,SPI0CKR和SPI0CN 
	while(1)
	{
	P0=0xff;
	EA=1;
	i=0;
	P0&=0x7f;
	delay1ms(1);//延时
   SPI0DAT=0x00;
//当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的高8位数据
    delay1ms(2);
	SPI0DAT=0x00;
//当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的低8位数据
    delay1ms(2);
	if(i==2){	//已收到16位数据,就将1-->/CS并转入显示温度值的函数.
	P0|=0x80;
	delay1ms(5);
    EA=0;        //关中断
    exch();      //数据处理函数
    displayled();//显示温度值的函数.
	};
    }
}
exch() //数据格式转换,将二进制转换为十进制.
{  HMS[0]=0;
 h=(256*rr[0]+rr[1])/128;//rr[0]中存放高8位数,rr[1]中存放低8位数
if(h>=128)    //判别符号位
  {
  h=-h;      //若为负号,先求补码 
  HMS[0]=0x10;//"-"号(字形码:  40H)
  };
 
  h1=h/100;
  h2=(h-h1*100)/10;
  h3=(h-h1*100-h2*10);
  HMS[1]=h1;
  HMS[2]=h2;
  HMS[3]=h3;
  HMS[4]=0;
  h1=rr[1]&0x40;//判别0.5度
  if(h1!=0)
  HMS[4]=5;
  HMS[5]=0x0c;   //显示"C"
  }

void spi_ISR() interrupt 6//SPI中断
{  EA=0;
   while(TXBSY);	
    SPIF=0;
	rr[i]=SPI0DAT;//由于是全双工总线,在发送完一个字节时,
	              //主机也收到从机所发的数据
	i++;
EA=1;
}
void PORT_Init (void)
{
   OSCICN=0x05   ;/*选择内部振荡器,内部振荡器按IFCN指定的频率运行,
			                       ;频率为8MHz*/
   OSCXCN = 0x67;	//外部为11.0592MHZ(未采用)	
   P74OUT  = 0x0ff;      /*P7为推拉方式,P4,P5,P6漏极开路*/
   EMI0CF |= 0x2c;		/*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
   EMI0TC |= 0x6d;		/*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
   Pointm=PORTCON;      /*8255初始化*/
   *Pointm=0x80;		
}
void displayled(void) //显示六位温度数据:-020.5C
{unsigned  int  p;
unsigned  char  pp;
for(j=0;j<6;j++)
	    { 
			pp=(HMS[j]);	/*转化成数码管数字显示码*/
			k0=ZI[pp];        /*查表*/
			Pointm=PORTB;  	//动态驱动6数码管
            k1=WE[j];       /*查表*/
			*Pointm=k1; 
			Pointm=PORTC; 
			*Pointm=k0+0x80;	/*加小数点*/
		if(k1!=8)
	    (*Pointm=k0);	/*送显示码*/
	    for(p=0;p<=1000;p++);
		_nop_();
		}
	}

⌨️ 快捷键说明

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