新闻  |   论坛  |   博客  |   在线研讨会
八通道模拟量显示器
tvb2058 | 2007-09-16 10:19:14    阅读:2518   发布文章

 

中断方式程序

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μsADC0809转换完毕
 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;// 定义无符号字符型局部静态变量disbitn
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;
//
显示通道号。若flag1,点亮该通道号的小数点,说明该通道锁定
 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++;}}
//计数器值满5001秒)后,显示下一通道,即每个通道显示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;
}

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客