⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_disp.c

📁 MCU51-JZ01单片机开发板实验例程
💻 C
📖 第 1 页 / 共 2 页
字号:

/*******************************************************************************
*  标题:  DS18B20温度检测程序            
*  文件:  key_disp.C                                                              
*  日期:  2006-12-6                                                             
*  版本:  1.0                                                                                                              

********************************************************************************
*  描述: 温度采样时间间隔为442ms;                                              *
*        按S6键显示第一通道温度值;按S14键显示第二通道温度值                   *
*        按S5键轮流显示第一通道和第二通道的温度值;按S13键清除显示             *
*******************************************************************************/
#include "reg51.h"  
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
//**************************** 函数声明 ******************************
void long_delay(void);                       // 延时50us
void short_delay(void);                      // 延时8us
void delay1ms(unsigned int);                 // 延时10MS
void write7279(unsigned char, unsigned char);// 写入到HD7279
unsigned char read7279(unsigned char);       // 从HD7279读出
void send_byte(unsigned char);               // 发送一个字节
unsigned char receive_byte(void);            // 接受一个字节
unsigned char key_read();                    // 读键码
void  key_serve(void);                       // 键盘服务程序

void ini_uart(void);
void UartSent(uchar);

void tmp1 (void);
void tm1reset (void);
bit tmp1read (void);
unsigned char tmp1read2 (void);
void tmp1write (unsigned char);
void tmp1change(void);
unsigned char ReadRom1();

void tmp2 (void);
void tm2reset (void);
bit tmp2read (void);
unsigned char tmp2read2 (void);
void tmp2write (unsigned char);
void tmp2change(void);
void tmp2 (void);
unsigned char ReadRom2(void);

//************************* 变量及I/O口定义 **************************
sbit clk = P2^4;                             // clk连接于P2.4
sbit dat = P2^3;                             // dat连接于P2.3
sbit key = P2^2;                             // key连接于P2.2

sbit DQ1 = P1^1;
sbit DQ2 = P1^6;

uchar key_number;
uchar key_6;
uchar key_14;
uchar key_5;
uchar data Family_Code;

uchar Offset;
uchar Templ;									// 温度值的变量;
uchar bdata Temph;
sbit flag = Temph^7;                         	// 结果为负和正的标志位。
//**************************  HD7279A指令  ****************************
#define CMD_RESET 0xa4                       // 复位指令
#define CMD_TEST 0xbf                        // 测试指令
#define DECODE0 0x80                         // 下载数据且按方式0译码
#define DECODE1 0xc8                         // 下载数据且按方式1译码
#define CMD_READ 0x15                        // 读键盘数据指令
#define UNDECODE 0x90                        // 下载数据但不译码
#define RTL_CYCLE 0xa3                       // 循环左移指令
#define RTR_CYCLE 0xa2                       // 循环右移指令
#define RTL_UNCYL 0xa1                       // 左移指令
#define RTR_UNCYL 0xa0                       // 右移指令
#define ACTCTL 0x98                          // 消隐控制
#define SEGON 0xe0                           // 段点亮指令
#define SEGOFF 0xc0                          // 段关闭指令
#define BLINKCTL 0x88                        // 闪烁控制

//***************************** main **********************************
void main(void)
{
 
    ini_uart();
    P0 = 0;
    delay1ms(20);                            //上电延时20ms
    send_byte(CMD_RESET);                    //清除显示   
    while (1)                     
    {
       
         if(!key) 
         {
              key_read();
              key_serve(); 
         }                 
    }
         
}
//************************** 子程序 **********************************
void write7279(unsigned char cmd, unsigned char dta)
{
     send_byte (cmd);
     send_byte (dta);
}
unsigned char read7279(unsigned char command)
{
     send_byte(command);
     return(receive_byte());
}
//========================= 单字节发送程序 ============================
void send_byte( unsigned char out_byte)
{
     unsigned int i;
     long_delay();                             // 延时50us
     for (i=0;i<8;i++)
     {
          if (out_byte&0x80)
          {
              dat = 1;                         // dat输出置"1"
          }
          else
          {
              dat = 0;                         // dat输出置"0"
          }    
          clk = 1;                             // clk输出置"1"
          short_delay();
          clk = 0;                             // clk输出置"0"
          short_delay();
          out_byte<<=1;                        // 逻辑左移1位,右侧补0
     }
     dat = 0;                                  // dat输出置"0"
}

