?? 1.txt
字號:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Key_add 0x01;
#define Key_subb 0x02;
#define Key_switch 0x03;
#define time1 1200
//******************************管腳定義***************************************
sbit ADSCLK=P1^4; // 驅(qū)動時鐘位
sbit ADCS=P1^5; //片選信號位
sbit ADDOUT=P1^6; //串行數(shù)據(jù)位
sbit DADIN=P1^0; //數(shù)據(jù)輸入線
sbit DACLR=P1^1; //清零位
sbit DASCLK=P1^2; //時鐘線
sbit DACS=P1^3; //片選位
sbit LED1=P2^7; //4位LED位選
sbit LED2=P2^6;
sbit LED3=P2^5;
sbit LED4=P2^4;
sbit K1=P2^0; //按鍵1,2,3
sbit K2=P2^1;
sbit K3=P2^2;
sbit L_mod_set=P3^4; //顯示模式1,2指示燈
sbit L_mod_test=P3^5;
sbit L_step1=P3^3; //步進量指示燈
sbit L_step10=P3^6;
sbit L_step100=P3^7;
//*****************************************************************************
unsigned char code dis[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x7f};
//預(yù)置LED段碼
unsigned char code dis2[12]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0x7f};
//預(yù)置LED段碼,帶小數(shù)點
uchar KEY;
uint DAout,DA_step,ADin;
uint sys_time,dis_time;
uint ADC(); //AD轉(zhuǎn)換子程序
void DAC(uint datas); //DA轉(zhuǎn)換子程序
void key_scan(); //按鍵子程序
void t2_int() interrupt 5 using 1 //定時器2中斷服務(wù)程序
{
static uint dis_buf;
static uchar c;
TF2=0;
sys_time++;
c++;c=c%4; //4位LED顯示
switch (c)
{
case 0:
LED4=1;
P0=dis[dis_buf/1000];LED1=0;
break;
case 1:
LED1=1;
P0=dis[(dis_buf%1000)/100];LED2=0;
break;
case 2:
LED2=1;
P0=dis[(dis_buf%100)/10];LED3=0;
break;
case 3:
LED3=1;
P0=dis[dis_buf%10];LED4=0;
break;
}
if (sys_time%8==0)key_scan(); //整20ms則進行按鍵掃描
dis_time++;
if (dis_time%2400>=time1) //每隔3秒切換顯示內(nèi)容
{dis_buf=DAout>>1;L_mod_test=1;L_mod_set=0;}
else
{
dis_buf=ADin>>1;L_mod_test=0;L_mod_set=1;
if (sys_time%200==0)
ADin=ADC(); //每0.5秒進行一次AD轉(zhuǎn)換
}
}
void init()
{
TH2=0xF6;
TL2=0x3c;
RCAP2H=0xf6;
RCAP2L=0x3c;
SCON=0x50;
TMOD=0x21;
TH1=254;
TL1=254;
TR2=1;TR1=1;
IE=0xa0;
DA_step=20;L_step10=0;
L_mod_set=0;dis_time=time1;
}
void main()
{
init();
DAC(0);
while (1)
{
switch (KEY) //按鍵服務(wù)
{
case 1: //按下了“+”鍵則DA輸出增加
dis_time=time1;
KEY=0;DAout=DAout+DA_step;
if(DAout>4095)DAout=4095;
DAC(DAout);
break;
case 2: //按下了“-”鍵則DA輸出減小
dis_time=time1;
KEY=0;DAout=DAout-DA_step;
if(DAout>4095)DAout=0;
DAC(DAout);
break;
case 3: //按下了“步進量切換”鍵則改變每次按下“+”、“-”鍵時的步進電流
KEY=0;
if (DA_step==2){DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
else if (DA_step==20){DA_step=200;L_step1=1;L_step10=1;L_step100=0;}
else if (DA_step==200){DA_step=2;L_step1=0;L_step10=1;L_step100=1;}
else {DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
break;
}
}
}
void key_scan()
{
static uint t;
static bit k11,k12,k21,k22,k31,k32; //檢測是否有按鍵動作(即引腳發(fā)生負跳變)
static bit kd1,kd2,kd3;
k11=!K1;k21=!K2;k31=!K3;
k12^=k11;k12&=k11;
k22^=k21;k22&=k21;
k32^=k31;k32&=k31;
if (k12){KEY=1;kd1=1;kd2=0;kd3=0;t=0;} //有則返回相應(yīng)鍵值
else if(k22){KEY=2;kd1=0;kd2=1;kd3=0;t=0;}
else if(k32){KEY=3;kd1=0;kd2=0;kd3=1;t=0;}
if(kd1) //檢測是否有鍵長按不放,有則
{kd1=k11;t++;if((t%15==0)&&t>50)KEY=1;} //每0.3秒返回一次相應(yīng)鍵值
if(kd2)
{kd2=k21;t++;if((t%15==0)&&t>50)KEY=2;}
k12=k11;k22=k21;k32=k31;
}
void DAC(uint datas)
{
unsigned char i,dh,dl;
if (datas>4095)datas=4096; //當(dāng)輸出量大于DA的最大輸出電壓時,DA輸出
dl=datas%256; //最大電壓
dh=datas/256;
dh=dh<<4;
DASCLK=0;
DACS=0;
for (i=0;i<4;i++)
{
if ((dh&0x80)==0)
DADIN=0;
else
DADIN=1;
dh=dh<<1;
DASCLK=1;DASCLK=0;
}
for (i=0;i<8;i++)
{
if ((dl&0x80)==0)
DADIN=0;
else
DADIN=1;
dl=dl<<1;
DASCLK=1;DASCLK=0;
}
DACS=1;
}
uint ADC() using 1 //因為該子程序是被中斷程序調(diào)用的,所以必須與中斷服務(wù)程序//用同一個寄存器區(qū)
{
unsigned char i;
uint ADdata=0;
ADSCLK=0;
ADCS=0;
while(ADDOUT!=1);
for(i=0;i<11;i++) //讀入12位數(shù)據(jù)
{
ADSCLK=1;
ADSCLK=0;
ADdata=ADdata|ADDOUT;
ADdata=ADdata<<1;
}
ADSCLK=1;
ADSCLK=0;
ADdata=ADdata|ADDOUT;
ADSCLK=1;
ADSCLK=0;
ADCS=1;
return(ADdata);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -