4206|7

165

帖子

2

TA的资源

纯净的硅(高级)

楼主
 

A/D转换按键4,关于上下限参数设定? [复制链接]

#include "reg51.h"
#include "intrins.h"
sbit p24=P2^4;//数码管位控制口
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit p23=P2^3;//控制灯
sbit eoc=P2^2;
sbit oe=P2^0;
sbit ale_start=P2^1;//A/D转换口
sbit p10=P1^0;//键控制按键抠
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit sda=P1^6;  //数据线
sbit scl=P1^5;  //时钟线
sbit p17=P1^7;//控制蜂鸣器
bit b0=1;//控制数码管的亮熄
bit b1=1;
bit b2=1;
bit b3=1;
bit a0=0;//数码管闪烁控制位
bit a1=0;
bit a2=0;
bit a3=0;
bit s=0;//小数点控制位
unsigned char led0=0;
unsigned char led1=0;
unsigned char led2=0;
unsigned char led3=0;//数码管初始态
unsigned char led4=0xff;//灯的初状态全灭
unsigned char j=0;//控制转换通道时间
unsigned char k=0;//按键次数记(录设置()
unsigned int bc[50][4];//保存修改数值
unsigned char adz[8];//a/d转化数值
unsigned char dd[16];//下限温度
unsigned char gg[16];//上限温度
unsigned int add=0;//显示通道下标
unsigned char code x[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1
,0x86,0x8e};
void fun()//数码管延时
{
unsigned char i;
for(i=0;i<50;i++)
;
}
/*数码管动态显示*/
void xs()//显示程序
{   
    if(s)
P0=x[led0];
else
P0=x[led0]&0x7f;
if(b3)
p24=0;
fun();
p24=1;

   
P0=x[led1];
if(b2)
p25=0;
fun();
p25=1;

P0=x[led2];
if(b1)
p26=0;
fun();
p26=1;

P0=x[led3];
if(b0)
p27=0;
fun();
p27=1;
P0=led4;
p23=0;
fun();
p23=1;
   
}
/*I2C存储器*/
/* void flash()     //时序延时
{
  unsigned char i;
  for(i=0;i<50;i++){ _nop_ ();  }
  

}
void start()     //24c02启动子程序
{
scl=1;   //时钟高
sda=1;  //
flash();
sda=0;   //1--0
flash();
scl=0;   //
flash();
}
void stop()   //
{
scl=1;  //时钟高
sda=0;
flash() ;
sda=1;    //0--1
flash();

}
void empty()   //主应答信号,非
{
sda=1;
scl=1;     //时钟高
flash() ;
scl=0;     //时钟低
sda=0;
flash() ;
}

void writex(unsigned char j)  //写字节函数,芯片应答检测
{
   unsigned char i,temp;
   temp=j;
   for (i=0;i<8;i++){
                    if ((temp&0x80)!=0){sda=1;}//判最高位数据,1
      
                    else { sda=0;}  //0
                     flash();
      scl=1;flash();scl=0;  // 时钟
         flash();
      temp=temp<<1; //  数据左移1位
                     }
   sda=1;                             //置为输入口
   scl=1;                             //时钟高
   while((sda==1)&&(i<255)){i++;}    //等芯片输出低并延时
   scl=0;                            //时钟低
   sda=0;                            //为启动做准备
   
}
unsigned char readx()                 //读字节函数
{
   unsigned char i,j,k=0;
   sda=1;                    //置为输入口
   for (i=0;i<8;i++){
                    scl=1;            //时钟高
                    if (sda==1) j=1;  //读
                    else j=0;
                    k=(k<<1)|j;      //取数据
     flash();
                    scl=0;           //时钟低
                     flash();
                    }
      return(k);                   //返回测量值  
}
unsigned char x24c02_read(unsigned char address)//读单字节函数
{
unsigned char i;
start();                    //启动
writex(0xa0);               //写器件地址,写
writex(address);            //写芯片地址
start();                   //启动
writex(0xa1);              //写器件地址,读
i=readx();                 // 读数据
empty();                   //应答,主应答
stop();                    //停止
return(i);                  //返回
}
void x24c02_write(unsigned char address,unsigned char info1,unsigned
char info2)//根据保存数据多少可添加相应地址
{  
start();                    //启动
writex(0xa0);              //写器件地址,写
writex(address);           //写芯片地址
writex(info1);            //数据
writex(info2);            //数据

   stop();//停止
}*/
/*数码管计时,控制*/
void inetop1() interrupt 3//T1控制数码管闪
{   
TH1=0X3C;//0.1s
TL1=0XB0;
p17=1;//关蜂鸣器
k++;
if(k==5)
{k=0;
if(a0)  b0=!b0;//闪的控制
if(a1)  b1=!b1;
if(a2) b2=!b2;
if(a3) b3=!b3;

  //x24c02_write(0x00,d,e);//向存储器写保存数据
  }
}
void inetop() interrupt 1//T2控制时间
{   
TH0=0X3C;//0.1S,重装初值
TL0=0XB0;
p17=1;
j++;//记录定时次数
if(j==20)//0.5s
{j=0;
add++ ;
if(add==8)
{add==0;}
}
}
/*按键操作*/
void key() interrupt 0//键盘函数
{   
p10=1;p11=1;p12=1;p13=1;
  if(p10==0)
  {
  p17=0;//单独闪烁控制
  a0=1;
  a2=1;
  TR0=!TR0;//计时开始,停止
  TR1=!TR1;//数码管闪烁启动,停止
  if(TR0==0)
  {s=0;
  }
  
  
}
    //停止,开始
     
  if(p11==0)
  {//加1
  p17=0;   
  if(a0){ led3++;
      if(led3==10) led3=0;
     }
  if(a1){ led2++;
      if(led2==10) led2=0;
     }
  if(a2){ led1++;
      if(led1==10) led1=0;
     }   
     
  if(a3){ led0++;
      if(led0==8) led0=0;
      
     }   
}
  if(p12==0)
  {//移位
         
  if(a0){ a0=0;a1=1;b0=1;
      
     }
  else if(a1){ a1=0;a2=1;b1=1;
     }
  else if(a2){ a2=0;a3=1;b2=1;
     }   
     
  else{ a3=0;a0=1;b3=1;
     }   
     
     
  

  }
/*下面部分操作上下限温度设置,CASE操作修改怎么写?*/
  if(p13==0)
{

k++;//记录次数
switch(k)
{//奇数上限,偶数下限
case 1: P0=0xfd;   
                ;break;
case 2:P0=0xbf;
               ; break;
case 3: P0=0xfd;   
               ; break;
case 4:P0=0xbf;
                ;break;
case 5:P0=0xfd;
                ;break;         
case 6:P0=0xbf;
                ;break;
case 7:P0=0xfd;
                ;break;
case 8:P0=0xbf;
                ;break;      
case 9:P0=0xfd;
               ; break;
case 10:P0=0xbf;
                ;break;
case 11:P0=0xfd;
                ;break;
case 12:P0=0xbf;
                ;break;
case 13:P0=0xfd;
                break;
case 14:P0=0xbf;
                ;break;         
case 15:P0=0xfd;
                ;break;
case 16:P0=0xbf;
                ;break;
    default :  k=0;
       }

if(k==0)
{ if(a0)//保存
     { a0=0;
      b0=1;
     a1=0;
     b1=1;
     }
  else if(a2)
     { a2=0;
     b2=1;
    a3=0;
    b3=1;
    }
        b0=1;b1=1;b2=1;b3=1;//数码管全亮
}

}
}  

