8051f330_18b20temper.txt

来自「这是一个用8051F330编写的测温程序」· 文本 代码 · 共 277 行

TXT
277
字号
 
 
//-----------------------------------------------------------------------------
// UART.c
//-----------------------------------------------------------------------------
// 版权归新华龙电子有限公司所有
// 作者:Robi Ken 
// 功能:串口通讯
// 目标板: C8051F33x
// 日期: 2004.12.28
// 开发工具: Silicon Laboratories  IDE 

//-----------------------------------------------------------------------------
// 所包含的头文件
//------------------------------------------------------------------------
#include <c8051f330.h>                 
#include <stdio.h>
//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------
#define SYSCLK          24500000             // 系统工作频率
#define BAUDRATE        9600               // 串口工作波特率
#define TIMER2_RATE     1000                 // 定时器2溢出标志位频率
 
//-----------------------------------------------------------------------------
// F33x’定时器2的16位SFR
//-----------------------------------------------------------------------------
sfr16 TMR2RL   = 0xca;                 
sfr16 TMR2     = 0xcc;                 
 

sbit LED0=P0^6;
sbit LED1=P0^5;

sbit DQA=P1^0;   //定义通信端口
unsigned char  Result_hi,Result_low;
 
 
 
 
 

//--------------------------------------------------------------------------------
// 功能函数
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);

void UART0_Init (void);
void Timer2_Init (int);  
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
 
//延时函数
void DelayUs(unsigned int i)
{
     while(i--);    
}
 
void DelayMs(unsigned int n)//延时(n)MS
{
 unsigned int i;
 for(;n>0;n--)
 {
    for(i=1289;i>0;i--);
 }
 }
//初始化函数
bit Init_DSA(void)
{
  DQA = 1;    //DQA复位
  DelayUs(1);  //稍做延时
  DQA = 0;    //单片机将DQA拉低
  DelayUs(600); //精确延时 大于 480us
  DQA = 1;    //拉高总线
  DelayUs(120);
  if(DQA) return 0;
 // x=DQA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  DelayUs(240);
  DQA=1;
  return 1;
}
//读一个字节
unsigned char RCharA(void)
{
   unsigned char i=0;
   unsigned char dat = 0;
 
   for (i=8;i>0;i--)
   {
      DQA = 1;
      DelayUs(1);
      DQA = 0; // 给脉冲信号
      dat>>=1;
      DelayUs(2);
      DQA = 1; // 给脉冲信号
      if(DQA)dat|=0x80;
      DelayUs(65);
   }
   return(dat);
}
//写一个字节
void WCharA(unsigned char dat)
{
   unsigned char i=0;
    for (i=8; i>0; i--)
    {
     DQA=1;
     DelayUs(1);
     DQA = 0;
      DQA = dat&0x01;
     DelayUs(10);
     if(dat&0x01)DQA=1; 
     else DQA=0; 
     dat>>=1;
     DelayUs(65);
    }
    DQA=1;
}
//启动温度转换函数;
void StartTA(void)
{
    Init_DSA();
  WCharA(0xCC); // 跳过读序号列号的操作
 WCharA(0x44); // 启动温度转换
}
//读取温度
void ReadTA(void)
{
 Init_DSA();
  WCharA(0xCC); //跳过读序号列号的操作
  WCharA(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  Result_low=RCharA();   //读取温度值低位
  Result_hi=RCharA();   //读取温度值高位
       
}

unsigned int DispTA(void)
{  

  //voliti
  
  volatile unsigned int c=0,TA=0;
    unsigned char H=0,M=0,L=0;

    float TA_R=0; 
    TA=Result_hi*256;
    TA=TA+Result_low;

    TA_R=TA*0.0625;
TA=(unsigned int) TA_R;
return TA;
   
 
}  
 

 void main (void) {
 

   PCA0MD &= ~0x40;                    // 禁止看门狗
                                       
   PORT_Init();                        // 初始化端口I/O
   
   SYSCLK_Init ();                     //  初始化系统时钟
   
   Timer2_Init(SYSCLK/TIMER2_RATE);    //  初始化 Timer 2 
   
   UART0_Init();                       //  串口初始化

   while(1)
   {
       unsigned int wen=0; 
        unsigned   char inS[10];
      StartTA();
    DelayMs(150);
    ReadTA();
   
    
    wen=DispTA();
 // sprintf(inSeqence,"%2d key12345678910415",keyin); //若数组为5CHAR 则有10个字符;
    sprintf( inS, "%3d lichao",wen);
// printf ("time is %s\n", wen);
   //TIMER2_RATE ,控制发送的波特率。
  printf("a=%3d\n", wen);     /*结果输出十进制整数a=1234*/ 
  // printf (" KEN :) Happy new year!  \n ");                //  输出字符   
  //printf (ins[0]);
  //  printf (ins[1]);  
 //printf (" KEN :) Happy new year!   "); 
// printf (wen," KEN :) Happy new year!  ");           
 
 DelayMs(1200);
   //     sprintf( inSeqence, "%s", "I am 8th of a char Array!\n" );//正确

   
   }
  
    
 
}
  
//-----------------------------------------------------------------------------
// 端口初始化
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
//
// P0.4 - UART TX
// P0.5 - UART RX
// P3.3 - LED
void PORT_Init (void)
{
   P0SKIP  |= 0x01;                    
   P0MDIN  |= 0x01;                    // 配置P0.0为模拟出入
   P0MDOUT |= 0x10;                    // 使能 UTX 为推挽输出
 

 //  P1MDOUT |= 0x08;                    // 使能 LED 为推挽输出
 P1MDIN=0xff;
 P1MDOUT=0xff;
   XBR0    = 0x01;                     // 使能 UART on P0.4(TX) and P0.5(RX)                     
   XBR1    = 0x40;                  
   }
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------

void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                     // 配置内部振荡器的的最大频率
                                        
   RSTSRC  = 0x04;                     // 使能始终丢失检测寄存器
}
//-----------------------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------------------

void UART0_Init (void)
{
   SCON0 = 0x10;                       
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                                    
      CKCON |=  0x09;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                   
      CKCON |=  0x02;
   }
   TL1 = TH1;                          
   TMOD &= ~0xf0;                      
   TMOD |=  0x20;                       
   TR1 = 1;                            
   TI0 = 1;                            
}
//-----------------------------------------------------------------------------
// 时钟2中断
//-----------------------------------------------------------------------------
void Timer2_Init (int counts)
{
   TMR2CN = 0x00;                      // 停止时钟2;清除 TF2H 和TF2L;
                                       
   CKCON |= 0x10;                      
   TMR2RL  = -counts;                  
   TMR2    = TMR2RL;   
                
   ET2 = 0;                            
   TR2 = 1;                            
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?