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

📄 kg.c

📁 本程序是基于51开发的源代码!可以控制开关量!非常简洁。
💻 C
字号:
#include "stdio.h"
#include "reg52.h"
#include <intrins.h>
#include "absacc.h"      
//-----------------------------------------------------------------------------
//全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 11059200 //系统时钟频率12MHz   
#define BAUDRATE 9600 // UART 波特率9600bps
//X25045
#define WREN   0x06                     
#define WRDI   0x04
#define RDSR   0x05
#define WRSR   0x01
#define READ0  0x03
#define READ1  0x0b
#define WRITE0 0x02           
#define WRITE1 0x0a
//DS12887
#define uchar unsigned char
#define uint unsigned int
#define P128870 XBYTE[0xfe00]
#define P128871 XBYTE[0xfe01]
#define P128872 XBYTE[0xfe02]
#define P128873 XBYTE[0xfe03]
#define P128874 XBYTE[0xfe04]
#define P128875 XBYTE[0xfe05]
#define P128876 XBYTE[0xfe06]
#define P128877 XBYTE[0xfe07]
#define P128878 XBYTE[0xfe08]
#define P128879 XBYTE[0xfe09]
#define P12887a XBYTE[0xfe0a]          
#define P12887b XBYTE[0xfe0b]
#define P12887c XBYTE[0xfe0c]
#define P12887d XBYTE[0xfe0d]
#define P12887e XBYTE[0xfe0e]
#define P12887f XBYTE[0xfe0f]

//X25045
#define X25045  XBYTE[0XFdFF]   
//ds8255        
#define P8255A XBYTE[0x1fff]     
#define P8255B XBYTE[0x5fff]                
#define P8255C XBYTE[0x9fff]
#define P8255chol XBYTE[0xdfff]//控制字地址


//---------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void UART0_INIT();  //串中初始化
void LED_Flash();
void cl_dog();
void setup12887(uchar *p);
void read12887(uchar *p);
void start12887();
unsigned char Read1B(unsigned char cAddress,bit bRegion);           //读出上次关机的时间
void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion);
void msdelay(int i);
void init8255(void);
short int read8255(short int PA1);
void write8255(short int T);

//-----------------------------------------------------------------------------
//端口定义x25045
//-----------------------------------------------------------------------------
sbit CS=P2^1; //单片机p2.7为片选  
sbit SO=P1^2; //数据输出 
sbit SI=P1^1; // 数据输入
sbit SK=P1^0; //时钟
//8255
sbit CS8255=P2^5;
sbit A0=P2^6;
sbit A1=P2^7; 
sbit SWITCH=P3^5;


sbit xianshiC=P2^2;                    
#define xianshi XBYTE[0Xfbff]   


/*主函数*/
void main()
{ unsigned int i;
  unsigned short int number_in,number,n;
  uchar   BIT, *p;
  uchar  time[8]={'0','0','0','0','0','0','0','0'};
  p=&time;
  UART0_INIT();  
  init8255();
  SBUF=0X34;  //缓冲寄存器
  cl_dog();
  for(i=0;i<8;i++)
  {
    *p++=Read1B(i,0);//读出上次关机的时间
  }
  p=&time;
  if(time[0]==0)
  {setup12887(p);
 }
  start12887();
 // read12887(5);
   
  IE=0X83;//open interrupt 
 // ch='A';
  //number_in=0xff;
  SWITCH=0;
  //write8255(number_in);
  while(1)
  { 
       BIT=1;
       for(n=0;n<8;n++)
        {    
	    number_in=read8255('A');//
        //LED_Flash();
        xianshi=0x00;
        for(i=0;i<0xffff;i++){;}
        xianshi=0xff;
        for(i=0;i<0xffff;i++){;}
        printf("A: %u  number_in=%u\n",number,number_in);
        number++;
        //write8255(n);
        write8255(BIT);
		BIT<<=1;
        }
       /*for(n=0;n<256;n++)
        {    
	    number_in=read8255('B');//
        //LED_Flash();
        xianshi=0x00;
        for(i=0;i<0xffff;i++){;}
        xianshi=0xff;
        for(i=0;i<0xffff;i++){;}
        printf("B== %u  NUMBER_IN=%u\n",number,number_in);
        number++;
        write8255(n);
        }*/
  }
}

       //	if(ch=='A')
	   //	ch='B';
	   //	else 
	   //	ch='A';
       //write8255(number_in); 
void LED_Flash()
  { int i;
    xianshi=0x00;
    for(i=0;i<0xffff;i++){;}
    xianshi=0xff;
    for(i=0;i<0xffff;i++){;}
  }
           //   void Loop_Test()   ////指示灯亮息
                //    {
                  //    uchar B_out=1,i;
                    //   for(i=0;i<8;i++)
                   //    {
                     //   write8255(B_out);
                      //  LED_Flash();

                      //  B_out=B_out<<1;
                     //   }
                   //  }