//========================== 单字节接收程序 ===========================
unsigned char receive_byte(void)
{
     unsigned char in_byte;
     unsigned char i;
     dat = 1;                                  // 设为输入状态
     long_delay();
     for (i=0;i<8;i++)
     {
          clk = 1;                             // clk输出置"1"
          short_delay();
          in_byte<<=1;                         // 逻辑左移1位,右侧补0
          
          
          if (dat)                             // 读dat输入,若为"1"
          {
               in_byte=in_byte|0x01;
          }
          
          clk = 0;                             // clk输出置"0"
          short_delay();
     }
     dat = 0;                                  // 设置dat输出"0";
     return (in_byte);
}

//============================ 延时94us ===============================
void long_delay(void)          
{
     unsigned char i;
     for (i=0;i<0x0A;i++);
}

//============================ 延时25us ================================
void short_delay(void)
{
     unsigned char i;      
     for (i=0;i<2;i++); 
}              

// **************************** n*1ms *********************************
void delay1ms(unsigned int time)
{
     unsigned int i;
     unsigned int j;

     for (i=0;i<time;i++)
     {
          for(j=0;j<0xC0;j++);       
     }
}
    
unsigned char key_read()                       //读键码子程序
{
      
      if (!key)                                // 如果有健按下,则为"0"
      {
           key_number=read7279(CMD_READ);      // 读键码            
           while (!key);                       // 等待按键松开           
      }           
      return(key_number);                      //返回键码值
}

void  key_serve(void)                          //键盘服务子程序
{   
            
    switch (key_number)
    {
	   uchar Temp;
       case 6:
            // 第一个通道输入 
            key_6 = 1;
            key_14 = 0;
            key_5 = 0;
            while(key_6)
            {
                 if(ReadRom1() == 0x28)                 // 检测DS18B20存在
                 {	             
                     UartSent(0x28);                    // 发送DS18B20家族码
		             tmp1change();						// 开始温度转换
	        	     delay1ms(250);						// 读取延时
		             tmp1();							// 读取温度
				     Temp = ((Temph&0x0F)<<4)|((Templ&0xF0)>>4);

                     UartSent(Temp/10);                  // 把接收到的十位上的数据发送到串口 
                     UartSent(Temp%10);                  // 把接收到的个位上的数据发送到串口
                     UartSent(Offset);                   // 把接收到的数据发送到串口 

                     write7279(DECODE1+1,Temp/10);// 在第2位显示键码高8位
                     write7279(DECODE1,Temp%10);  // 在第1位显示键码低8位
                 }
                 else 
  		         {
                      write7279(DECODE1+1,0x0F);         // 在第2位显示键码高8位
                      write7279(DECODE1,0x0F);           // 在第1位显示键码低8位
			     }
                 if (!key)  break;
            }

            break;     
                            
       case 14:  
            // 第二个通道输入
            key_6 = 0;
            key_14 = 1;
            key_5 = 0;
            while(key_14)
	        {
                 if(ReadRom2() == 0x28)                  // 检测DS18B20存在
                 {	             
                      UartSent(0x29);                      // 发送DS18B20家族码
		              tmp2change();						 // 开始温度转换
	                  delay1ms(250);					 // 读取延时
		              tmp2();						     // 读取温度
			          Temp = ((Temph&0x0F)<<4)|((Templ&0xF0)>>4);

                      UartSent(Temp/10);                  // 把接收到的十位上的数据发送到串口 
                      UartSent(Temp%10);                  // 把接收到的个位上的数据发送到串口
                      UartSent(Offset);                   // 把接收到的数据发送到串口 

                      write7279(DECODE1+1,Temp/10);      // 在第2位显示键码高8位
                      write7279(DECODE1,Temp%10);        // 在第1位显示键码低8位
                 }
                 else                                    // 检测DS18B20不存在,显示0xFF
  	    	     {
                      write7279(DECODE1+1,0x0F);         // 在第2位显示键码高8位
                      write7279(DECODE1,0x0F);           // 在第1位显示键码低8位
	             }
  		         if (!key)  break;
            }                   
 
            break;                      
            
       case 5:
            key_6 = 0;
            key_14 = 0;
            key_5 = 1; 
            while(key_5)
            {
                 // 第一个通道输入
                 if(ReadRom1() == 0x28)                  // 检测DS18B20存在
                 {	             
                     UartSent(0x28);                     // 发送DS18B20家族码
		             tmp1change();						 // 开始温度转换
	        	     delay1ms(250);						 // 读取延时

⌨️ 快捷键说明

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