void ad()
{

eoc=1;//
oe=0;//
ale_start=0;//
P0=add;
ale_start=1;//
_nop_();
_nop_();
ale_start=0;//
_nop_ ();   
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//10US
while(eoc==0);
oe=1;
P0=0xff;
adz[add]=P0;
oe=0;
_nop_();

led3=adz[add]%10;
led1=adz[add]/100;
led2=(adz[add])%10;
led0=add;
if(add==8)
{add=0;}
/*比较温度,操作灯相应显示*/
if(adz[add] {
P0=0X7F;
}
if(adz[add])>g[2*add+1])//高于上限温度
{
P0=0XFE;
}
else//正常显示温度
   {
   P0=0XA5;
   }

}
void main()
{
   TMOD=0X11;//方式1控制
TH0=0X3c;//赋初值T0,控制数码管计时
TL0=0Xb0;
    TH1=0X3c;//赋初值T1,控制数码管闪烁
TL1=0Xb0;
ET0=1;
TR0=1;//启动T0,控制时间
EX0=1;//开允许位T0
    ET1=1;//开允许位T
TR1=0;//启动T1,控制数码管闪
EX1=1;//开允许位T1
IT0=1;//选择触发方式
    EA=1;//开总中断
oe=0;
    //e=x24c02_read(0x01);//读保存数据HOUR
// d=x24c02_read(0x00);//读保存数据MIN*/
for(;;)
{
xs();
ad();
}

}
此帖出自单片机论坛

最新回复

下了看看啊!学习学习啊!  详情 回复 发表于 2009-7-19 17:25
点赞 关注
 

回复
举报

2498

帖子

0

TA的资源

至上芯片

沙发
 

回复 楼主 15075039ZQ 的帖子

看得懂,不知道到底要问什么啦?
此帖出自单片机论坛
 
个人签名我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步!
口头禅:生活在于创造机会,把握机会!
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

板凳
 
按键4,p13,修改A/D转换通道8通道每个通道上下限数值
此帖出自单片机论坛
 
 
 

回复

38

帖子

0

TA的资源

纯净的硅(中级)

4
 
注意:灯的显示是在显示程序中完成的,你不能直接在按键程序中通过P0口输出。
你只需要改变led4的内容即可。
如:led4=led4&0X7f; //点亮最高位灯,其它灯不受影响
    led4=led4|0X7f; //熄灭最高位灯,其它灯不受影响
用类似的方法修改要控制的灯。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

5
 
谢谢老师,明白了。
此帖出自单片机论坛
 
 
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

6
 
老师,这是我在上面的程序上修改的,用dd【8】【2】,数组保存的温度上下限,dd【add】【0】保存上限,dd【add】【1】保存下限,用
if(adz[add] {//控制某一灯亮

}

if(adz[add]>dd[add][0])
{//控制某一灯亮

}
else
{//灯按正常显示
}

运行时出现数据部分过大,不知道什么原因?

ad转换.rar

2.03 KB, 下载次数: 3

此帖出自单片机论坛
 
 
 

回复

154

帖子

0

TA的资源

纯净的硅(高级)

7
 
要看你的程序具体运行的现象,现在不知是什么数据过大?
上课时可以直接问徐老师。
此帖出自单片机论坛
 
 
 

回复

375

帖子

0

TA的资源

五彩晶圆(高级)

8
 

下了看看啊!学习学习啊!

下了看看啊!学习学习啊!
此帖出自单片机论坛
 
个人签名我可以做的更好
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表