[疑难问答] 做了个小程序,大家看看存在什么问题不?

[复制链接]
5930|35
 楼主| suoma 发表于 2010-4-7 21:33 | 显示全部楼层 |阅读模式
/*   温度巡检程序                  */

/*   目标器件:AT89C51            */

/*   晶振:3MHZ                  */

/*   编译环境:Keil C51            */



/****包含头文件*************************

#include<reg51.h>

#include<absacc.h>


/******共阴数码管段码表***其中0X02代表“-**************

unsigned char code Tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X02};



/***************定义三个全局变量*************************

signed char tempL=-50;             //温度下限值

signed char tempH=150;             //温度上限值

signed char temperature=0;         //测量温度值


sbit BUZZER=P1^0;                                   //定义蜂鸣器的IO口为P1.0


sbit s2=p2^6;

sbit s3=p2^7;


sbit LED1=P2^3;

sbit LED2=P2^4;

sbit LED2=P2^5;





/*****按键消抖延时***********************

void delay()

{

unsigned int i;



for(i=0;i<300;i++)

}


/*****数码管LED显示延时******************

void LEDdelay()

{

unsigned int i;



for(i=0;i<60000;i++)

}

 楼主| suoma 发表于 2010-4-7 21:33 | 显示全部楼层
/**********数码管LED显示程序*************

void display(signed int k)
{
int i=k-64;                //AD的输出是0X00时对应的温度是-50°C
if i>0
   {
   LED1=0;                 //开LED1
   P0=tab[i/100];          //显示百位数字
   LEDdelay();
   LED1=1;                 //关LED1

   LED2=0;
   P0=tab[i%100/10];       //显示十位数字
   LEDdelay();
   LED2=1;

   LED3=0;
   P0=tab[i%10];            //显示个位数字
   LEDdelay();
   LED3=1;
   }
else
  {
   LED1=0;                 //开LED1
   P0=tab[10];             //显示“-”号
  
   LED2=0;
   P0=tab[ (-i)/10];       //显示十位数字
   LEDdelay();
   LED2=1;

   LED3=0;
   P0=tab[(-i)%10];            //显示个位数字
   LEDdelay();
   LED3=1;
   
  }

}


/****************蜂鸣器报警程序******************


void sound(void)
(
BUZZER=0;   /*蜂鸣器响
delay();
BUZZER=1;   /*蜂鸣器关

)


/*****************AD转换程序**********************

void ADconver()  
{
  int i;

   for(i=0xf8;i<=0xff;i++)
    {
      p2=i;
      WR=0;
      delay();
    }
}




/****************中断响应程序*********************

/*****外中断0的中断服务子程序********
void inter 0 (void) interrupt 0 using 1
{
RD=0;
temperature=P1;
display(temperature);

}                              //转换完毕ALE给出中断信号




/******外中断1的中断服务子程序********
void inter 1 (void) interrupt 2 using 2
{
if(S2==1)
   if(S2==0)
    {
     P0=tempL;
     tempL++;
     P0=tempL;
     delay();
    }
if(S3==1)
   if(S3==0)
    {
     P0=tempH;
     tempH++;
     P0=tempH;
     delay();
    }
}

/****************主程序*********************
void main()
{


  P0=0xff;
  P1=0xff;
  P2=0xff;         //初始化IO端口

  PX1=1;           //外中断1为高优先级中断;即使温度报警值的设定中断高于AD转换中断
  EA=1;            //CPU开放中断
  IT0=1;IT1=1;     //使INT0,INT1为边沿触发
  EX0=1;EX1;       //允许中断   

while(1)
   
  ADconver();

}
 楼主| suoma 发表于 2010-4-7 21:38 | 显示全部楼层
原理图顺便也发上来,大家看看哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
David_ming 发表于 2010-4-8 10:39 | 显示全部楼层
看样子应该不是做产品
god_like 发表于 2010-4-8 12:29 | 显示全部楼层
好东西,收下了
huamunv 发表于 2010-4-8 14:31 | 显示全部楼层
4# David_ming
怎么说?
huamunv 发表于 2010-4-8 14:32 | 显示全部楼层
什么时候报警啊?
Karlshen 发表于 2010-4-8 14:38 | 显示全部楼层
主程序什么时候跳出来?
loveelectric 发表于 2010-4-8 14:56 | 显示全部楼层
sbit LED1=P2^3;



sbit LED2=P2^4;



sbit LED2=P2^5;


LED2定义了两次
David_ming 发表于 2010-4-8 15:07 | 显示全部楼层
9# loveelectric

对,编译会出错
xukong 发表于 2010-4-8 20:59 | 显示全部楼层
在LED演示程序中for语句没有执行语句,至少得加一个空语句吧
xukong 发表于 2010-4-8 21:01 | 显示全部楼层
好像延时程序都在for循环里面都没加空语句。
在现实程序里面,if语句的参数没有 加()
xukong 发表于 2010-4-8 21:04 | 显示全部楼层
AD转换程序好像也有问题,你的参数传递存在问题。
易达口香糖 发表于 2010-4-8 21:10 | 显示全部楼层
你自己试试不就行了
xiaomifan 发表于 2010-4-8 22:35 | 显示全部楼层
我见到书上有这么用for 语句的啊,在语句里面执行下判断,然后自加
David_ming 发表于 2010-4-9 09:09 | 显示全部楼层
这里两个按键短路啦~到INT串俩二极管

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
David_ming 发表于 2010-4-9 09:11 | 显示全部楼层
共阳的才对

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
David_ming 发表于 2010-4-9 09:14 | 显示全部楼层
你的喇叭和数码管不冲突吗

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
David_ming 发表于 2010-4-9 09:16 | 显示全部楼层
还有你的AD,内部自带的不比你这样接法精度低,外挂这样接的AD,有点使我无语
David_ming 发表于 2010-4-9 09:17 | 显示全部楼层
以上种种,所以我才说不是做产品
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

714

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部