中断方式程序
#i nclude <REG51.H>
#i nclude <ABSACC.H>
#define uchar unsigned char
#define uint unsigned int
#define ADC0809 XBYTE[0x7fff]
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
sbit P1_7=P1^7;
sbit P2_6=P2^6;
bit zd_rd;
bit flag;
uchar m;
uint X[8];
void d200us(void);
void delay(uint k);
/******************************/
void main(void)
{
TMOD=0x01;
TH0=-(1000/256);
TL0=-(1000%256);
TR0=1;
IT1=1;
IE=0x86;
while(1)
{
if(!P2_6){delay(30);if(!P2_6)flag=!flag;delay(300);}
ADC0809=m;
delay(50);
}
}
/************************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/***********************************/
void timer0(void) interrupt 1 using 1
{static uchar disbit,n;static uint cnt;
TH0=-(1000/256);
TL0=-(1000%256);
switch(disbit)
{
case 0:{P1=SEG7[n];if(flag)P1_7=1;else P1_7=0;}break;
case 1:{P1=SEG7[(X[n]*49/25)/100];P1_7=1;}break;
case 2:{P1=SEG7[(X[n]*49/25)%100/10];}break;
case 3:{P1=SEG7[(X[n]*49/25)%100%10];}break;
default:break;
}
P2=act[disbit];
disbit++;cnt++;
if(disbit>3)disbit=0;
if(!flag)
{if(cnt>500){cnt=0;n++;}}
if(n>7)n=0;
}
/******************************************************/
void zd1(void) interrupt 2 using 2
{
X[m]=ADC0809;
m++;
if(m>7)m=0;
}
延时等待方式程序的核心部分详析
#define ADC0809 XBYTE[0x7fff] //ADC0809片选地址
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f}; //0~9的数码管段码
uchar code act[4]={0xfe,0xfd,0xfb,0xf7}; //4位数码管的位选码
sbit P1_7=P1^7; //P1.7为控制小数点专用
sbit P2_6=P2^6; //P2.6为选择循环通道或固定通道的按键
bit flag; //通道号固定或循环显示的位标志flag
uint X[8]; //定义存放8通道数据的数组
/*****************************************************************/
void main(void) //主程序开始
{
uchar m; //定义局部变量m
TMOD=0x01; //定时器T0方式1
TH0=-(1000/256); //装载2ms定时初值
TL0=-(1000%256);
TR0=1; //启动T0
IE=0x82; //开T0中断,开CPU中断
while(1) //无限循环
{
ADC0809=m; //向ADC0809写入通道号
d200us(); //延时200μs待ADC0809转换完毕
X[m]=ADC0809; //从ADC0809读取采集到的数据并存入数组
m++; //指向下一个通道
if(m>7)m=0; //通道号为0~7
delay(50); //延时50ms,使眼睛看到的显示值不致于变化太快
if(!P2_6) //若按键S按下
{delay(30);if(!P2_6)flag=!flag;// 延时30ms再判,若按键S还是按下,
//说明不是干扰,标志flag取反
delay(300);} //延时300ms后退出判断按键状态
}
}
/*************************************************************/
void timer0(void) interrupt 1 using 1 //2ms定时中断服务子函数
{static uchar disbit,n;// 定义无符号字符型局部静态变量disbit,n
static uint cnt; //定义无符号整型局部静态变量cnt
TH0=-(1000/256); // 重装2ms定时初值
TL0=-(1000%256);
switch(disbit) // 根据显示位,散转进行相应的显示
{
case 0:{P1=SEG7[n];if(flag)P1_7=1;else P1_7=0;}break;
//显示通道号。若flag为1,点亮该通道号的小数点,说明该通道锁定
case 1:{P1=SEG7[(X[n]*49/25)/100];P1_7=1;}break;
//将读取的数据乘2再乘98%后查表显示百位,同时点亮小数点
case 2:{P1=SEG7[(X[n]*49/25)%100/10];}break;
//将读取的数据乘2再乘98%后查表显示十位
case 3:{P1=SEG7[(X[n]*49/25)%100%10];}break;
//将读取的数据乘2再乘98%后查表显示个位
default:break;
}
P2=act[disbit];// 位选通
disbit++;cnt++;//显示位累加,计数器累加
if(disbit>3)disbit=0;// 显示位为0~3
if(!flag) //若flag为0
{if(cnt>500){cnt=0;n++;}}
//计数器值满500(1秒)后,显示下一通道,即每个通道显示1秒
if(n>7)n=0; //显示0~7通道
}
#i nclude <REG51.H>
#i nclude <ABSACC.H>
#define uchar unsigned char
#define uint unsigned int
#define ADC0809 XBYTE[0x7fff]
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
sbit P1_7=P1^7;
sbit P2_6=P2^6;
bit flag;
uint X[8];
void d200us(void);
void delay(uint k);
/******************************/
void main(void)
{
uchar m;
TMOD=0x01;
TH0=-(1000/256);
TL0=-(1000%256);
TR0=1;
IE=0x82;
while(1)
{
ADC0809=m;
d200us();
X[m]=ADC0809;
m++;
if(m>7)m=0;
delay(50);
if(!P2_6)
{delay(30);if(!P2_6)flag=!flag;
delay(300);}
}
}
/***********************************/
void d200us(void)
{
uchar j;
for(j=0;j<20;j++);
}
/************************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/***********************************/
void timer0(void) interrupt 1 using 1
{static uchar disbit,n;
static uint cnt;
TH0=-(1000/256);
TL0=-(1000%256);
switch(disbit)
{
case 0:{P1=SEG7[n];if(flag)P1_7=1;else P1_7=0;}break;
case 1:{P1=SEG7[(X[n]*49/25)/100];P1_7=1;}break;
case 2:{P1=SEG7[(X[n]*49/25)%100/10];}break;
case 3:{P1=SEG7[(X[n]*49/25)%100%10];}break;
default:break;
}
P2=act[disbit];
disbit++;cnt++;
if(disbit>3)disbit=0;
if(!flag)
{if(cnt>500){cnt=0;n++;}}
if(n>7)n=0;
}
查询方式程序
#i nclude <REG51.H>
#i nclude <ABSACC.H>
#define uchar unsigned char
#define uint unsigned int
#define ADC0809 XBYTE[0x7fff]
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
sbit P1_7=P1^7;
sbit P2_6=P2^6;
sbit P3_3=P3^3;
bit flag;
uchar m;
uint X[8];
void d200us(void);
void delay(uint k);
/******************************/
void main(void)
{
TMOD=0x01;
TH0=-(1000/256);
TL0=-(1000%256);
TR0=1;
IE=0x82;
while(1)
{
if(!P2_6){delay(30);if(!P2_6)flag=!flag;delay(300);}
ADC0809=m;
while(!P3_3);
X[m]=ADC0809;
m++;
if(m>7)m=0;
delay(50);
}
}
/************************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/***********************************/
void timer0(void) interrupt 1 using 1
{static uchar disbit,n;static uint cnt;
TH0=-(1000/256);
TL0=-(1000%256);
switch(disbit)
{
case 0:{P1=SEG7[n];if(flag)P1_7=1;else P1_7=0;}break;
case 1:{P1=SEG7[(X[n]*49/25)/100];P1_7=1;}break;
case 2:{P1=SEG7[(X[n]*49/25)%100/10];}break;
case 3:{P1=SEG7[(X[n]*49/25)%100%10];}break;
default:break;
}
P2=act[disbit];
disbit++;cnt++;
if(disbit>3)disbit=0;
if(!flag)
{if(cnt>500){cnt=0;n++;}}
if(n>7)n=0;
}
|