📄 wenkongyi.c
字号:
#include<reg51.h>
#include<intrins.h>
#include <stdio.h>
/////
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//////
sbit key0=P2^6;//按键0
sbit key1=P2^7;//按键1
sbit key2=P3^7;//按键2
/////
sbit led0=P2^1;//数码管0
sbit led1=P2^0;//数码管1 //p30
sbit led2=P1^6;//数码管2
sbit led3=P3^4;//数码管3
sbit led4=P1^4;//数码管4
sbit led5=P3^3;//数码管5
//sbit led6=P1^3;//数码管6
////////////
sbit alarm=P2^2;//没有接线
sbit kekong=P3^2;//接可控硅2号脚
sbit ad=P1^5;//AD转换引脚
/////
sbit a=P2^3;
sbit b=P1^2;
sbit c=P3^5;
sbit d=P1^1;
sbit e=P1^0;
sbit f=P1^7;
sbit g=P2^5;
sbit dp=P2^4;
////////////////////////////////
uchar bdata xs;
sbit xs0=xs^0;
sbit xs1=xs^1;
sbit xs2=xs^2;
sbit xs3=xs^3;
sbit xs4=xs^4;
sbit xs5=xs^5;
sbit xs6=xs^6;
sbit xs7=xs^7;
bit shang,zhong,xia;
/////
code uchar ledasc[26]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00, //熄灭
0x77, //"A"
0x39, //"C"
0x38, //"L"
0x73, //"P"
0x50, //"r"
0x78, //"t"
0x31, //"T"
0x58, //"c"
0x6D, //"S"
0x40, //"-"
0x46,//"-1"
0x63,//"-o"
0x5c,//"_o"
0x7a,//K
0x54//n
};
////////////////////
code uchar tishi[8][3]={ //8个PID调节参数名
10,19,14,//SP
10,11,13,//AL
10,15,16,//rt
10,11,15,//Ar
10,10,14,///P
10,10,17,//T
10,12,15,//Cr
10,13,12//Lc
};
bit csset0=0,csset1=0;
uint xtcs[9];
//////////
bit keyout=0;
uchar keyinjs=0,keyjs=0;
uchar disbuf[7];
uchar keycode=0;//键码
//////////////////
void delay(uint i)
{
next:if(i>0){i--;_nop_();_nop_();_nop_();_nop_();_nop_();goto next;}
}
///ADC CONTRALL
sfr adccontr=0xc5;//A/D转换控制寄存器
sfr adcdata1=0xc6;//A/D转换结果寄存器,高8位
sfr adcdata2=0xbe;//A/D转换结果寄存器,低2位
sfr P1M0=0x91;//P1M0 设置I/O口模式
sfr P1M1=0x92;//P1M1
sfr P2M0=0x95;//P2M0
sfr P2M1=0x96;//P2M1
sfr P3M0=0xb1;//P3M0 Port SFRs
sfr P3M1=0xb2;//P3M1
////////////////////////////////////
uint adt=0;
bit adok;
adcpoweron()
{
adccontr=adccontr|0x80;//开A/D转换电源
delay(1500);
adccontr=0xe5;//11100101,p1.5作为A/D输入来用
delay(50);
}
startad()
{
adcdata1=0;
adcdata2=0;
adok=0;
adccontr=adccontr|0x08;//ADC_START==1
}
///取结A/D结果
getad()
{
uchar state;
uint ad1=0,ad2=0;
state=adccontr;
state=state&0x10;//1000 0000
if(state!=0){
adccontr=adccontr&0xe7;//1110 0111
ad1=adcdata1*4;//左移两位
ad2=adcdata2&0x03;//只取后两位
adt=ad1+ad2;//共十位A/D转换结果
adok=1;//标志位
}
}
///eeprom address 存储
sfr wdtcontr=0xe1;
sfr ispdata=0xe2;
sfr ispaddrh=0xe3;
sfr ispaddrl=0xe4;
sfr ispcmd=0xe5;
sfr isptrig=0xe6;
sfr ispcontr=0xe7;
iapdisable()
{ispcontr=0;
ispcmd=0;
isptrig=0;}
erase(uint addr)
{
ispcontr=0x83;
ispcmd=0x03;
ispaddrh=addr/256;
ispaddrl=addr%256;
EA=0;
isptrig=0x46;
isptrig=0xb9;
_nop_();
EA=1;
iapdisable();
}
uchar readbyte(uint addr)
{
uchar ch;
ispcontr=0x83;
ispcmd=0x01;
ispaddrh=addr/256;
ispaddrl=addr%256;
isptrig=0x46;
isptrig=0xb9;
_nop_();
ch=ispdata;
iapdisable();
return ch;//读取值
}
void writebyte(uint addr,uchar ch)
{
ispcontr=0x83;
ispcmd=0x02;
ispaddrh=addr/256;
ispaddrl=addr%256;
ispdata=ch;
isptrig=0x46;
isptrig=0xb9;
_nop_();
iapdisable();
}
savedata()//存储数据
{
uint addr=0x2a00;//EEPROM第二扇区起始地址
erase(addr);
writebyte(addr,123);//写入123标志起始地址
addr++;writebyte(addr,xtcs[0]%256);addr++;writebyte(addr,xtcs[0]/256);
addr++;writebyte(addr,xtcs[1]%256);addr++;writebyte(addr,xtcs[1]/256);
addr++;writebyte(addr,xtcs[2]%256);addr++;writebyte(addr,xtcs[2]/256);
addr++;writebyte(addr,xtcs[3]%256);addr++;writebyte(addr,xtcs[3]/256);
addr++;writebyte(addr,xtcs[4]%256);addr++;writebyte(addr,xtcs[4]/256);
addr++;writebyte(addr,xtcs[5]%256);addr++;writebyte(addr,xtcs[5]/256);
addr++;writebyte(addr,xtcs[6]%256);addr++;writebyte(addr,xtcs[6]/256);
addr++;writebyte(addr,xtcs[7]%256);addr++;writebyte(addr,xtcs[7]/256);
addr++;writebyte(addr,xtcs[8]%256);addr++;writebyte(addr,xtcs[8]/256);
}
getdata()//读取数据
{
uchar label=0,dath,datl;
uint addr=0x2a00;
label=readbyte(addr);
if(label==123){
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[0]=dath*256+datl;if(xtcs[0]>400)xtcs[0]=400;//sp
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[1]=dath*256+datl;if(xtcs[1]>800)xtcs[1]=250;//al
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[2]=dath*256+datl;if(xtcs[2]>200)xtcs[2]=100;//rt
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[3]=dath*256+datl;if(xtcs[3]>100)xtcs[3]=100;//ar
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[4]=dath*256+datl;if(xtcs[4]>400)xtcs[4]=30;//p
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[5]=dath*256+datl;if(xtcs[5]>100)xtcs[5]=20;//t
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[6]=dath*256+datl;if(xtcs[6]>999)xtcs[6]=240;//cr
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[7]=dath*256+datl;if(xtcs[7]>2)xtcs[7]=2;//lc
addr++;datl=readbyte(addr);addr++;dath=readbyte(addr);xtcs[8]=dath*256+datl;if(xtcs[8]>199)xtcs[8]=100;
}
else{
xtcs[0]=100;xtcs[1]=250;xtcs[2]=100;xtcs[3]=100;
xtcs[4]= 30;xtcs[5]= 20;xtcs[6]=240;xtcs[7]=0;xtcs[8]=100;
savedata();
}
}
///////////////////////////////////
xdata uchar chang=0;
xdata uchar index=0;
xdata uchar changjj1=0,changjj2=0;
xdata uchar doublekey=0;
xdata uint doujs=0;
bit csset2=0;
uint zhengding=0;
///////////////////////////////////
void outled(uchar i)//数码管显示
{
xs=ledasc[disbuf[i]];
a=xs0;b=xs1;c=xs2;d=xs3;e=xs4;f=xs5;g=xs6;dp=xs7;//xs的显示
if(i==6){a=0;b=0;c=xia;d=zhong;e=shang;f=0;g=0;dp=0;}
}
//////////////////////////////////////
judgekey(uchar i)
{keyout=1;
if(keyinjs>8){keycode=20+i;keyinjs=0;keyjs++;}/////按下时间足够长
}
//////////////////////////////////////////////////////////////////////////////
void led_key()
{
keyout=0;
doublekey=0;
outled(0);led0=0;delay(100);if(key0==0){doublekey++;judgekey(0);}led0=1;//20加键
outled(1);led1=0;delay(100);if(key1==0){judgekey(1);}led1=1;//21选择键
outled(2);led2=0;delay(100);if(key2==0){doublekey++;judgekey(2);}led2=1;//22减键
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -