
#include<intrins.h>
#define NOP _nop_()
#define KEY_PRESS
#include "WIN24C02.H"
unsigned char code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71}
////////////////////////伏枝仿///////
#define uchar unsigned char
uchar times=0
uchar dis_buf[4]={0}
uchar key_flag=0
uchar key_cnt=0
uchar exint_flag=0
uchar buzzer_cnt=0
uchar int_flag=0
unsigned int int_cnt=0
///////////////////////////////////
sbit ir_Induction=P1^0
sbit ming=P3^7
sbit ir_s=P3^2
sbit iic_sda=P0^5
sbit iic_clk=P0^4
unsigned int ir_num=0
sfr isp_wdt = 0xE1
sfr isp_data= 0xE2
sfr isp_addrh = 0xE3
sfr isp_addrl = 0xE4
sfr isp_cmd = 0xE5
sfr isp_trig= 0xE6
sfr isp_contr = 0xE7
/*****************************************/
/***************STC89CXX_EEPROM扇区擦除程序*************************/
void STC89CXX_EEPROM_Erase(unsigned char t_addr)
{
isp_addrh = t_addr //可以不要 扇区里任意一个字节的地址都是扇区地址,无需求首地址,单片机会自己处理
isp_addrl = 0
// EA=0//关中断
isp_contr = 0x81
isp_cmd = 3 //扇区擦除,要某字节为空,必须擦除1个扇区
isp_trig = 0x46//先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9//送完0xb9后 ISP/IAP 立即被触发启动
// EA = 1
// 开中断
}
/***********************************************/
void STC89CXX_EEPROM_Char_Write(unsigned int Write_addr ,unsigned int Write_data)
{
isp_data = (Write_data>>8)&0xff
isp_addrh = Write_addr/256//送地址高搭源位
isp_addrl = Write_addr%256 //地址低位
// EA = 0/* 关中断 */缺纤
isp_contr = 0x81
isp_cmd = 2 //送扇区命令
isp_trig = 0x46
isp_trig = 0xb9
isp_data = Write_data&0xff
isp_addrl = (Write_addr+1)%256
isp_contr = 0x81
isp_cmd = 2 //送扇区命令
isp_trig = 0x46
isp_trig = 0xb9
// EA = 1
/* 开中断 */
}
/**************************************************************/
unsigned int STC89CXX_EEPROM_Char_Read(unsigned int Read_addr)
{
unsigned int temp=0
isp_addrh = Read_addr/256 //送地址高字节
isp_addrl = Read_addr%256 //送地址低字节(从0开始到num-1为止)
// EA = 0 /* 关中断 */
isp_contr = 0x81 /*20M,是0x80 orl 1 */
isp_cmd = 1 // 1表示字节读
isp_trig = 0x46 //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9 //送完0xb9后 ISP/IAP 立即被触发启动
temp= (isp_data<<8)
isp_addrl = (Read_addr+1)%256
isp_contr = 0x81 /*20M,是0x80 orl 1 */
isp_cmd = 1 // 1表示字节读
isp_trig = 0x46 //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9
temp|=isp_data
// EA = 1 //空指令
/* 开中断 */
return(temp)
}
static void iic_start()
{
iic_sda=1
iic_clk=1
NOP
iic_sda=0
iic_clk=0
}
static void iic_stop()
{
iic_clk=0
iic_sda=0
iic_clk=1
NOP
iic_sda=1
}
static void iic_write_byte(uchar dat)
{
uchar i
for(i=0i<8i++)
{
iic_clk=0
iic_sda=dat&0x80
NOP
iic_clk=1
NOP
dat<<=1
}
iic_clk=0
}
static uchar recive_ack()
{
uchar i=0
iic_clk=0
NOP
//iic_sda=1
NOP
iic_clk=1
NOP
NOP
while(iic_sda)
iic_clk=0
// if(i==200)
// return 0
//else
return 1
}
static void send_ack()
{
uchar i=0
iic_sda=1
NOP
iic_clk=0
NOP
iic_sda=0
NOP
iic_clk=1
NOP
iic_clk=0
iic_sda=1
}
void iic_write(uchar addr,uchar dat)
{
iic_start()
iic_write_byte(0xa0)
recive_ack()
iic_write_byte(addr)
recive_ack()
iic_write_byte(dat)
recive_ack()
iic_stop()
}
static uchar iic_read_byte()
{
uchar i
uchar dat=0
for(i=0i<8i++)
{
// iic_sda=0
dat<<=1
iic_clk=0
NOP
iic_clk=1
NOP
dat|=iic_sda
}
iic_clk=0
return dat
}
uchar iic_read(uchar addr)
{
uchar dat
iic_start()
iic_write_byte(0xa0)
recive_ack()
iic_write_byte(addr)
recive_ack()
iic_start()
iic_write_byte(0xa1)
recive_ack()
dat=iic_read_byte()
iic_stop()
return dat
}
void delay(unsigned int z)
{
unsigned int x,y
for(x=zx>0x--)
{
for(y=100y>0y--)
}
}
void iic_writes(uchar addr,void *buf,uchar num)
{
uchar i
uchar *pt=(uchar *)buf
for(i=0i<numi++)
{
iic_write(addr+i,pt[i])
delay(10)
}
}
void iic_reads(uchar addr,void *buf,uchar num)
{
uchar i
uchar *pt=(uchar *)buf
for(i=0i<numi++)
{
pt[i]=iic_read(addr+i)
//delay(3)
}
}
sbit KEY1=P3^6
unsigned char i_com=0x88
//unsigned char flag=0
void timer0_init()
{
TMOD=0x11
TH0=0xfd
TL0=0x80
ET0=1
TR0=1
TH1=0xfd
TL1=0x80
ET1=1
TR1=1
}
void ch_value( )
{
dis_buf[0]=(ir_num/1000)%10
dis_buf[1]=(ir_num/100)%10
dis_buf[2]=(ir_num/10)%10
dis_buf[3]=(ir_num)%10
}
void timer0_isq()interrupt 1
{
TH0=0xf8
TL0=0x84
P2=0xff
P0= (8>>(times))
P2=table[dis_buf[times]]
times=++times%4
}
void display()
{
P2=0xff
P0= (i_com>>(0))
P2=table[dis_buf[0]]
delay(3)
P2=0xff
P0= (i_com>>(1))
P2=table[dis_buf[1]]
delay(3)
P2=0xff
P0= (i_com>>(2))
P2=table[dis_buf[2]]
delay(3)
P2=0xff
P0= (i_com>>(3))
P2=table[dis_buf[3]]
delay(3)
}
void int_0() interrupt 0
{
// EA=0
//display()
exint_flag=1
int_flag=1
EX0=0
ir_num++
#ifdef KEY_PRESS
// IE0=0
#endif
// EA=1
}
void timer1_isq()interrupt 3
{
TH1=0xfa
TL1=0x84
if(key_flag&&(++key_cnt==10))
{
if(KEY1)
{
key_flag=0
}
key_cnt=0
}
if(int_flag&&(++int_cnt==20))
{
#ifdef KEY_PRESS
if(ir_s)
#else
if(!ir_s)
#endif
{
int_flag=0
}
int_cnt=0
}
if(exint_flag)
{
ming=0
}
if(exint_flag&&(++buzzer_cnt==40))
{
ming=1
buzzer_cnt=0
exint_flag=0
}
}
void main()
{
delay(500)
timer0_init()
WIN24C02_init() //24c02初始化子程序
EX0=1
IT0=1
IE0=0
EA=1
PT0=1
// ir_num=STC89CXX_EEPROM_Char_Read(0x2000)
iic_reads(0x10,&ir_num,2)
//ir_num=WIN24C02_read(0x00)|(WIN24C02_read(0x01)<<8)
ch_value()
while(1)
{
if(ir_s==1)
{
ir_s=0
}
ch_value()
//display()
if(!EX0)
{
if(ir_num>=9999)
ir_num=0
iic_writes(0x10,&ir_num,2)
while(int_flag&&KEY1)//display()
//STC89CXX_EEPROM_Erase(0x20)
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num)//存数据到EEPROM
// WIN24C02_write(0x00,ir_num&0xff)
// WIN24C02_write(0x01,(ir_num>>8)&0xff)
//IE0=0
ch_value()
#ifdef KEY_PRESS
IE0=0
#else
IE0=0
#endif
EX0=1
}
if(!KEY1)
{
// display()
EX0=0
ir_num=0
//STC89CXX_EEPROM_Erase(0x20)
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num)//存数据到EEPROM
iic_writes(0x10,&ir_num,2)
// WIN24C02_write(0x00,ir_num&0xff)
// WIN24C02_write(0x01,(ir_num>>8)&0xff)
ch_value()
// EA=1
while(!KEY1)
IE0=0
EX0=1
}
}
}
这段函数只是梁哪芹在用数码管显示人数,你没有给出中断函数,那段switch就是在计算数码管怎么显示人数。 真正改变这个数的是中断服务函数。void INT_init(void)
{
TCON=0x05
IE=0x85
IP=0x00
}
你这里初始化了,但是没有给出服缓此务函数。
另外几个橡毕定时器应该是在判断红外的时候用的。 应该用在中断里。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)