📄 新建 文本文档 (3).txt
字号:
#include <STC12C5410AD.H>
#include <intrins.h>
#define off 0
#define on 1
#define ISP_IAP_BYTE_READ 1
#define ISP_IAP_BYTE_PROGRAM 2
#define ISP_IAP_SECTOR_ERASE 3
#define WAIT_TIME 4
/**********************************/
sbit PSB=P3^3;
sbit SID=P3^5;
sbit SCLK=P3^4;
sbit RES=P3^7; //电路板上有电流(发电机)
/*sbit CS=P3^5;
sbit SID=P3^4;
sbit SCLK=P3^3;
sbit RES=P3^2;*/ //实验板
/**********************************/
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char hour2;
unsigned char hour3;
unsigned char counter;
unsigned int adinterim17;
unsigned int adinterim16;
unsigned int power;
bit eeprom_enable=0;
bit displaybit=0;
/********************************************************/
void DelayM(unsigned int a)
{
unsigned char i;
while(--a!=0)
{
for(i=0;i<250;i++)
WDT_CONTR=0x3c;
}
}
/****************************************************************************/
void lcm_w_word(unsigned char *str) ;
void lcm_w_test(bit start,unsigned char ddata);
void lcm_w_byte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcm_init(void);
void lcm_clr(void);
void ad16(void);
void ad17(void);
//void delay(unsigned char);
/****************************************************************************/
void delay(unsigned char i)
{
unsigned char a,b;
while(i--)
{
for(a=0;a<10;a++)
for(b=0;b<10;b++);
}
}
/***************************************************************************/
void ad17(void)
{ ADC_CONTR&=0xe7;
delay(5);
ADC_DATA=0x00;
ADC_CONTR=ADC_CONTR|0x08;
delay(10);
if(ADC_CONTR|0x10)
{
ADC_CONTR=ADC_CONTR|0xE7;
adinterim17=ADC_DATA;
adinterim17=adinterim17*436/256;
}
}
/*************************************************************************/
void ad16(void)
{ ADC_CONTR&=0xe6;
delay(5);
ADC_DATA=0x00;
ADC_CONTR=ADC_CONTR|0x08;
delay(10);
if(ADC_CONTR|0x10)
{
ADC_CONTR=ADC_CONTR|0xE7;
adinterim16=ADC_DATA;
adinterim16=adinterim16*195/100;
}
}
/****************************************************************************/
void lcm_init(void) {
delaynms(100);
lcm_w_test(0,0x30); //8 位介面,30:基本指令集34:扩展
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零
delaynms(400); //启动等待,等LCM讲入工作状态
}
/******************************************************************************/
//写指令或数据 (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //发送起始信号
delaynms(10); //延时是必须的
lcm_w_byte(Hdata); //发送高四位
delaynms(10); //延时是必须的
lcm_w_byte(Ldata); //发送低四位
delaynms(10); //延时是必须的
}
/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
for(i=0;i<8;i++){
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
for(da=0;da<di;da++);
for(db=0;db<10;db++);
}
/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(80); //启动等待,等LCM讲入工作状态
}
/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
while(*str != '\0'){
lcm_w_test(1,*str++);
}
*str = 0;
}
/*************************************************************/
void tt0(void)interrupt 1
{
TH0=0x4c;
TL0=0x00;
counter++;
if(counter==20)
{
displaybit=1;
counter=0;
sec++;
}
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==100)
{
hour=0;
hour2++;
}
if(hour2==100)
{
hour2=0;
hour3++;
}
if(hour3==100)
hour3=0;
}
/***********************************************
功能:eeprom_read
描述:EEPROM读
参数:无
返回:读出的数
***********************************************/
unsigned char eeprom_read(unsigned char BYTE_ADDR_HIGH,unsigned char BYTE_ADDR_LOW)
{unsigned char eeprom_data;
if(eeprom_enable)
{ISP_ADDRH=BYTE_ADDR_HIGH;
ISP_ADDRL=BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_BYTE_READ;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
eeprom_data=ISP_DATA;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
return(eeprom_data);
}
eeprom_enable=0;
}
/***********************************************
功能:eeprom_program
描述:EEPROM编程
参数:编程数据
返回:无
***********************************************/
void eeprom_program(unsigned char program_data,unsigned char BYTE_ADDR_HIGH,unsigned char BYTE_ADDR_LOW)
{if(eeprom_enable)
{ISP_DATA=program_data;
ISP_ADDRH=BYTE_ADDR_HIGH;
ISP_ADDRL=BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
}
eeprom_enable=0;
}
/***********************************************
功能:eeprom_erase
描述:EEPROM扇区擦除
参数:无
返回:无
***********************************************/
void eeprom_erase(unsigned char SECTOR_FIRST_BYTE_ADDR_HIGH,unsigned char SECTOR_FIRST_BYTE_ADDR_LOW)
{if(eeprom_enable)
{ISP_ADDRH=SECTOR_FIRST_BYTE_ADDR_HIGH;
ISP_ADDRL=SECTOR_FIRST_BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_SECTOR_ERASE;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
}
eeprom_enable=0;
}
/*****************************************************/
void timer(void)
{
unsigned char i,j,k;
power=adinterim16*adinterim17;
power=power/10;
i=power/10;
j=power/100;
k=power/1000;
lcm_w_test(0,0x80);
lcm_w_word("[XGDQ]Gas:");//
lcm_w_test(1,0x5b);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x5d);
lcm_w_test(0,0x90);
lcm_w_word("U:");
lcm_w_test(1,(adinterim17/100)+0x30);
lcm_w_test(1,(adinterim17/10)%10+0x30);
lcm_w_test(1,(adinterim17%10)+0x30);
lcm_w_word("V");
lcm_w_word(" ");
lcm_w_word("I:");
lcm_w_test(1,(adinterim16/100)+0x30);
lcm_w_test(1,(adinterim16/10)%10+0x30);
lcm_w_word(".");
lcm_w_test(1,(adinterim16%10)+0x30);
lcm_w_word("A");
lcm_w_test(0,0x88);
lcm_w_word("P:");
lcm_w_test(1,k+0x30);
lcm_w_test(1,(j%10)+0x30);
lcm_w_test(1,(i%10)+0x30);
lcm_w_test(1,(power%10)+0x30);
lcm_w_word("W ");
lcm_w_word("Oil:on");
lcm_w_test(0,0x98);
lcm_w_word("Time:");
lcm_w_test(1,(hour3%10)+0x30);
lcm_w_test(1,(hour2/10)+0x30);
lcm_w_test(1,(hour2%10)+0x30);
lcm_w_test(1,(hour/10)+0x30);
lcm_w_test(1,(hour%10)+0x30);
lcm_w_word("H");
lcm_w_test(1,0x22);
lcm_w_test(1,(min/10)+0x30);
lcm_w_test(1,(min%10)+0x30);
lcm_w_word("M");
lcm_w_test(1,0x22);
//lcm_w_test(0,0x34); //8 位介面,30:基本指令集34:扩展
//lcm_w_test(0,0x04); //8 位介面,30:基本指令集34:扩展
}
/************************************************************/
void int0(void)interrupt 0
{
unsigned char secread,minread;
unsigned char hourg,hourz,hour2g,hour2z,hour3g,hour3z;
unsigned char hourgread,hourzread,hour2gread,hour2zread,hour3gread,hour3zread;
unsigned char hourdb,hour2db,hour3db;
ADC_CONTR=0x00;
EA=0;
hourg=hour%10;
hourz=hour/10;
hour2g=hour2%10;
hour2z=hour2/10;
hour3g=hour3%10;
hour3z=hour3/10;
eeprom_enable=1;
eeprom_erase(18,00);
eeprom_enable=1;
eeprom_program(sec,18,0);
eeprom_enable=1;
eeprom_program(min,18,1);
eeprom_enable=1;
eeprom_program(hourz,18,2);
eeprom_enable=1;
eeprom_program(hourg,18,3);
eeprom_enable=1;
eeprom_program(hour2z,18,4);
eeprom_enable=1;
eeprom_program(hour2g,18,5);
eeprom_enable=1;
eeprom_program(hour3z,18,6);
eeprom_enable=1;
eeprom_program(hour3g,18,7);
eeprom_enable=1;
eeprom_program(88,18,10);
delay(10);
/************************************/
eeprom_enable=1;
secread=eeprom_read(18,0);
eeprom_enable=1;
minread=eeprom_read(18,1);
eeprom_enable=1;
hourzread=eeprom_read(18,2);
eeprom_enable=1;
hourgread=eeprom_read(18,3);
hourdb=hourzread*10+hourgread;
eeprom_enable=1;
hour2zread=eeprom_read(18,4);
eeprom_enable=1;
hour2gread=eeprom_read(18,5);
hour2db=hour2zread*10+hour2gread;
eeprom_enable=1;
hour3zread=eeprom_read(18,6);
eeprom_enable=1;
hour3gread=eeprom_read(18,7);
hour3db=hour3zread*10+hour3gread;
eeprom_enable=0;
if((sec==secread)&&(min==minread)&&(hour==hourdb)&&(hour2==hour2db)&&(hour3==hour3db))
while(1);
}
/**************************************************************/
void main(void)
{
unsigned char hourgread,hourzread,hour2gread,hour2zread,hour3gread,hour3zread;
unsigned char i,x;
WDT_CONTR=0x3c;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
PSB=0;
RES=1;
P1=0xff;
P3=0xff;
P1M0=0xc0;
P1M1=0xc0;
DelayM(100);
ADC_CONTR&=0x80;
ADC_DATA=0x00;
DelayM(200);
lcm_init();
lcm_clr();
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing.");
lcm_w_test(0,0x9a);
lcm_w_word(" Please wait");
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing..");
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing...");
DelayM(1000);
lcm_w_test(0,0x9a);
lcm_w_word(" Success");
DelayM(1000);
eeprom_enable=1;
x=eeprom_read(18,10);
if(x!=88)
{
eeprom_enable=1;
eeprom_erase(18,00);
for(i=0;i<8;i++)
{
eeprom_enable=1;
eeprom_program(0,18,i);
}
eeprom_enable=1;
eeprom_program(88,18,10);
eeprom_enable=0;
}
else
{
eeprom_enable=1;
sec=eeprom_read(18,0);
eeprom_enable=1;
min=eeprom_read(18,1);
eeprom_enable=1;
hourzread=eeprom_read(18,2);
eeprom_enable=1;
hourgread=eeprom_read(18,3);
hour=hourzread*10+hourgread;
eeprom_enable=1;
hour2zread=eeprom_read(18,4);
eeprom_enable=1;
hour2gread=eeprom_read(18,5);
hour2=hour2zread*10+hour2gread;
eeprom_enable=1;
hour3zread=eeprom_read(18,6);
eeprom_enable=1;
hour3gread=eeprom_read(18,7);
hour3=hour3zread*10+hour3gread;
}
lcm_clr();
ET0=1;
TR0=1;
EX0=1;
EA=1;
while(1)
{
ad16();
if(displaybit)
{
timer();
displaybit=0;
}
ad17();
WDT_CONTR=0x3c;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -