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

📄 new.c

📁 运用PTOTEUS仿真74595对6个LED数码管的驱动显示
💻 C
字号:

#include <reg51.h>     //包括一个52标准内核的头文件
#include<absacc.h>
#include<stdlib.h>
#include <intrins.h>	   /*used for _nop_() function*/

sbit  SDATA_595 =P0^0 ;/*串行数据输入*/  
sbit  SCLK_595  = P0^1;/*移位时钟脉冲*/
sbit  RCK_595   =P0^2 ;  /*输出锁存器控制脉冲*/
sbit YELLOW=P2^0; //黄色
sbit ALARM=P2^1; //报警
sbit RED=P2^2;   //红色
       int TM_hour=12,i;
      int TM_minute=19;
bit b_flash;

//#define TM_second    XBYTE[0xFE00]
//#define TM_minute   XBYTE[0xFE02]
//#define TM_hour   XBYTE[0xFE04]
#define TM_week   XBYTE[0xFE06]
#define TM_day   XBYTE[0xFE07]
#define TM_month   XBYTE[0xFE08]
#define TM_year   XBYTE[0xFE09]
#define REG_A   XBYTE[0xFE0A]
#define REG_B   XBYTE[0xFE0B]
#define REG_C   XBYTE[0xFE0C]
#define REG_D   XBYTE[0xFE0D]
#define RAM_114   XBYTE[0xFE0e]
#define t 3.1416

#define uchar  unsigned char 
#define uint   unsigned int
#define ulong unsigned long
#define	WriteDeviceAddress 0xa0	  //定义器件在IIC总线中的写地址
#define	ReadDviceAddress 0xa1	  //器件在IIC总线中的读地址

sbit	SCL=P1^6;				  //定义IIC器件串行总线
sbit	SDA=P1^7;				  //定义IIC器件串行总线 

unsigned char Temp;
unsigned char Dis_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*0~9的共阴极段码表*/
unsigned char Dis_Date[5];
unsigned char CarID =2134 ;
int countv;
int count,countv;
int counter;
uchar bdata dat;





/*sfr  ISP_DATA  = 0xE2;   /* FLASH EEPROM 数据寄存器       */   
sfr  ISP_ADDRH = 0xE3;   /* FLASH EEPROM 地址高字节寄存器 */   
sfr  ISP_ADDRL = 0xE4;   /* FLASH EEPROM 地址低字节寄存器 */   
sfr  ISP_CMD   = 0xE5;   /* FLASH EEPROM 命令寄存器       */   
sfr  ISP_TRIG  = 0xE6;   /* FLASH EEPROM 触发寄存器       */   
sfr  ISP_CONTR = 0xE7;   /* FLASH EEPROM 控制寄存器       */   
//  sbit Erase_End_flag = SFST^2; /* 芯片擦除结束标志 */    
  
/*unsigned char code ISP_IAP_BYTE_READ    =1; //read    
unsigned char code ISP_IAP_BYTE_PROGRAM =2; //program    
unsigned char code ISP_IAP_SECTOR       =3; //clear sector    
   
unsigned char code WAIT_TIME_40MHz      =0; //fosc 40MHz time    
unsigned char code WAIT_TIME_20MHz      =1; //fosc 420MHz time    
unsigned char code WAIT_TIME_10MHz      =2; //fosc 10MHz time    
unsigned char code WAIT_TIME_05MHz      =3; //fosc 05MHz time    
   
unsigned int  code STC_FLASH_ADDR       =0x2000;//STC89C52  */

void DelayMs(unsigned int number) 	  //延时函数
{
	unsigned char temp;
	for(;number!=0;number--) 
	{
		for(temp=112;temp!=0;temp--) ;
	}
}

void Start() 	//开始总线
{
	SDA=1;
	SCL=1;
	SDA=0;
	SCL=0;
}

void Stop()    //结束总线
{
	SCL=0;
	SDA=0;
	SCL=1;
	SDA=1;
}


void NoAck() 	//发ACK0
{
	SDA=1;
	SCL=1;
	SCL=0;
}

bit TestAck() 	   //测试ACK
{
	bit ErrorBit;
	SDA=1;
	SCL=1;
	ErrorBit=SDA;
	SCL=0;
	return(ErrorBit);
}

Write8Bit(unsigned char input) 	 //写入8个bit到24c02
{
	unsigned char temp;
	for(temp=8;temp!=0;temp--) 
	{
		SDA=(bit)(input&0x80);
		SCL=1;
		SCL=0;
		input=input<<1;
	}
}

void Write24c02(uchar ch,uchar address)    //写入一个字节到24c02中
{
	Start();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(address);
	TestAck();

	Write8Bit(ch);
	TestAck();
	
	Stop();
	DelayMs(10);
}

uchar Read8Bit() 	//从24c02中读出8个bit
{
	unsigned char temp,rbyte=0;
	for(temp=8;temp!=0;temp--) 
	{
		SCL=1;
		rbyte=rbyte<<1;
		rbyte=rbyte|((unsigned char)(SDA));
		SCL=0;
	}
	return(rbyte);
}

uchar Read24c02(uchar address) 	 //从24c02中读出1个字节
{
	uchar ch;

	Start();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(address);
	TestAck();
	Start();
	Write8Bit(ReadDviceAddress);
	TestAck();
	ch=Read8Bit();
	NoAck();
	Stop();
	return(ch);
}

/******************************************************  
  子程序名:void Enable_IAP()  
  程序功能:允许FLASH EEPROM的操作  
  入口参数:无  
  出口参数:无  
*******************************************************/   
/*void Enable_IAP()   
{   
     EA = 0;   
     ISP_TRIG  = 0x46; //  Enable FLASH EEPROM    
     ISP_TRIG  = 0xB9;   
     EA = 1;          
}   
/******************************************************  
  子程序名:void Disable_IAP()  
  程序功能:禁止FLASH EEPROM的操作,清除有关寄存器  
  入口参数:无  
  出口参数:无  
*******************************************************/   
/*void Disable_IAP()   
{   
     ISP_CONTR=0x00;   // Disable FLASH EEPROM    
     ISP_CMD=0x00;   
     ISP_TRIG=0x00;   
     ISP_ADDRH=0x00;   
     ISP_ADDRL=0x00;      
}   
/*********************************************  
  子程序名:void Erase_Sector(unsigned int addr)  
  程序功能:擦除扇区  
  入口参数:unsigned int addr 擦除扇区的首地址  
  出口参数:无  
**********************************************/   
/*void Erase_Sector(unsigned int addr)   
{   
     ISP_CONTR = WAIT_TIME_20MHz|0x80;   
     ISP_CMD   = ISP_IAP_SECTOR;   
   
     ISP_ADDRH  = addr/0x0100; // Sector high  addr    
     ISP_ADDRL  = addr%0x0100; // Sector lower addr    
        
     Enable_IAP();   
     Disable_IAP();   
}   
/*********************************************  
 子程序名:void write_Byte(unsigned int addr,unsigned char ch)  
 程序功能:向1个地址,写1个字节  
 入口参数:unsigned int  addr写字节的地址  
          unsigned char ch  写入的数据  
 出口参数:无  
**********************************************/   
//void write_Byte(unsigned int addr,unsigned char ch)   
//{            
//     ISP_CONTR = WAIT_TIME_20MHz|0x80;   
   //  ISP_CMD   = ISP_IAP_BYTE_PROGRAM;   
        
 //    ISP_DATA  = ch;   
 //    ISP_ADDRH = addr/0x0100; // high  addr    
  //   ISP_ADDRL = addr%0x0100; // lower addr    
        
 //    Enable_IAP();   
//     Disable_IAP();   
//}   
/*********************************************  
 子程序名:unsigned char read_Byte(unsigned int addr)  
 程序功能:读出1个地址的数据  
 入口参数:unsigned int  addr读出数据的地址  
 出口参数:返回读出的数据,数据在ISP_DATA寄存器中  
**********************************************/   
//unsigned char read_Byte(unsigned int addr)   
//{   
//     ISP_CONTR = WAIT_TIME_20MHz|0x80;   
 //    ISP_CMD   = ISP_IAP_BYTE_READ; //read command    
        
 //    ISP_ADDRH  = addr/0x0100; // high  addr    
 //    ISP_ADDRL  = addr%0x0100; // lower addr    
//             
 //    Enable_IAP();   
//     Disable_IAP();   
        
 //    return(ISP_DATA);   
///}   
/***************************
  初始化(定时器0为定时器,定时器1为计数器)
***************************/
void Init()
{


TMOD=0x51;

TL0 = -50000%256;
TH0 = -50000/256;        //2.5ms定时

TR0 = 1;        //"T0运行控制"
ET0 = 1;        //1"定时器0中断允许"
TR1 = 1;        //"T1运行控制"

TH1=TL1=0;
EA=1;          //总中断允许
counter=0;	  //计数器清零
}

  //*延时子程序void Delay(unsinged char data i)*/
void Delay(unsigned char i)
{
 	 while(--i); 

}


void UPdate( )
 {
 	  float  data  temp2;//定义存放计算得到的速度值
 	   uchar i,ch;
  int TM_hour=12;
  int TM_minute=19;
 //for(i=0;i<10;i++)
 //{
 	
 //	TM_hour++;
 //	TM_minute++;
 	
 	
 	
 //	}

  temp2=3.6*3*0.4*counter;
  
	Temp=(unsigned int)temp2;//强制转型

Dis_Date[5]=Temp%10;
Dis_Date[4]=Temp/10;
Dis_Date[3]=TM_minute%10;
Dis_Date[2]=TM_minute/10;
Dis_Date[1]=TM_hour%10;
Dis_Date[0]=TM_hour/10;

    	for (i=0,ch=0x30;i<16;i++,ch++)	
		{
		Write24c02(ch,i);
		//	lcdchar(i,1,ch);
	//		for (i=0;i<16;i++)
		{	
		ch=Read24c02(i);	 //读出24c02地址中的数据
		//	lcdchar(i,1,ch);	 //显示读出的数据
				}
		}
	//	while(1);      
	
//if(Temp>35)
	//{
	//	YELLOW=1; //黄色
  // ALARM=1; //报警
   // RED=0;   //红色
   //  Delay(1000);  Erase_Sector(STC_FLASH_ADDR+0x0300);     
    // Delay(1000);  x=read_Byte( STC_FLASH_ADDR+);     
   // Delay(1000);  write_Byte(  STC_FLASH_ADDR,Temp);   
   //  Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0020,TM_year);   
   //Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0060,TM_month);   
   // Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0080,TM_day);   
	 // Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0100,TM_hour);   
   // Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0120,TM_minute);   
	// Delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0140,CarID);  
	//	}
	//	else if((Temp)>20&&(Temp<35))
		//	{
		//		YELLOW=0; //黄色
    //    ALARM=1; //报警
    //    RED=1;   //红色
		//	
		//		}
		//		else 
		//	{};


   
}
/*写数据到74HC595函数*/
 void  WR_595(unsigned char data num2 )
 {
   unsigned char data count1;
   
   for(count1=0;count1<=7;count1++)
   {
	 num2<<=1;    /*右移位*/
	 SDATA_595=CY;
	 	_nop_();
	 _nop_();
	 SCLK_595=0;	   
	 _nop_();
	 _nop_();
	 SCLK_595=1; /*产生上生沿*/

	}  

 }

 /****************************************************************/
 /*更新74HC595输出数据函数void  Out_595(void)*/
 void  Out_595(void)
 {
   RCK_595=0;
   _nop_();
   _nop_();
   RCK_595=1;  /*上升沿锁存数据*/


 }

 void Led_Drive(void)
 {
   int i;
   

   {     
  
		   	for(i=0;i<=5;i++)//一次输出六位
		    {
		    	WR_595(Dis_Tab[Dis_Date[i]]);  
		    	}
		    {
		   	Out_595();
	      Delay(1000);
		    }					  
        TL1=0;   	

    }


  }
/****************************************************************/
  main()
{

 Init();

while(1)
   {
  
      

   }
   

}
void Time0 (void) interrupt 1
{
     
      uchar scan;

       TR0=0; 
	        Delay(1000); 
	         scan++; 
        if(scan==20)
        { scan = 0;
        	counter=TL1;  
         UPdate();
	       Led_Drive();
	      }       
	       
        TL0 = -50000%256;
        TH0 = -50000/256;        //2.5ms定时
     TR0=1;
}

⌨️ 快捷键说明

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