void UART0_INIT(void)          //串行口初始化
{
  SCON=0X50;//串口工作方工1,读允许
  TMOD=0X22;//定时器1工作在方式2;定时器0工作在方式2
  PCON=0X00;
  TCON=0X20;
  IP=0X01;
  TI=1;
  IT0=0;
  TR1=1;
  TR0=0;
  TL0=0X00;
  TH0=0X00;
  TL1 = 0xfa; // 按波特率设置定时器1 初值fa为4800 fd为9600
  TH1 = 0xfa; // 按波特率设置定时器1 重装值fa为4800 fd为9600
 }

//-------------------------------------
//x25045
//-------------------------------------
unsigned char Read8()//读8位数据     
{
bit bData;
unsigned char cLoop;
unsigned char cData;
for(cLoop=0;cLoop<8;cLoop++)
{
msdelay(40);
SK=1;
msdelay(40);
SK=0;
msdelay(40);
bData=SO;
cData<<=1;    
if(bData)
{
cData|=0x01;
}
}
return cData;
}

void Write8(unsigned char cData)//写8位数据     
{
unsigned char cLoop;
for(cLoop=0;cLoop<8;cLoop++)
{
if((cData&0x80)==0)
{
SI=0;
}
else
{
SI=1;
}
msdelay(10);
SK=0;
msdelay(10);
SK=1;
msdelay(10);
cData<<=1;
}
}

unsigned char ReadSR()//读状态寄存器 
{
unsigned char cData;
CS=0;
Write8(RDSR);
_nop_();_nop_();_nop_();
cData=Read8();
CS=1;
return cData;
}

unsigned char WriteSR(unsigned char cData)//写状态寄存器      
{
unsigned char cTemp;
cTemp=ReadSR();
//if((cTemp&0x01)==1)
//{
//   printf("write SR  wrong:  \n"); 
//   return 0;////////////////////////以上两句在实际使用时,要加上;
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
Write8(WRSR);
Write8(cData);
CS=1;
 //printf("write SR  right:  \n");
return 1;   //怎么始终返回是1
}

void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion)
/* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */
{
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
if(bRegion==0)
{
Write8(WRITE0);
}
else
{
Write8(WRITE1);
}
Write8(cAddress);
Write8(cData);
SK=0;
CS=1;
}

unsigned char Read1B(unsigned char cAddress,bit bRegion)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
unsigned char cData;
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
if(bRegion==0)
{
Write8(READ0);
}
else
{
Write8(READ1);
}
Write8(cAddress);
cData=Read8();
CS=1;
return cData;
}

void cl_dog(void)//禁止看门狗
{
   unsigned char cdata;
   unsigned char tdata;
   tdata=0;
   cdata=ReadSR();//读当前状态寄存器
   cdata=cdata|0x30;
   do
   {
     tdata=WriteSR(cdata);//写状态寄存器,禁止看门狗 

	 }while(tdata==0);
}

//--------------------------
//ds12887
//---------------------------         

void setup12887(uchar *p) //设置系统时间
{
uchar i;
i=P12887d;
P12887a=0x70;
P12887b=0xa2; 
P128870=*p++; 
P128871=0xff; 
P128872=*p++;
P128873=0xff; 
P128874=*p++; 
P128875=0xff; 
P128876=*p++; 
P128877=*p++;
P128878=*p++;
P128879=*p++; 
P12887b=0x22;
P12887a=0x20;
i=P12887c;
}
void read12887(uchar *p) //读取系统时间
{
uchar a;
do{ a=P12887a; } 
while((a&0x80)==0x80);
*p++=P128870; 
*p++=P128872; 
*p++=P128874; 
*p++=P128876;
*p++=P128877; 
*p++=P128878;
*p++=P128879;
}
void start12887(void) //启动时钟
{
uchar i;
i=P12887d;
P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff;
P12887b=0x22; P12887a=0x20;
i=P12887c;
}
//--------------------------------
//8255
//----------------------------------
void init8255(void)
{  P1|=0x80;         //p1口高位置
   msdelay(600);
   P1&=0x7f;       //p1口高位置
   P8255chol=0x92;
}
 
short int  read8255(short int  chanel)
{   short int  m;
    if(chanel=='A')
       m=P8255A;    
    else
       m=P8255B;
    return m;
} 
void write8255(short int m)
{    int i;
     CS8255=0;
 	 A0=0;
	 A1=1;
     P8255C=m;
	 for(i=0;i<0xffff;i++){;}  
	 CS8255=1;
	 A0=1;
	 A1=1;
}
//-----------------------------------------------------
//延时函数
//-----------------------------------------------------
void msdelay(int i)
{
  int m;
  for(m=0;m<i;m++){;}
}

⌨️ 快捷键说明

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