|
5黑幣
#include <reg52.h> //μ÷óÃμ¥Ƭ»úí·Îļt
#define uchar unsigned char //ÎT·ûoÅ×Ö·ûDí o궨òå ±äá¿·¶Î§0~255
#define uint unsigned int //ÎT·ûoÅÕûDí o궨òå ±äá¿·¶Î§0~65535
#include <intrins.h>
#include "eeprom52.h"
//êyÂë1ü¶ÎÑ¡¶¨òå 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //¶ÏÂë
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
//êyÂë1üλѡ¶¨òå
sbit smg_we1 = P3^4; //êyÂë1üλѡ¶¨òå
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send = P3^2; //3¬éù2¨·¢éä
sbit c_recive = P3^3; //3¬éù2¨½óêÕ
sbit beep = P2^3; //·äÃùÆ÷IO¿ú¶¨òå
uchar smg_i = 3; //ÏÔê¾êyÂë1üμĸöλêy
bit flag_300ms ;
long distance; //¾ààë
uint set_d; //¾ààë
uchar flag_csb_juli; //3¬éù2¨3¬3öá¿3ì
uint flag_time0; //óÃà′±£′æ¶¨ê±Æ÷0μÄê±oòμÄ
uchar menu_1; //2Ëμ¥éè¼Æμıäá¿
/***********************1msÑóê±oˉêy*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************′|àí¾ààëoˉêy****************************/
void smg_display()
{
dis_smg[0] = smg_du[distance % 10];
dis_smg[1] = smg_du[distance / 10 % 10];
dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ;
}
/******************°Ñêy¾Y±£′æμ½μ¥Ƭ»úÄú2¿eepromÖD******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, set_d % 256);
byte_write(0x2001, set_d / 256);
byte_write(0x2058, a_a);
}
/******************°Ñêy¾Y′óμ¥Ƭ»úÄú2¿eepromÖD¶á3öà′*****************/
void read_eeprom()
{
set_d = byte_read(0x2001);
set_d <<= 8;
set_d |= byte_read(0x2000);
a_a = byte_read(0x2058);
}
/**************¿a»ú×Ô¼ìeeprom3õê¼»ˉ*****************/
void init_eeprom()
{
read_eeprom(); //Ïè¶á
if(a_a != 1) //DÂμÄμ¥Ƭ»ú3õê¼μ¥Ƭ»úÄúÎêeeprom
{
set_d = 50;
a_a = 1;
write_eeprom(); //±£′æêy¾Y
}
}
/********************¶àᢰ′¼ü3ìDò*****************/
uchar key_can; //°′¼üÖμ
void key() //¶àᢰ′¼ü3ìDò
{
static uchar key_new;
key_can = 20; //°′¼üÖμ»1Ô-
P2 |= 0x07;
if((P2 & 0x07) != 0x07) //°′¼ü°′ÏÂ
{
delay_1ms(1); //°′¼üÏû¶¶¶ˉ
if(((P2 & 0x07) != 0x07) && (key_new == 1))
{ //è·èÏêǰ′¼ü°′ÏÂ
key_new = 0;
switch(P2 & 0x07)
{
case 0x06: key_can = 3; break; //μÃμ½k2¼üÖμ
case 0x05: key_can = 2; break; //μÃμ½k3¼üÖμ
case 0x03: key_can = 1; break; //μÃμ½k4¼üÖμ
}
}
}
else
key_new = 1;
}
/****************°′¼ü′|àíÏÔê¾oˉêy***************/
void key_with()
{
if(key_can == 1) //éèÖüü
{
menu_1 ++;
if(menu_1 >= 2)
{
menu_1 = 0;
smg_i = 3; //Ö»ÏÔê¾3λêyÂë1ü
}
if(menu_1 == 1)
{
smg_i = 4; //Ö»ÏÔê¾4λêyÂë1ü
}
}
if(menu_1 == 1) //éèÖñ¨¾ˉ
{
if(key_can == 2)
{
set_d ++ ; //¼ó1
if(set_d > 400)
set_d = 400;
}
if(key_can == 3)
{
set_d -- ; //¼õ1
if(set_d <= 1)
set_d = 1;
}
dis_smg[0] = smg_du[set_d % 10]; //è¡D¡êyÏÔê¾
dis_smg[1] = smg_du[set_d / 10 % 10] ; //衸öλÏÔê¾
dis_smg[2] = smg_du[set_d / 100 % 10] & 0xdf ; //è¡ê®Î»ÏÔê¾
dis_smg[3] = 0x60; //a
write_eeprom(); //±£′æêy¾Y
}
}
/****************±¨¾ˉoˉêy***************/
void clock_h_l()
{
static uchar value;
if(distance <= set_d)
{
value ++; //Ïû3yêμ¼ê¾ààëÔúé趨¾ààë×óóò±ä»ˉê±μĸéèÅ
if(value >= 2)
{
beep = ~beep; //·äÃùÆ÷±¨¾ˉ
}
}
else
{
value = 0;
beep = 1; //è¡Ïû±¨¾ˉ
}
}
/***********************êyÂëλѡoˉêy*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/***********************êyÂëÏÔê¾oˉêy*****************************/
void display()
{
static uchar i;
i++;
if(i >= smg_i)
i = 0;
smg_we_switch(i); //λѡ
P1 = dis_smg[i]; //¶ÎÑ¡
}
/******************D¡Ñóê±oˉêy*****************/
void delay()
{
_nop_(); //Ö′DDò»ìõ_nop_()Ö¸áî¾íêÇ1us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************3¬éù2¨2a¾à3ìDò*****************************/
void send_wave()
{
c_send = 1; //10usμĸßμçÆ½′¥·¢
delay();
c_send = 0;
TH0 = 0; //¸ø¶¨ê±Æ÷0Çåáã
TL0 = 0;
TR0 = 0; //1ض¨ê±Æ÷0¶¨ê±
while(!c_recive); //μ±c_reciveÎaáãê±μè′y
TR0=1;
while(c_recive) //μ±c_reciveÎa1¼Æêy2¢μè′y
{
flag_time0 = TH0 * 256 + TL0;
if((flag_time0 > 40000)) //μ±3¬éù2¨3¬1y2aá¿·¶Î§ê±£¬ÏÔê¾3¸ö888
{
TR0 = 0;
flag_csb_juli = 2;
distance = 888;
break ;
}
else
{
flag_csb_juli = 1;
}
}
if(flag_csb_juli == 1)
{
TR0=0; //1ض¨ê±Æ÷0¶¨ê±
distance =flag_time0; //¶á3ö¶¨ê±Æ÷0μÄê±¼ä
distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M Ëã3öà′êÇÃ×
if((distance > 500)) //¾ààë = Ëù¶è * ê±¼ä
{
distance = 888; //èç1û′óóú3.8m¾í3¬3ö3¬éù2¨μÄá¿3ì
}
}
}
/*********************¶¨ê±Æ÷0¡¢¶¨ê±Æ÷13õê¼»ˉ******************/
void time_init()
{
EA = 1; //¿a×üÖD¶Ï
TMOD = 0X11; //¶¨ê±Æ÷0¡¢¶¨ê±Æ÷11¤×÷·½ê½1
ET0 = 0; //1ض¨ê±Æ÷0ÖD¶Ï
TR0 = 1; //ÔêDí¶¨ê±Æ÷0¶¨ê±
ET1 = 1; //¿a¶¨ê±Æ÷1ÖD¶Ï
TR1 = 1; //ÔêDí¶¨ê±Æ÷1¶¨ê±
}
/***************Ö÷oˉêy*****************/
void main()
{
beep = 0; //¿a»ú½Dò»éù
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //3õê¼»ˉμ¥Ƭ»úIO¿úÎa¸ßμçÆ½
send_wave(); //2a¾ààëoˉêy
smg_display(); //′|àí¾ààëÏÔê¾oˉêy
time_init(); //¶¨ê±Æ÷3õê¼»ˉ3ìDò
init_eeprom(); //¿aê¼3õê¼»ˉ±£′æμÄêy¾Y
send_wave(); //2a¾ààëoˉêy
send_wave(); //2a¾ààëoˉêy
while(1)
{
if(flag_300ms == 1)
{
flag_300ms = 0;
clock_h_l(); //±¨¾ˉoˉêy
if(beep == 1)
send_wave(); //2a¾ààëoˉêy
if(menu_1 == 0)
smg_display(); //′|àí¾ààëÏÔê¾oˉêy
}
key(); //°′¼üoˉêy
if(key_can < 10)
{
key_with(); //°′¼ü′|àíoˉêy
}
}
}
/*********************¶¨ê±Æ÷1ÖD¶Ï·tÎñ3ìDò************************/
void time1_int() interrupt 3
{
static uchar value; //¶¨ê±2msÖD¶Ïò»′Î
TH1 = 0xf8;
TL1 = 0x30; //2ms
display(); //êyÂë1üÏÔê¾oˉêy
value++;
if(value >= 150)
{
value = 0;
flag_300ms = 1;
}
}
//////EEPRO52.h
#ifndef _EEPROM52_H_
#define _EEPROM52_H_
uchar a_a;
/********STC89C51éèÇø·Ö2¼*******
μúò»éèÇø£o1000H--11FF
μú¶téèÇø£o1200H--13FF
μúèyéèÇø£o1400H--15FF
μúËÄéèÇø£o1600H--17FF
μúÎåéèÇø£o1800H--19FF
μúáùéèÇø£o1A00H--1BFF
μúÆßéèÇø£o1C00H--1DFF
μú°ËéèÇø£o1E00H--1FFF
*****************/
/********STC89C52éèÇø·Ö2¼*******
μúò»éèÇø£o2000H--21FF
μú¶téèÇø£o2200H--23FF
μúèyéèÇø£o2400H--25FF
μúËÄéèÇø£o2600H--27FF
μúÎåéèÇø£o2800H--29FF
μúáùéèÇø£o2A00H--2BFF
μúÆßéèÇø£o2C00H--2DFF
μú°ËéèÇø£o2E00H--2FFF
*****************/
#define RdCommand 0x01 //¶¨òåISPμÄ2ù×÷Ãüáî
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //¶¨òåCPUμÄμè′yê±¼ä
sfr ISP_DATA=0xe2; //¼Ä′æÆ÷éêÃ÷
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
/* ================ ′ò¿a ISP,IAP 1|Äü ================= */
void ISP_IAP_enable(void)
{
EA = 0; /* 1ØÖD¶Ï */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* D′èëó2¼tÑóê± */
ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
}
/* =============== 1Ø±Õ ISP,IAP 1|Äü ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* ¿aÖD¶Ï */
}
/* ================ 1«óÃμÄ′¥·¢′úÂë ==================== */
void ISPgoon(void)
{
ISP_IAP_enable(); /* ′ò¿a ISP,IAP 1|Äü */
ISP_TRIG = 0x46; /* ′¥·¢ISP_IAPÃüáî×Ö½ú1 */
ISP_TRIG = 0xb9; /* ′¥·¢ISP_IAPÃüáî×Ö½ú2 */
_nop_();
}
/* ==================== ×Ö½ú¶á ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
EA = 0;
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* μØÖ·¸3Öμ */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* Çå3yμí3λ */
ISP_CMD = ISP_CMD | RdCommand; /* D′èë¶áÃüáî */
ISPgoon(); /* ′¥·¢Ö′DD */
ISP_IAP_disable(); /* 1رÕISP,IAP1|Äü */
EA = 1;
return (ISP_DATA); /* ·μ»Ø¶áμ½μÄêy¾Y */
}
/* ================== éèÇø2á3y ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* è¡éèÇøμØÖ· */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* Çå¿Õμí3λ */
ISP_CMD = ISP_CMD | EraseCommand; /* 2á3yÃüáî3 */
ISPgoon(); /* ′¥·¢Ö′DD */
ISP_IAP_disable(); /* 1رÕISP,IAP1|Äü */
}
/* ==================== ×Ö½úD′ ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
EA = 0;
// SectorErase(byte_addr);
ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* è¡μØÖ· */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* Çåμí3λ */
ISP_CMD = ISP_CMD | PrgCommand; /* D′Ãüáî2 */
ISP_DATA = original_data; /* D′èëêy¾Y×¼±¸ */
ISPgoon(); /* ′¥·¢Ö′DD */
ISP_IAP_disable(); /* 1رÕIAP1|Äü */
EA =1;
}
#endif
|
|