huazi 发表于 2008-4-22 13:19:22

proteus仿真MCS-51的一百个例子

这是我们学校图书馆找到的,另外请高手帮个忙。怎样去修改下面这个程序既能测温又能测湿度?最好给个仿真图
这是例子:点击此处下载 ourdev_258709.rar(文件大小:2.73M) (原文件名:MCS-51 examples.rar)

//*********************************************       C程序    *****************************************************************************//
//*MCU:          AT89C51                        //
//*MCU-crystal:12M                               //
//*Version:      01                              //
//*Last Updata:2008-4-22                        //
//*Author:                                 //
//*Description:                                    //
//DS18B20的读写程序,数据脚P3.4                     //
//温度传感器汇编程序,采用器件默认的12位转化   //
//最大转化时间750微秒,显示温度-55到+125度,显示精度 //
//为0.1度,显示采用4位LED共阳显示测温值            //
//P1口为段码输入,P0~P3为位选                     //
//***************WAVE-E6000/T**********************//
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define DisdataP1         // 段码入口
sbit DQ=P3^4;               // 温度输入口
uint temp;                  // variable of temperature定义一个变量
uchar flag1;                // 定义一个标志,标志温度是负还是正,1为负,0为正
sbit DIN=P1^7;            // 小数点控制
#definediscanP3         //扫描口
uchar h;                  // 定义变量
//位选位定义
sbit DEC=P3^0;            // 小数
sbit POS=P3^1;            // 个位
sbit TEN=P3^2;            // 十位
sbit HUN=P3^3;            // 百位,符号位

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳数码管段码表         "0""1""2""3""4""5""6""7""8""9" "灭""-"
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码
//共阳数码管带小数点段码表    "0""1""2""3""4""5""6""7""8""9"
uchar data temp_data={0x00,0x00};//读出温度暂放
uchar data Dis_play={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
uchar code ditab={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数部分对应十进制   "0""1""2""3""4""5""6""7""8""9""A""B""C""D""E""F"
uchar code scan_con={0xfe,0xfd,0xfb,0xf7};    //列扫描控制字
/***************************************/
/*      延时子程序                   */
/***************************************/
void delay(uint i)      //delay   
   {
      while(i--);
   }
/************************************************/
/*          初始化ds18b2子函数*               */
/************************************************/
Init_DS18B20(void)
{
   uchar x=0;
   DQ = 1;               //DQ复位
   delay(8);             //稍做延时
   DQ = 0;               //单片机将DQ拉低
   delay(80);            //精确延时 大于 480us
   DQ = 1;               //拉高总线
   delay(14);
   x=DQ;               //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
   delay(20);
}

/*************************************************/
/*            读字节子函数                     */
/*************************************************/
ReadOneChar(void)
{
   uchar i = 0;
   uchar dat = 0;
   for (i=8;i>0;i--)
    {
      DQ = 0;            // 给脉冲信号
      dat>>=1;             // 数据右移一位
      DQ = 1;            // 给脉冲信号
      if(DQ)               // DQ为1
      dat|=0x80;          // 读出数据
      delay(4);            // 延时
   }
   return(dat);
}
/*************************************************/
/*               写字节子函数                  */
/*************************************************/
WriteOneChar(unsigned char dat)
{
    uchar i = 0;
    for (i=8; i>0; i--)
   {
       DQ = 0;
       DQ = dat&0x01;   //写入一位数据
       delay(5);
       DQ = 1;
       dat>>=1;      //右移一位数据
   }
}
/*************************************************/
/*         DS18B20写命令函数                   */
/*************************************************/
/*void tmpwritebyte(uchar dat)   // write a byte to ds18b20
{                              // 给温度传感器写一个字节
    uint i;
    uchar j;
    bit testb;
    for(j=1;j<=8;j++)
   {
      testb=dat&0x01;
      dat=dat>>1;
      if(testb)   //写入 1
          {
             DQ=0;
             i++;i++;
             DQ=1;
             i=8;while(i>0)i--; // 适当延时
          }
      else          //写入 0
          {
             DQ=0;      
             i=8;while(i>0)i--; // 适当延时
             DQ=1;
             i++;i++;
          }
      }
}*/
/******************************************/
/*         发送温度转换命令               */
/******************************************/
void tmpchange(void)          // DS18B20 begin change   
{
Init_DS18B20();             // 初始化DS18B20
delay(200);               // 延时
WriteOneChar(0xcc);         // 跳过序列号命令
WriteOneChar(0x44);         // 发送温度转换命令
}
/******************************************/
/*            读出温度函数                */
/******************************************/
uint tmp()                  //get the temperature
{
//float tt;
Init_DS18B20();             // 初始化ds18b2子函数
delay(1);
WriteOneChar(0xcc);         // 跳过ROM命令
WriteOneChar(0xbe);         // 发送读取数据命令
temp_data=ReadOneChar(); // 连续读两个字节数据
temp_data=ReadOneChar();
temp=temp_data;
temp<<=8;                                             
temp=temp|temp_data;   // 两字节合成一个整型变量。
//tt=temp*0.0625;         // 得到真实十进制温度值,因为DS18B20
                              // 可以精确到0.0625度,所以读回数据的最低位代表的是
                              // 0.0625度。
//temp=tt*10+0.5;         // 放大十倍,这样做的目的将小数点后第一位
                              // 也转换为可显示数字,同时进行一个四舍五入操作。
return temp;                // 返回温度值
}
/******************************************/
/*      读出序列号函数                  */
/******************************************/
/*void readrom()            // read the serial 读取温度传感器的序列号
{                           // 本程序中没有用到此函数
uchar sn1,sn2;
Init_DS18B20();             // DS18B20初始化
delay(1);
WriteOneChar(0x33);         // Read ROM
sn1=ReadOneChar();          // 8位系列编码
sn2=ReadOneChar();          // 8位CRC码
}*/
/******************************************/
/*       温度数据显示处理函数             */
/******************************************/
void tem_deal(uint tem)
{
/*************温度数据处理*****************/
   if(tem>6348)                     // 温度值正负判断
   {tem=65536-tem;flag1=1;}         // 负温度求补码,标志位置1
      Dis_play=tem&0x0f;         // 取小数部分的值
   Dis_play=ditab]; // 存入小数部分显示值
      Dis_play=tem>>4;             // 取中间八位,即整数部分的值
   Dis_play=Dis_play/100;    // 取百位数据暂存
   Dis_play=Dis_play%100;    // 取后两位数据暂存
   Dis_play=Dis_play/10;   // 取十位数据暂存
   Dis_play=Dis_play%10;   // 取个位数据暂存
   if(!Dis_play)       // 最高位为0都不显示
   {
      Dis_play=0x0a;   // 先判断百位是否为0
    if(!Dis_play)
   {
   Dis_play=0x0a; // 再判断十位是否为0
   }
   }
   if(flag1)
   {
      Dis_play=0x0b;    // 为负数时,最高位显示 "-"
   }
}
/******************温度数据显示********************/

void display()
{
char k;
   for(k=0;k<4;k++)                     //4位LED扫描控制
{
   Disdata=table];          //数据显示
   if (k==1){DIN=0;}                   //小数点显示
   discan=scan_con;               //位选
   delay(90);                        //延时
   discan=0xff;
}
}
/******************************************/
/*               主函数                   */
/******************************************/
void main()
{
Disdata=0xff;   //端口初始化
P3=0xff;
//开机显示"888.8";这段程序可以不要.
    for(h=0; h<4; h++)
   {
          Dis_play=8;
   }
    for(h=0; h<50; h++)
   {      
       display();//显示数据
          delay(1000); //延时
   }
//温度显示
   do
   {
   tmpchange();      //温度转换
   tem_deal(tmp());//显示温度值
   display();
   }
   while(1);
}

