|
GYJ-0095-C 接線(xiàn)圖.jpg (252.44 KB, 下載次數(shù): 41)
下載附件
2023-8-31 13:06 上傳
【聲明】此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息!
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h> //計(jì)算小數(shù)點(diǎn)的頭文件
#include <intrins.h> //用nop函數(shù)延時(shí)的頭文件
#define uchar unsigned char//宏定義無(wú)符號(hào)字符型
#define uint unsigned int //宏定義無(wú)符號(hào)整型
/*數(shù)據(jù)類(lèi)型定義*/
typedef signed char int8;
typedef signed int int16;
typedef signed long int32;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define ENABLE_IAP 0x83 //系統(tǒng)工作時(shí)鐘<12MHz 時(shí),對(duì)IAP_CONTR 寄存器設(shè)置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000 //存儲(chǔ)地址
#define FOSC 11059200L
#define BAUD 9600
uint8 sendBuf[10]; //發(fā)送緩沖區(qū)
uint8 receBuf[10]; //接收緩沖區(qū)
sbit IN1 = P1^0; /*單片機(jī)1.0引腳檢測(cè)IN1是否動(dòng)作*/
sbit IN2 = P1^1; /*單片機(jī)1.1引腳檢測(cè)IN2是否動(dòng)作*/
sbit IN3 = P1^2; /*單片機(jī)1.2引腳檢測(cè)IN4是否動(dòng)作*/
sbit IN4 = P1^3; /*單片機(jī)1.3引腳檢測(cè)IN2是否動(dòng)作*/
sbit OUT1 = P3^5; /*單片機(jī)3.5引腳控制繼電器OUT1*/
sbit OUT2 = P3^4; /*單片機(jī)3.4引腳控制繼電器OUT2*/
sbit OUT3 = P3^3; /*單片機(jī)3.3引腳控制繼電器OUT3*/
sbit OUT4 = P3^2; /*單片機(jī)3.2引腳控制繼電器OUT4*/
sbit S1 = P5^4; /*單片機(jī)按鍵S1*/
sbit S2 = P5^5; /*單片機(jī)按鍵S2*/
sbit COM1 = P3^6; /*數(shù)碼管顯示位個(gè)位*/
sbit COM2 = P3^7; /*數(shù)碼管顯示位十位*/
//code uchar seg7code[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; //顯示段碼
code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰數(shù)碼管顯示段碼
uchar date;
bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;
bit bz6=0;
bit sjbz1=0;
bit sjbz2=0;
bit write=0;
uint sec1=0;
uint sec2=0;
uint sec3=0;
uint sec4=0;
uint tcnt=0;
uint sj1;
uint sj2;
uchar A1,B1,C1,D1;
uchar r;
bit flag_zx=0;
bit bjbz1=0;
bit bjbz2=0;
bit bjbz3=0;
bit bjbz4=0;
/********************************************************************
定義 ISP/IAP/EEPROM 命令
*********************************************************************/
void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機(jī) 在 一 安全 狀態(tài)
uint8 IapReadByte(uint16 addr);//讀數(shù)據(jù)
void IapProgramByte(uint16 addr, uint8 dat);//寫(xiě)數(shù)據(jù)
void IapEraseSector(uint16 addr);//擦除數(shù)據(jù)
/********************************************************************
延時(shí)函數(shù)
*********************************************************************/
void delay(uchar dat)//延時(shí)程序
{
uchar m,n,s;
for(m=dat;m>0;m--)
for(n=2;n>0;n--)
for(s=248;s>0;s--);
}
/****************發(fā)送函數(shù)*********************/
void senduart1()
{
SBUF='R';while(!TI);TI=0;
SBUF='E';while(!TI);TI=0;
SBUF='A';while(!TI);TI=0;
SBUF='D';while(!TI);TI=0;
}
/********************************************************************
定時(shí)中斷服務(wù)函數(shù)
*********************************************************************/
void t0(void) interrupt 1 using 0 //定時(shí)中斷服務(wù)函數(shù)
{
tcnt++; //每過(guò)250ust tcnt 加一
if(tcnt==400) //計(jì)滿(mǎn)400 次(1/10 秒)時(shí)
{
tcnt=0; //重新再計(jì)
if(bjbz1==1){sec1++;if(sec1>=date){sec1=0;OUT1=0;bjbz1=0;}}
if(bjbz2==1){sec2++;if(sec2>=date){sec2=0;OUT2=0;bjbz2=0;}}
if(bjbz3==1){sec3++;if(sec3>=date){sec3=0;OUT3=0;bjbz3=0;}}
//if(bjbz4==1){sec4++;if(sec4>=date){sec4=0;OUT4=0;bjbz4=0;}}
}
}
/********************************************************************
按鍵函數(shù)
*********************************************************************/
void key()
{
if((S1==0)&&(bz1==0)){delay(1);if(S1==0){bz1=1;if(date<100){date++;}}}if((S1==1)&&(bz1==1)){delay(1);if(S1==1){write=1;bz1=0;}}
if((S2==0)&&(bz2==0)){delay(1);if(S2==0){bz2=1;if(date>=1){date--;}}} if((S2==1)&&(bz2==1)){delay(1);if(S2==1){write=1;bz2=0;}}
//if((IN4==0)&&(bz6==0)){delay(1);if(IN4==0){bz6=1;OUT1=1;OUT2=1;OUT3=1;OUT4=1;bjbz1=0;sec1=0;bjbz2=0;sec2=0;bjbz3=0;sec3=0;}}
//if((IN4==1)&&(bz6==1)){delay(1);if(IN4==1){bz6=0;}}
if(IN1==0){bjbz1=1;} else {OUT1=1;sec1=0;}
if(IN2==0){bjbz2=1;} else {OUT2=1;sec2=0;}
if(IN3==0){bjbz3=1;} else {OUT3=1;sec3=0;}
if((OUT1==0)||(OUT2==0)||(OUT3==0)){delay(1);if((OUT1==0)||(OUT2==0)||(OUT3==0)){OUT4=0;}} else {OUT4=1;}
}
/********************************************************************
顯示函數(shù)
*********************************************************************/
void xianshi()
{
A1=date/10;
B1=date%10;
COM1=1;COM2=1;P2=seg7code[A1];COM1=0;COM2=1;delay(1);//十位顯示
COM1=1;COM2=1;P2=seg7code[B1];COM1=1;COM2=0;delay(1);//個(gè)位顯示
}
/*****************清空發(fā)送緩沖區(qū)*************************/
void clear_receBuf()
{
uchar i;
for(i=0;i<5;i++)
{
receBuf=0;
}
}
/********************************************************************
主函數(shù)
*********************************************************************/
void main()
{
P2M0=0Xff;P2M1=0X00;
P5M0=0X00;P5M1=0X00;
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14;
AUXR |= 0x01;
ES = 1;
EA = 1;
date= IapReadByte(0x01);//讀取存儲(chǔ)的值
if(date>=100){date=2;write=1;}
TMOD=0x02; //定時(shí)器工作在方式2
TH0=0x06; //對(duì)TH0 TL0 賦值
TL0=0x06;
TR0=1; //開(kāi)始定時(shí)
ET0=1;
EA=1;
sec1=0;sec2=0;sec3=0;sec4=0;
COM1=1;COM2=1;
while(1)
{
key();//調(diào)用按鍵函數(shù)
xianshi();//調(diào)用顯示函數(shù)
if(write==1) //存儲(chǔ)數(shù)據(jù)
{
write=0;
IapEraseSector(0); //擦除扇區(qū)
IapProgramByte(0x01,date);//寫(xiě)入新的地址
}
}
}
/********************************************************************
串口中斷函數(shù)
*********************************************************************/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收標(biāo)志清零
receBuf[r++&0x0F]=SBUF; //把接受的數(shù)據(jù)存儲(chǔ)到BUT數(shù)組中
if(receBuf[0]!=0xaa){r=0;}
if(r>=5)
{ r=0;
flag_zx=1;
}
}
if(flag_zx==1)
{
flag_zx=0;
//0 1 2 3 4
//起始位 千位 百位 十位 個(gè)位
if(receBuf[0]==0xaa) //如果開(kāi)始位和結(jié)束位,還有地址都正確,進(jìn)行下一步判斷
{
A1=receBuf[1];
B1=receBuf[2];
C1=receBuf[3];
D1=receBuf[4];
write=1;
clear_receBuf();
}
}
}
/********************************************************************
結(jié)束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機(jī) 在 一 安全 狀態(tài)
IAP_CONTR = 0; //
IAP_CMD = 0; //
IAP_TRIG = 0; //
IAP_ADDRH = 0x80; //
IAP_ADDRL = 0; //
}
uint8 IapReadByte(uint16 addr){//讀數(shù)據(jù)
uint8 dat;
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
dat = IAP_DATA;
IapIdle();
return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//寫(xiě)數(shù)據(jù)
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
void IapEraseSector(uint16 addr){//擦除數(shù)據(jù)
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
/********************************************************************
結(jié)束
*********************************************************************/
|
|