📄 new.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 + -