qxs5264 发表于 2008-4-22 19:34:44

非常好,谢谢楼主,收下了!

abcdezh 发表于 2008-4-23 12:15:26

谢谢了,收藏。。。。。

zzxxllaa 发表于 2008-4-23 23:06:53

谢谢楼主!!!

dory 发表于 2008-4-26 08:15:11

谢谢楼主!!! 收藏。。。。。

mfkxls 发表于 2008-4-30 09:28:54

是不错,而且还是免费的!谢谢楼主分享!

armok 发表于 2008-4-30 09:42:33

谢谢楼主的资料。Cool.

vxfxv 发表于 2008-4-30 16:38:26

是不错,而且还是免费的!谢谢楼主分享!

LinuxFox 发表于 2008-5-2 11:07:41

谢谢楼主的共享

angelgirl 发表于 2008-5-6 20:47:50

谢谢了哦

st01lsp_zsu 发表于 2008-5-6 21:28:51

谢谢楼主提供!

ruilong821 发表于 2008-5-9 20:50:40

请教:uchar code ditab={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
   //小数部分对应十进制   "0""1""2""3""4""5""6""7""8""9""A""B""C""D""E""F"

小数部分是如何对应十进制 ?????如:0x02 --- 3
谁会谁解释....

zhoukai861128 发表于 2008-5-12 12:37:07

谢谢啊!

yibin818 发表于 2008-5-12 12:50:29

顶一下

eiandy 发表于 2008-5-18 17:26:01

顶一个!

weiqiye 发表于 2008-5-25 13:57:05

谢谢啦!!!

gooddu 发表于 2008-5-25 22:19:07

顶死算了,这个太好了,此时我无法用语言表达谢意

fsj5098 发表于 2008-6-4 11:40:16

非常好,谢谢楼主,收下了!

wuwu20 发表于 2008-7-15 17:58:47

谢谢咯

wei_bo 发表于 2008-7-16 09:31:06

记号

cnzi 发表于 2008-7-29 14:36:25

下了~谢谢

cnzi 发表于 2008-7-29 14:55:47

怎么是.exe格式的?不会是病毒吧?!

cnzi 发表于 2008-8-2 00:43:25

用迅雷下载到了,用快车下载总是下载到.EXE文件

cnzi 发表于 2008-8-2 00:43:47

谢谢了

wfbaaa 发表于 2008-8-5 09:34:31

好东东,谢谢分享!!

kai3008 发表于 2008-8-7 23:10:32

多谢了啦!

luospring 发表于 2008-8-13 09:14:53

应该不错了,呵呵,谢谢

wfbaaa 发表于 2008-9-5 11:45:18

非常好,谢谢楼主

xu2006 发表于 2008-9-17 21:34:36

多谢楼主

mwwyi 发表于 2008-9-17 22:48:23

很不错的东西,谢谢分享!

angguohui 发表于 2008-9-26 09:12:43

谢谢!

zook0k 发表于 2008-9-26 17:29:31

Thank&nbsp;you!!!

suxilin 发表于 2008-10-9 13:05:56

好~~

xjhhjx 发表于 2008-10-10 12:08:10

非常谢谢!
全体同仁向你致敬

Npng 发表于 2008-10-18 12:27:50

不顶起就太对不住楼主了
呵呵呵~~~~~~~~~

planet007 发表于 2008-11-9 00:44:19

下来学习,多谢啦

mrzwx 发表于 2008-12-1 16:33:30

是不错,而且还是免费的!谢谢楼主分享!&nbsp;

taicy 发表于 2008-12-7 02:57:29

谢谢楼主分享!

yxyaf 发表于 2009-1-3 20:42:40

下来学习,谢谢了

zlq999 发表于 2009-1-5 15:15:18

感谢,收藏了&nbsp;,找了好久!

finenesszhang 发表于 2009-1-10 15:59:03

感谢

lw_zhang 发表于 2009-1-13 11:08:48

谢谢分享!!

zkhzkh 发表于 2009-1-17 14:57:29

谢谢好东东

dalian 发表于 2009-1-17 21:00:21

谢谢楼主的共享

yangwc 发表于 2009-1-18 10:46:00

谢谢

pidaneng 发表于 2009-11-8 01:31:01

谢谢楼主的资料

goldriver 发表于 2009-11-21 20:27:09

谢谢

kele2009 发表于 2009-12-10 18:25:13

make

yangyang168 发表于 2009-12-11 09:22:01

谢谢。能否弄个电路图?

mouan1981 发表于 2009-12-23 10:41:49

为什么我下载下来了,用我的仿真软件打不开呢?

zhangzheyuanxp 发表于 2009-12-28 21:18:44

3Q

yongshi 发表于 2009-12-29 08:11:07

谢谢了

cinlong 发表于 2009-12-29 19:36:06

楼主好人!

msq-tc 发表于 2010-1-22 16:18:12

谢谢 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

safan 发表于 2010-4-22 15:51:58

谢谢!

yming 发表于 2010-4-29 08:29:17

太感谢了!

jadejoyang 发表于 2010-5-6 09:37:35

顶,谢谢楼主

qwerty-99 发表于 2010-5-6 14:30:49

谢谢楼主的无私奉献!

aaw0817 发表于 2010-5-22 15:47:30

不错

zhanglongtumi 发表于 2010-6-7 14:18:16

谢谢了

mengmi 发表于 2010-6-24 14:29:06

谢谢分享!

naoshi 发表于 2010-6-29 21:15:38

还没回答楼主问题呢

tusondz 发表于 2010-7-1 20:31:12

顶 顶 顶 顶 顶

xxdwww 发表于 2010-7-6 00:43:46

谢谢楼主的分享。

xklwjyq 发表于 2010-7-8 12:39:49

很感谢非常 的很感谢 呵呵~~~

luolj 发表于 2010-7-27 15:00:19

好。实例很好。

ZacharyGuo 发表于 2010-10-8 16:55:20

MARK,回家后下载

lixupeng 发表于 2011-3-21 19:13:54

mark!!!!!!!!

jadeyang 发表于 2011-3-27 15:34:59

mark

spark123 发表于 2011-8-3 21:06:12

mark!!

mzbhy 发表于 2011-8-3 21:50:09

果断码住!

tengteng_mcu 发表于 2011-8-3 22:13:28

谢谢楼主

xooogo 发表于 2011-8-4 23:06:26

谢谢楼主

tianfan 发表于 2011-8-5 10:06:40

很好的资料,

cixizq 发表于 2011-8-13 09:33:47

谢谢LZ分享。

我也去测试一下~~

ap0405209 发表于 2011-11-23 16:56:45

是不错,而且还是免费的!谢谢楼主分享!

xxdwww 发表于 2011-11-27 21:02:49

是<<单片机C语言程序设计实训100例--基于8051+Proteus仿真>>这本书上的吗?

xrydt 发表于 2012-1-13 15:53:31

谢谢LZ分享。
cool。
顶起。
页: [1]
查看完整版本: proteus仿真MCS-51的一百个例子