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

📄 maichong.c

📁 模拟脉冲发生器,带LCD显示,可以做为电能表测试用
💻 C
字号:
    
#include "at89x52.h"
#include "absacc.h"
#include "intrins.h"
#include "stdlib.h"
#include "stdio.h"//
#define UCHAR unsigned char
#define UINT unsigned int
UINT i;
UCHAR SystemError;        /*i2c出错标志*/
UCHAR data buff[16];       /*缓冲数组1,从0-5分别存个位,十位,计数常数两位,计数标志,予留2位*/
UCHAR data *buff_point, *checksum;        /*数组1指针*/
UCHAR bdata err_flag;                            /*输入错误标志*/
unsigned long id;
const unsigned char LCD_table[10]={0xFA,0x60,0xd6,0xF4,0x6C,0xBC,0xBE,0xE0,0xFE,0xFC};
                           /*LCD显示表,发送数据方式为MSB a,b,c,d,f,g,e,dp LSB*/
extern I2CStart();        /*i2c启动*/
extern I2CSendByte(uchar);/*i2c发送一个字节*/
extern WaitAck();         /*i2c等应答信号*/ 
extern I2CReceiveByte();  /*i2c接收一个字节*/
extern SendAck();         /*i2c发送应答信号*/
extern SendNotAck();      /*i2c不发应答信号*/
extern I2CStop();         /*i2c停止*/
extern I2CInit();         /*i2c初始化*/
sbit clr_watchdog=P1^4;   /*看门狗清除*/
sbit work_p=P1^5;
void init();              /*初始化函数*/
unsigned char LCD_send(unsigned int dis_flag); /*LCD显示发送数据函数*/
//void pulse_count(void);       /*脉冲计数函数*/
void delay_10ms();            /*延时10 ms函数*/ 
void init_serialcomm(void);   /*通信中断等初始化函数*/
void int_lcd(void);           /*LCD显示初始化函数*/




/*=================================================================
   主函数
  =================================================================*/ 
main(void)
{ 
     
  init();                    /*调用初始化函数*/
  init_serialcomm(); 
  for(;;)
  {
  LCD_send(1); 
  clr_watchdog=~clr_watchdog;
  }
} 
/*=================================================================
  初始化函数
  =================================================================*/
void init()
{
  work_p=1;
  i=0;
  P1=0xFF;            /*各寄存器初始化*/
  //EA=0;
  clr_watchdog=~clr_watchdog;              /*清看门狗*/
  I2CInit();                   /*i2c初始化*/  
  
}



/*========================================================================
  红外通信初始化
  ========================================================================*/
void init_serialcomm(void)
{
    TMOD=0x01;
    TH0=0xFC;
    TL0=0x6C;  
	EA=1;
	ET0=1;
	TR0=1;
    //ET0=1;

}


/*================================================================
  延时10ms函数
  ================================================================*/  
void delay_10ms()
{
  UINT i;  
  for(i=0;i<5000;i++)
  {}
}

/*================================================================
  定时器中断函数,中断时间50ms
  ================================================================ */    
void time0_int()interrupt 1 using 2
{         
  //UINT i;
  
  i++;  
  if(i==90)
  {
   id++;
   work_p=0;  
  }
  
  if(i==1-90)
  {
  work_p=1; 
  i=0;
  } 
   TMOD=0x01;
   TH0=0xFC;
   TL0=0x6C;  
}
/*================================================================
  定时器中断函数,中断时间50ms
  ================================================================ */    



/* ========================================================================
              LCD显示函数 
   ========================================================================*/
unsigned char LCD_send(unsigned int dis_flag)
{ 
  unsigned char lcd[7];
 
  switch (dis_flag)
   {
   
   
   case 1:
         lcd[5]=(id/100000)%10;
	     lcd[4]=(id/10000)%10;
	     lcd[3]=(id/1000)%10;
	     lcd[2]=(id/100)%10;
	     lcd[1]=(id/10)%10;
	     lcd[0]=id%10; break;
		 break;
   
		 default:         
         break;
   }  
         
        I2CStart();
		I2CSendByte(0x7C);    //写3566地址
        WaitAck();	
        I2CSendByte(0xE0);    //写3566的器件选择字
        WaitAck();
		I2CSendByte(0xC8);    //写3566的方式设定字
        WaitAck();
		I2CSendByte(0x80);    //写3566的数据指针字
        WaitAck();
        I2CSendByte(0x70);   //写3566的闪烁控制字
        WaitAck();
        if(dis_flag==2)
		 {	      
		   I2CSendByte(LCD_table[lcd[0]]+1);
           WaitAck();
	      }
		 else
		 {
	       I2CSendByte(LCD_table[lcd[0]]);
           WaitAck();
	     }		
        I2CSendByte(LCD_table[lcd[1]]);
        WaitAck();
		I2CSendByte(LCD_table[lcd[2]]);
        WaitAck();
		I2CSendByte(LCD_table[lcd[3]]);
        WaitAck();
		I2CSendByte(LCD_table[lcd[4]]);
        WaitAck();
		I2CSendByte(LCD_table[lcd[5]]);
        WaitAck();			
		I2CStop();
        delay_10ms(); 
      return 0;
}

⌨️ 快捷键说明

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