打印

求教:利用51单片机制作的数字温度计

[复制链接]
2431|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小之海|  楼主 | 2007-3-28 19:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了个数字温度计,有如下问题:
1.5单片机的ALE能否直接作为AD0809的时钟,
2.下边程序是否正确,能否给程序补充作些注释
谢谢
#include <reg51.h> 

#define uchar unsigned char 

#define uint unsigned int

uchar code dispbitcode[]={0xfe,0xfd,0xfb,0xf7};/*LED位选*/

uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x00,0x40};/*0,1,2------9,正(不显),负*/

uchar dispbuf[]={0,0,0,10,10,10,10,10}; 

uchar dispcount=0;

uchar getdata=0;//数据暂存

unsigned long temp=0;

uchar i;

bit sflag=0;  /*正负标志*/

sbit ST=P3^0;//AD启动信号,当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平

sbit OE=P3^1;//OE为输出允许信号

sbit EOC=P3^2;//EOC为转换结束信号

sbit LED=P3^4;/*当温度超过10度且低于30度时LED亮*/

 void main(void)

{

  LED=1;

  ST=0;//AD初始化,ST,OE是低电平
 
  OE=0;
  
  TMOD=0x10;//计数器1 模式1

  TH1=(65536-4000)/256;        /*T1工作于方式1下。每4mS采集一次数据,

且刷新一次LED*/
  
TL1=(65536-4000)%256;

  TR1=1;//计数器1开启
    
  ET1=1;//允许计数器1中断
 
  EA=1;//开总中断

  ST=1;

  ST=0;//开始AD转化

while(1)
  {    

  ;

   }

 }

 void t1(void) interrupt 3 using 0
 
 {

  TH1=(65536-4000)/256;

  TL1=(65536-4000)%256;
    
  if(EOC==1)    /*转换完毕,显示*/
  
  {

    OE=1; 

   getdata=P0;//保存数据

OE=0;

temp=getdata;


temp+=168;//不知道为什么要加168

if(temp<273.2)//判断符号

 temp=273.2-temp;//华氏转化为摄氏?

      sflag=1;
 }
if(temp>=273.2)
{
     temp=temp-273.2;

  sflag=0;
        }      

if(sflag==0)//温度大于0,最高位不显示,否则显示负号  
 dispbuf[3]=10;
 else 
  dispbuf[3]=11;

if(sflag==0 && temp>=10 && temp<=30)    /*温度大于10小于30灯亮*/
     
 LED=0;
else 
    LED=1;
    

temp*=10;//

i=0; 

while(temp/10) /*分位显示*/
{    
  dispbuf=temp%10;

  temp=temp/10;

  i++;

 }

dispbuf=temp;

ST=1;

ST=0;  

P1=dispcode[dispbuf][dispcount]]; //

P2=dispbitcode[dispcount];

if(dispcount==1)/*加小数点*/
    

  P1=P1 | 0x80;
 }
if(dispcount==2 && P1==dispcode[0]) /*测量温度是一位数,取掉十位的0*/
{
  P1=dispcode[10];
 }

dispcount++;

if(dispcount==4)//第5个led显示结束

dispcount=0;
}
 }    

相关帖子

沙发
uc301| | 2007-3-28 22:11 | 只看该作者

实践是检验真理的唯一标准

楼主何不把程序烧到芯片去试试呢?

使用特权

评论回复
板凳
ayb_ice| | 2007-3-29 07:46 | 只看该作者

随便说说

  一个LM75搞定所有的东东...

使用特权

评论回复
地板
dai_weis| | 2007-3-30 23:28 | 只看该作者

如果是学习,那么还有用

ALE分不分频要看你的MCU的时钟频率,要求ALE频率要低于0809的最大时钟频率
还不好用,你直接写到片子里看看就知道了,
还有现在并行的ADC0809已经很少用了,可以考虑选用常用的器件,大部分接口是IIC/SPI之类。

使用特权

评论回复
5
NE5532| | 2007-3-31 17:24 | 只看该作者

你以为21IC是免费调试工具?

使用特权

评论回复
6
mohanwei| | 2007-3-31 17:58 | 只看该作者

5楼幽默。看样子楼主是搜索到了一份代码,想让大家调调

然后顺手帮打上一些注释,最后他就可以直接交差了^_^

使用特权

评论回复
7
qjy_dali| | 2007-3-31 18:51 | 只看该作者

ADC0809太老了

使用特权

评论回复
8
小之海|  楼主 | 2007-4-1 14:46 | 只看该作者

回5,6楼的兄弟

感谢两位兄弟的关注,要说明的是做这个东西并不是用来交差的。本人初学单片机,把代码贴出来的意思只是想交流学习一下。

使用特权

评论回复
9
ayb_ice| | 2007-4-2 08:03 | 只看该作者

随便说说

  你从一开始就学习已经过时的东东...
  与时俱进...

使用特权

评论回复
10
tom_xu| | 2007-5-23 16:08 | 只看该作者

也不能全怪搂主

现在的电子专业教科书中还在教老掉牙ADC0809的,学校里的老师不知道现在大多数单片机都自己带AD模块吗?

使用特权

评论回复
11
conwh| | 2007-5-23 16:10 | 只看该作者

用2052AD好了,一片搞定

使用特权

评论回复
12
古道热肠| | 2007-5-23 16:36 | 只看该作者

做温度计用DS18B20b很方便的

使用特权

评论回复
13
wang21| | 2007-5-23 18:26 | 只看该作者

随便说

最好不要把程序贴上来,有几个大虾愿意去为你分析你的程序,自己多动脑吧

使用特权

评论回复
14
winhiwang| | 2007-5-23 19:58 | 只看该作者

这个方案太老了,学生实验还可以,做产品卖不出去的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