最新日志

发表于:2007-11-27 13:57:38
评论(0) | 阅读(690)
发表于:2007-11-14 9:38:10
标签:无标签

3

贴一个本人原创数字温湿度传感器SHT71的驱动程序

单片机:AVR  的ATMEGA128L

温湿度传感器是SHT71,测量结果用串口发送出来

程序如下:

#include <iom128.h>
#include <macros.h>
#include "sensor.h"

#pragma interrupt_handler USART_RX_interrupt:19  //串口0接收中断

unsigned char MCU_receive_byte(void);
void Sent_command(unsigned char command);
void MCU_receive_word(void);
void Port_ini(void);
void SHT_ACK();
void SHT_end(void);
void SHT_ini(void);
void SHT_reset(void);
void SHT_start();
void SHT_measurement(unsigned char measure);
void USART_RX_interrupt(void);
void USART_TX(unsigned char data);
void USART_ini(void);
void WDT_ini(void);

//
//------------------------------
//
//  主函数
//  
//------------------------------
// 
void main(void)
{   
  unsigned int i;
 
  //WDT_ini();
  CLI();
    
  Port_ini();
  SHT_ini();
  USART_ini();

  SEI();

  //---for test----
  USART_TX(0xaa);

  //---------------
  for(;;)
  { 
     //WDR();    //看门狗清零
       SHT_measurement(TEMPERATURE);
  for(i=0;i<65535;i++)
  {
  }
  }
 
}

//
//------------------------------
//
//  串口0单字节发送
//
//------------------------------
//

void USART_TX(unsigned char data)
{
  while(!(UCSR0A&(1<<UDRE0)))
 {
 }
    UDR0 = data;
}

//
//------------------------------
//
//  串口初始化
//
//------------------------------
//
void USART_ini(void)
{
    UBRR0H = 0x00;
 UBRR0L = 0xCF;       //波特率2400
 UCSR0C = 0x06;      //异步模式,无奇偶校验,一个停止位,8位数据
 UCSR0B = 0x80|(1<<RXEN0)|(1<<TXEN0);       //发送、接收使能
}

//
//------------------------------
//
//  SHT71启动信号
//
//------------------------------
//
void SHT_start()

  DDRD = DDRD|0x03; //?????
  PORTD =  CLK_L ;
  PORTD = DATA_H;
     NOP();
  NOP();
  PORTD =  CLK_H;
  NOP();
  NOP();
  PORTD = DATA_L;
  NOP();
  NOP();
  PORTD =  CLK_L;
  NOP();
  NOP();
  PORTD =  CLK_H;
  NOP();
  NOP();
  PORTD = DATA_H;
  NOP();
  NOP();
  PORTD =  CLK_L;
}
//
//------------------------------
//
//  SHT71 控制命令发送
//  command = 0x03---温度
//     0x05---湿度
//
//------------------------------
// 
void Sent_command(unsigned char command)
{
 unsigned char model = 0x80;
 unsigned char i;  
 
 DDRD = DDRD|0x03;                    //输出
 //PORTD =  CLK_L;
 for(i=0;i<7;i++)          
 {
  PORTD =  CLK_L;
  if((command & model) == 0)
  {
   PORTD = DATA_L;
  }
  else
  {
   PORTD = DATA_H;
  }
   
  PORTD =  CLK_H;
  //NOP();
  model = model>>1;
  //PORTD =  CLK_L;
   
 }
 
 PORTD = CLK_L;
 
 if((command & model) == 0)
 {
  PORTD = DATA_L;
 }
 else
 {
  PORTD = DATA_H;
 }
 
 //PORTD = DATA_L;
 // NOP();
 PORTD =  CLK_H;
 DDRD = DDRD&0xFD;
 NOP();
 PORTD = CLK_L;  
 
 while((PIND&0x02)==0x02)
 {
 }
   //PORTD = 0x55;
 PORTD =  CLK_H;
 NOP();
 PORTD =  CLK_L;
 NOP(); 

//
//------------------------------
//
//  SHT71 等待应答信号
//
//------------------------------
// 
void SHT_ACK()

 //PORTA = ~(0xFF);
 while((PIND&0x02)==0x02)
 {
 }
 //PORTA = 0x55;
}
//
//------------------------------
//
//  SHT71 接收一个字节
//  
//------------------------------
// 
unsigned char MCU_receive_byte(void)

 unsigned char i;
 unsigned char model = 0x00;
 unsigned char temp;
      
 PORTD =  CLK_L;
 NOP();
 for(i=0;i<8;i++)
 {
  PORTD =  CLK_H;
  //PORTD =  CLK_L;
  if((PIND & 0x02)==0)
  {
   temp = 0;
  }
  else
  {
   temp = 1;
  }
  
  model = model|(temp<<(7-i));
  
  PORTD =  CLK_L;
  }

  DDRD = DDRD|0x02;  //单片机输出ACK
  //PORTD =  CLK_L;

  PORTD = DATA_L;    //
  NOP();
  PORTD =  CLK_H;
  DDRD = DDRD&0xFD;  //单片机输入
  PORTD =  CLK_L;
  return model;
}
//
//------------------------------
//
//  SHT71 接收结果
//  
//------------------------------
// 
void MCU_receive_word(void)
{
      unsigned char temp;
   temp = MCU_receive_byte();
   USART_TX(temp);
   temp = MCU_receive_byte();
   USART_TX(temp);
}
//
//------------------------------
//
//  SHT71 启动一次测量
//  
//------------------------------
// 
void SHT_measurement(unsigned char measure)
{
   //DDRD = DDRD|0x03; //?????
  SHT_start();
  Sent_command(measure);
  SHT_ACK();
  MCU_receive_word();
  SHT_end();
}
//
//------------------------------
//
//  SHT71 结束一次测量
//  
//------------------------------
// 
void SHT_end(void)
{
   PORTD =  CLK_L;
  PORTD = DATA_H;
}
//
//------------------------------
//
//  SHT71 复位
//  
//------------------------------
// 
void SHT_reset(void)
{
 unsigned char i;
 
 //DDRD = DDRD|0x03;
 
 PORTD = DATA_H;
 PORTD = CLK_L;
 
 for (i=0;i<20 ;i++ )
 {
  PORTD =  CLK_H;
  NOP();
  PORTD =  CLK_L;
 }

}
//
//------------------------------
//
//  看门狗初始化
//  
//------------------------------
// 
void WDT_ini(void)
{
 WDTCR = 0x0f;
}
//
//------------------------------
//
//  SHT71初始化
//  
//------------------------------
// 
void SHT_ini(void)

 unsigned int i;
 SHT_reset();
 for(i=0;i<65535;i++)
 {
 }
}
//
//------------------------------
//
//  端口初始化
//  
//------------------------------
// 
void Port_ini(void)
{
 DDRA = 0xFF;
 DDRC = 0xFF;
 DDRD = DDRD|0x03; //?????
}
//
//------------------------------
//
//  串口接收中断初始化
//  
//------------------------------
// 
void USART_RX_interrupt(void)
{
    unsigned char i;
   
 i= UDR0;

}

 

头文件:

#ifndef __SENSOR_H
#define __SENSOR_H

#define  CLK_H   PORTD|0x01     
#define  CLK_L   PORTD&0xFE 
#define  DATA_H   PORTD|0x02
#define  DATA_L   PORTD&0xFD
#define  TEMPERATURE 0x03
#define  HUMINITY  0x05


#endif

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(4) | 阅读(1133)
发表于:2007-11-9 8:09:34
标签:无标签

2

贴一个本人原创的图形点阵LCD驱动程序

说明:

单片机是华邦的78E516B,液晶屏是T6963控制器的240×128点阵的,单片机总线方式访问。基本功能见各个函数的说明:

#include "W78E516.h"
#include
#include
#include "LCD.h"
//#include "matrix.h"
//#include "main.h"

//------------------------------------------------------------
//  函数:  无参数指令写入函数
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void LcdWriteCommand_withZero(unsigned char Command)
{
 //Check_CDRW();
 n_NOP();
 LCD_COMMAND = Command;
}

//------------------------------------------------------------
//  函数:  1参数指令写入函数
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void LcdWriteCommand_withOne(unsigned char Par_data,unsigned char Command)
{
 //Check_CDRW();
 n_NOP();
 LCD_DATA = Par_data;
 //Check_CDRW();
 n_NOP();
 LCD_COMMAND = Command;
}

//------------------------------------------------------------
//  函数:  2参数指令写入函数
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void LcdWriteCommand_withTwo(unsigned char Par_data1,unsigned char Par_data2,unsigned char Command)
{
 //Check_CDRW();
 n_NOP();
 LCD_DATA = Par_data1;
 //Check_CDRW();
 n_NOP();
 LCD_DATA = Par_data2;
 //Check_CDRW();
 n_NOP();
 LCD_COMMAND = Command;
}

//------------------------------------------------------------
//  函数:  检测LCD状态
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------

//状态位ST1,ST0 判断函数,读写指令和读写数据
void Check_CDRW(void)
{
 while((LCD_COMMAND & 0x03) != 0x03)
 {
 }
}

//状态位ST2,ST3 判断函数数据自动写
void CheckAutoW(void)
{
 while((LCD_COMMAND & 0x08) != 0x08)
 {
 }
}

//状态位ST5 判断控制器可用
void Check_ERROR(void)
{
 while((LCD_COMMAND & 0x20) != 0x20)
 {
 }
}

//------------------------------------------------------------
//  函数:  单数据写入函数
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void LcdWriteData(unsigned char Par_data)
{
 //Check_CDRW();
 n_NOP();
 LCD_DATA = Par_data;
}

//------------------------------------------------------------
//  函数:  LCD初始化函数
//  入口参数:
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void Lcd_Init(void)
{
  LcdWriteCommand_withTwo(0x00,0x00,0x40);  //设置文本显示区首地址
     LcdWriteCommand_withTwo(0x1f,0x00,0x41);  //设置文本显示区宽度
     LcdWriteCommand_withTwo(0x00,0x08,0x42);  //设置图形显示区首地址0x0800
     LcdWriteCommand_withTwo(0x1f,0x00,0x43);  //设置图形显示区宽度
     LcdWriteCommand_withZero(0xA0);    //设置光标形状 8x8方块
     LcdWriteCommand_withZero(0x80);    //显示方式设置 文本and图形(异或)
     LcdWriteCommand_withZero(0x98);    //显示开关设置 文本关,图形开,光标闪烁关
}

//------------------------------------------------------------
//  函数:  设定显示RAM地址函数
//  入口参数: X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-128)
//  返回值 :
//  函数说明: 指定在液晶的什么位置进行操作
//------------------------------------------------------------
void LocateXY(unsigned char x,unsigned char y,unsigned char mode)
{
     unsigned int temp;
     temp = 0x1f*y + x;
     if(mode)       //mode=1为Graphic
     {         //如果图形模式要加上图形区首地址0x0800
           temp += 0x0800;
     }
     LcdWriteCommand_withTwo(temp&0xff,temp/256,0x24);
}
//------------------------------------------------------------
//  函数:  显示一个ASCII码函数
//  入口参数: X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-128)
//  返回值 :
//  函数说明: (8X8,液晶内部字符集)
//     Char_table参照数据手册,液晶内部字符表
//------------------------------------------------------------

void DisplayASCII(unsigned char x,unsigned char y,unsigned char Char_table)
{
     LocateXY(x,y,TXT_Mode);
     LcdWriteCommand_withOne(Char_table,0xC4);
}

//------------------------------------------------------------
//  函数:  指定位置显示一个中文字符(16×16)
//  入口参数: *WrodTable指向待写入汉字的字模数组
//     X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-16)
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void DisplayChineseWord(unsigned char *WrodTable,unsigned X,
      unsigned char Y,unsigned char Background)
{
 unsigned char j;

 for(j=0;j<16;j++)      //每个循环写两个字节数据(一行上的)
 {
  LocateXY(X,Y*8+j,Graphic_Mode); //指定待写位置
  LcdWriteCommand_withZero(0xb0);  //进入自动写,地址自动加1

  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[2*j]);
  }
  else
  {
   LcdWriteData(WrodTable[2*j]);
  }


  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[2*j+1]);
  }
  else
  {
   LcdWriteData(WrodTable[2*j+1]);
  }
  LcdWriteCommand_withZero(0xB2);  //退出自动写
 }
}

//------------------------------------------------------------
//  函数:  指定位置显示一个英文字符(16×8)
//  入口参数: *WrodTable指向待写入汉字的字模数组
//     X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-16)
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void DisplayEnglishWord(unsigned char *WrodTable,unsigned X,unsigned char Y,unsigned char Background)
{
 unsigned char i="0",j;

 for(j=0;j<16;j++)      //每个循环写一个字节数据
 {
  LocateXY(X,Y*8+j,Graphic_Mode);  //指定待写位置
  LcdWriteCommand_withZero(0xb0);  //进入自动写,地址自动加1

  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[j]);
  }
  else
  {
   LcdWriteData(WrodTable[j]);
  }
  //i += 1;
  LcdWriteCommand_withZero(0xB2);    //退出自动写
 }
}

//------------------------------------------------------------
//  函数:  指定位置显示一个英文字符(8×8)
//  入口参数: *WrodTable指向待写入汉字的字模数组
//     X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-16)
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void DisplayRrow(unsigned char *WrodTable,unsigned X,unsigned char Y,unsigned char Background)
{
 unsigned char j;

 for(j=0;j<8;j++)      //每个循环写一个字节数据
 {
  LocateXY(X,Y*8+j,Graphic_Mode);  //指定待写位置
  //LcdWriteCommand_withZero(0xb0);  //进入自动写,地址自动加1

  //CheckAutoW();
  //n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[j]);
  }
  else
  {
   LcdWriteData(WrodTable[j]);
  }
  //i += 1;
  //LcdWriteCommand_withZero(0xb2);   //退出自动写
  n_NOP();
  LcdWriteCommand_withOne(WrodTable[j],0xc4);
 }
}

//------------------------------------------------------------
//  函数:  LCD屏填充函数
//  入口参数: Fill_char填充的数
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void Lcd_Fill(unsigned char X_start,unsigned char X_end,
     unsigned char Y_start,unsigned char Y_end,
     unsigned char Fill_char)
{ unsigned char i,j;
 for (i=0;i<=(Y_end-Y_start+1)*8;i++)
 {
  LocateXY(X_start,Y_start*8+i,Graphic_Mode);  //指定待写位置
  LcdWriteCommand_withZero(0xb0);      //进入自动写,地址自动加1
  for (j=0;j<=(X_end-X_start+1);j++)
  {
   //CheckAutoW();
   n_NOP();
   LcdWriteData(Fill_char);
  }
  LcdWriteCommand_withZero(0xB2);      //退出自动写
 }
}

//------------------------------------------------------------
//  函数:  指定位置显示一个中文字符(12×12)
//  入口参数: *WrodTable指向待写入汉字的字模数组
//     X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-16)
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void DisplayChineseWord12(unsigned char *WrodTable,unsigned X,
      unsigned char Y,unsigned char Background)
{
 unsigned char j;

 for(j=0;j<12;j++)      //每个循环写两个字节数据(一行上的)
 {
  LocateXY(X,Y*8+j,Graphic_Mode);  //指定待写位置
  LcdWriteCommand_withZero(0xb0);  //进入自动写,地址自动加1

  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[2*j]);
  }
  else
  {
   LcdWriteData(WrodTable[2*j]);
  }


  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[2*j+1]);
  }
  else
  {
   LcdWriteData(WrodTable[2*j+1]);
  }
  LcdWriteCommand_withZero(0xB2);  //退出自动写
 }
}
//------------------------------------------------------------
//  函数:  指定位置显示一个英文字符(12×6)
//  入口参数: *WrodTable指向待写入汉字的字模数组
//     X横坐标-对应第几列(0-30),Y纵坐标-对应第几行(0-16)
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void DisplayEnglishWord12(unsigned char *WrodTable,unsigned X,
      unsigned char Y,unsigned char Background)
{
 unsigned char j;

 for(j=0;j<12;j++)      //每个循环写1个字节数据(一行上的)
 {
  LocateXY(X,Y*8+j,Graphic_Mode);  //指定待写位置
  //LcdWriteCommand_withZero(0xb0);  //进入自动写,地址自动加1

  //CheckAutoW();
  n_NOP();
  if(Background)
  {
   LcdWriteData(~WrodTable[j]);
  }
  else
  {
   LcdWriteData(WrodTable[j]);
  }
  //LcdWriteCommand_withZero(0xB2);  //退出自动写
  n_NOP();
  LcdWriteCommand_withOne(WrodTable[j],0xc4);
 }
}

//------------------------------------------------------------
//  函数:  延时子函数
//  入口参数: 延时常数
//  返回值 : 无
//  函数说明: 软件延时,不要求精确
//------------------------------------------------------------
void Delay(unsigned char m)
{
 unsigned char  i;
 unsigned char  j;

 for( i = 0; i < m; i++)
 {
  for( j = 0; j < 200; j++)
  {

  }
 }
}
//---------短延时------------------
void n_NOP(void)
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}

//------------------------------------------------------------
//  函数:  LCD画水平的直线
//  入口参数: Fill_char填充的数
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void Lcd_Line_H(unsigned X_start,unsigned X_end,unsigned Y,unsigned char fill_char)
{
 unsigned char j;
 //for (i=X_start;i //{
  LocateXY(X_start,Y*8,Graphic_Mode);
  LcdWriteCommand_withZero(0xb0);      //进入自动写,地址自动加1
  for (j=0;j<=(X_end-X_start+1);j++)
  {
   //CheckAutoW();
   n_NOP();
   LcdWriteData(fill_char);
  }
  LcdWriteCommand_withZero(0xB2);      //退出自动
 //}
}
//------------------------------------------------------------
//  函数:  LCD画垂直的直线
//  入口参数: Fill_char填充的数
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void Lcd_Line_L(unsigned X,unsigned Y_start,unsigned Y_end,unsigned char fill_char)
{
 unsigned char i;
 for (i=Y_start;i {
  LocateXY(X,i,Graphic_Mode);
  LcdWriteCommand_withOne(fill_char,0xc4);

 }
}
//------------------------------------------------------------
//  函数:  LCD画任意两点间的直线
//  入口参数: 
//  返回值 :
//  函数说明:
//------------------------------------------------------------
void Lcd_Line(unsigned char X_start,unsigned Y_start,unsigned char X_end,unsigned char Y_end)
{
 unsigned char temp,temp_data,addr;
 unsigned char i,j,m;

 if ((Y_end - Y_start)>=(X_end - X_start)*8)
 {
  temp = (Y_end - Y_start)/((X_end - X_start)*8);
  temp_data = 0x80;
  addr = X_start;
  for (i=Y_start;i  {
   for (j=0;j   {
    LocateXY(addr,i,Graphic_Mode);
    n_NOP();
    LcdWriteCommand_withOne(temp_data,0xc4);
    i += 1;
   }
   if (temp_data == 0x01)
   {
    addr += 1;
    temp_data = 0x80;
   }
   else
   {
    temp_data >>= 1;
   }
  }
 }
 else
 {
  temp_data = 0x80;
  temp = ((X_end - X_start)*8)/(Y_end - Y_start);
  for (i=1;i  {
   temp_data |= temp_data>>1;
  }
  addr = Y_start;
  for (i=X_start;i  {
   for (j=0;j   {
    LocateXY(i,addr,Graphic_Mode);
    n_NOP();
    LcdWriteCommand_withOne(temp_data,0xc4);
    addr += 1;
    if (temp_data < (0xff>>(8-temp)))
    {
     temp_data=0x80;
     for (m=1;m     {
      temp_data |= temp_data>>1;
     }
     i = i+1;
    }
    else
    {
     temp_data >>= temp ;
    }
   }
  }
 }
}


LCD的头文件:

#ifndef __LCD_H__
#define __LCD_H__
//
//  240×128 ,T6963
//
//Register Set  
#define Cursor_pointer  0x21 //00100001 X address  Y address  Cursor pointer set  
#define Off_register  0x22 //00100010 Data   00H    Off register      
#define Address_pointer  0x24 //00100100 Low address  High address Address pointer set
                                    
//Control Word set
#define Text_home_addr  0x40 //01000000 Low address  High address Text home address set   
#define Text_area   0x41 //01000001  Columns      00H    Text area set           
#define Graphic_home_addr 0x42 //01000010  Low address  High address Graphic home address set
#define Graphic_area  0x43 //01000011  Columns      00H    Graphic area set        
                                               
//Mode set
#define Or_mode    0x80 //1000x000 -    -    "OR" mode               
#define Exor_mode   0x81 //1000x001  -      -      "EXOR" mode             
#define And_mode   0x83 //1000x011  -      -      "AND" mode              
#define Text_attr_mode  0x84 //1000x100  -      -      "Text attribute" mode   
#define In_CGROM_mode  0x80 //10000xxx  -      -      Internal CGROM mode     
#define Ex_CGROM_mode  0X88 //10001xxx  -      -      External CGRAM mode     

//Display Mode                                         
#define Display_off   0x90 //10010000 - - Display off          
#define CursorOn_BlinkOff 0x92 //1001xx10 -  -  Cursor on, blink off 
#define CursorOn_BlinkOn 0x93 //1001xx11 -  -  Cursor on, blink on  
#define TextOn_GraphicOff 0x94 //100101xx -  -  Text on, graphic off 
#define TextOff_GraphicOn 0x98 //100110xx -  -  Text off, graphic on 
#define TextOn_GraphicOn 0x9c //100111xx -  -  Text on, graphic on  

//Cursor Pattern Select
#define Line_1_cursor  0xa0 //10100000 - - 1 line cursor
#define Line_2_cursor  0xa1 //10100001 -  - 2 line cursor
#define Line_3_cursor  0xa2 //10100010 -  - 3 line cursor
#define Line_4_cursor  0xa3 //10100011 -  - 4 line cursor
#define Line_5_cursor  0xa4 //10100100 -  - 5 line cursor
#define Line_6_cursor  0xa5 //10100101 -  - 6 line cursor
#define Line_7_cursor  0xa6 //10100110 - - 7 line cursor
#define Line_8_cursor  0xa7 //10100111 -  - 8 line cursor

//Data auto Read/write
#define Data_auto_write  0xb0 //10110000 - -  Data auto write set    
#define Data_auto_read  0xb1 //10110001 -  -  Data auto read set     
#define Auto_reset   0xb2 //10110010 -  -  Auto reset             
   
//Data read Write 
#define DW_ADP_I   0xc0 //11000000 Data - Data write and ADP increment    
#define DR_ADP_I   0xc1 //11000001 -     -  Data read and ADP increment     
#define DW_ADP_D   0xc2 //11000010 Data  -  Data write and ADP decrement    
#define DR_ADP_D   0xc3 //11000011 -     -  Data read and ADP decrement     
#define DW_ADP_N   0xc4 //11000100 Data  -  Data write and ADP no variable  
#define DR_ADP_N   0xc5 //11000101 -  - Data read and ADP no variable   

//Screen peek
#define Screen_peek   0xe0 //11100000 - - Screen peek
//Screen copy 
#define Screen_copy   0xe8 //11101000 - - Screen copy

#define Bit_reset   0xf0 //11110XX  - - Bit reset  
#define Bit_set    0xf8 //11111XXX  -  - Bit set    
#define Bit_0    0xf0 //1111X000  -  - Bit 0( LSB )
#define Bit_1    0xf1 //1111X001  -  - Bit 1      
#define Bit_2    0xf2 //1111X010  -  - Bit 2      
#define Bit_3    0xf3 //1111X011  -  - Bit 3      
#define Bit_4    0xf4 //1111X100  - - Bit 4      
#define Bit_5    0xf5 //1111X101  -  - Bit 5      
#define Bit_6    0xf6 //1111X110  - - Bit 6      
#define Bit_7    0xf7 //1111X111  - - Bit 7( MSB )

 

#define LCD_DATA XBYTE[0X8000]    
#define LCD_COMMAND XBYTE[0X8001]

#define TXT_Mode   0
#define Graphic_Mode  1

void CheckAutoW(void);
void n_NOP(void);
void LcdWriteCommand_withZero(unsigned char Command);
void LcdWriteCommand_withOne(unsigned char Par_data,unsigned char Command);
void LcdWriteCommand_withTwo(unsigned char Par_data1,unsigned char Par_data2,unsigned char Command);
void LcdWriteData(unsigned char Par_data);
void Lcd_Init(void);
void Check_CDRW(void);
void LocateXY(unsigned char x,unsigned char y,unsigned char mode);
void DisplayASCII(unsigned char x,unsigned char y,unsigned char Char_table);
void DisplayChineseWord(unsigned char *WrodTable,unsigned Y,unsigned char X,unsigned char Background);
void DisplayChineseWord12(unsigned char *WrodTable,unsigned X,unsigned char Y,unsigned char Background);
void DisplayEnglishWord(unsigned char *WrodTable,unsigned Y,unsigned char X,unsigned char Background);
void DisplayRrow(unsigned char *WrodTable,unsigned X,unsigned char Y,unsigned char Background);
void Lcd_Fill(unsigned char X_start,unsigned char X_end,unsigned char Y_start,unsigned char Y_end,unsigned char Fill_char);
void LCD_String(unsigned char *String,unsigned char X_add,unsigned char Y_add,unsigned char Back_ground);
void DisplayEnglishWord12(unsigned char *WrodTable,unsigned X,unsigned char Y,unsigned char Background);
void Lcd_Line_H(unsigned X_start,unsigned X_end,unsigned Y,unsigned char fill_char);
void Lcd_Line_L(unsigned X,unsigned Y_start,unsigned Y_end,unsigned char fill_char);
void Lcd_Line(unsigned char X_start,unsigned Y_start,unsigned char X_end,unsigned char Y_end);
       
#endif

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(1349)
发表于:2007-11-8 8:14:33
标签:无标签

1

贴一个本人原创的CAN总线通信程序

//------------------------------------------------------
//  CAN <==> UART的协议转换器
//
//  程序名称:CAN <---> UART协议转换程序<透明方式>
//
//  作者: 王猛
//  创建: 2007-10-09
//
//  说明:
//  1,单片机使用P89C61X2BA 
//   --晶振11.0592MHZ                                                                                 
//   --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以设定
//  2,CAN总线发送采用查询方式,接收采用中断方式
//  3,看门狗复位时间1.2S
//  4,SJA1000晶振8MHZ,Peil模式
//  5,串口中断接收,查询发送,波特率可设置
//  6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发送出去
//
//   -----10.16日,重新修改程序完成以下功能-----   
//    ----此功能已经改为,每收到一帧数据,启动一次CAN传输,传输字节数等于串口收到的数据
//    ----串行帧的帧间界定通过当前波特率下传输5个字节为时间间隔,具体为当顺序接收到的任
//     意两个数据,它们之间的时间间隔大于5个字节传送时间,认为这两个数据分属于两个不
//     同的帧
//
//  7,当CAN总线每接收一帧信息后,通过串口发送出去
//   -----10.15日,改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个字节
//  8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S
//  
//-------------------------------------------------------

#include
#include
#include
#include "CANCOM.h"

//unsigned char UART_TX_Data[8] = {0,1,2,3,4,5,6,7};
//unsigned char CAN_TX_Data[8] = {0,1,2,3,4,5,6,7};     
unsigned char xdata UART_RX_Data[255];        //串口接收到的串行帧
unsigned char xdata CAN_TX_Data[255];        //待发送的数据缓冲区
unsigned char code ACR_ID[4] = {0,0,0,0};       //CAN初始设置验收滤波值
unsigned char code AMR_ID[4] = {0xff,0xff,0xff,0xff};
unsigned char CAN_TX_ID[4] = {0,0,0,0};        //待发送的目标的ID
unsigned char CAN_RX_ID[4] = {0,0,0,0};        //接收到的信息来自何ID
unsigned char CAN_RX_Data[8] = {7,6,5,4,3,2,1,0};     //接受到的数据缓冲
unsigned char code CAN_BTR0[10] = {0xdf,0xcf,0xc7,0xc3,0x43,0xc1,0xc1,0xc0,0xc0,0x80};                                                                                                                                                                                                                                                                                                                                                        
unsigned char code CAN_BTR1[10] = {0x7f,0x7f,0x7f,0x7f,0x2f,0x7f,0x4d,0x3e,0x3a,0x23};
//         5K  10K  20K  40K  50K  80K  100K 200K 250K 500K
unsigned char code UART_BTR[4] = {0xe8,0xf4,0xfa};  
//          1.2K,2.4K,4.8K

unsigned char CAN_flag;      //CAN发送标志位
unsigned char UART_flag;     //
unsigned char CAN_ERROR_flag = NOT;   //
unsigned char CAN_DataLength = 8;    //CAN信息的报文长度
unsigned char UART_DataLength = 0;   //串口接收时的当前指示 
unsigned char UART_Length = 0;    //串口接收区的长度指示
//sbit AAA = P1^4;

void main(void)
{
 EA = 0;     
 System_init();   //系统初始化
 Timer_init();   //定时器初始化
 Interrupt_init();  //中断
 UART_ini();
 CAN_init();
 Delay(1);
 W_WDT();
 EA = 1;

 //Delay(1);
 //UART_Length = 8;
 //CAN_Transmit(0);
 //UART_Transmit();

 while (1)
 {
  W_WDT();

  if (CAN_flag == YES)
  {
   CAN_flag = NOT;
   CAN_Transmit(0);
   LED1 = !LED1;
  }
  else
  {
   CAN_flag = NOT;
  }
/*
  if (UART_flag == YES)
  {
   UART_flag = NOT;
   //Delay(50);
   UART_Transmit();
   //Clear_Buffer(CAN_RX_Data,8);
   //LED3 = !LED3;
  }
  else
  {
   UART_flag = NOT;
  } 

*/
  if ((CAN_ERROR_flag == YES))
  {
   CAN_ERROR_flag = NOT;
   CAN_init();
  }
  else
  {
   CAN_ERROR_flag = NOT;
  }
 }
}
//---------------------------
// 功能:系统设置
//   --外部数据存储区访问使能
//   --LED指示灯关(1=on,0=off)
//   --流程控制标志置为无效NOT
//   --清空串口,CAN的相关数据缓冲区
//---------------------------
void System_init(void)
{
 CKCON = 0x00;   //Fosc devide 12
 AUXR  = 0x00;//0x02;   //EXM enable
 LED1 = 0;    //LED0-3 off  指示灯,共阴接法,1时亮
 LED2 = 0;
 LED3 = 0;
 LED4 = 0;
 WDT = 1;    //WDT ini
 
 CAN_DataLength = 8; 
 UART_DataLength = 0; 
 UART_Length = 0;  
 
 CAN_flag = NOT;
 CAN_ERROR_flag = NOT; 
 //UART_flag = NOT;

 Clear_Buffer(UART_RX_Data,255);
 Clear_Buffer(CAN_TX_Data,255);
 Clear_Buffer(CAN_TX_ID,4);
 Clear_Buffer(CAN_RX_ID,4);
 Clear_Buffer(CAN_RX_Data,8);
 
 /*
 CAN_flag = YES;
 UART_flag = YES;
 */
}
//-----------------------------
//
//  软件延时(非精确)
//   ----内置清看门狗定时器子函数
//    防止多次调用延时过长导致
//    看门狗复位
//
//-----------------------------
void Delay(unsigned char time)
{
 unsigned char i;
 unsigned int j;
 
 for (i = 0;i < time;i++)
 {
  W_WDT();
  for (j=0;j<30000;j++)
  {
  }
 }
}

//---------------------------------
// 串行口初始化设置
// 方式1,8数据位,一个停止位,无奇偶校验
// 串口中断允许
//------------------------------------
void UART_ini(void)
{
 SCON = 0x50;  //方式1,波特率可变,8bits,接受允许
 PCON&= 0x7F;  //SMOD = 0                          
 TMOD |= 0x20;  //timer1 mode 2                     
 
 TL1 = UART_BTR[2]; //|     f              
      //| 波特率=----------------------   
 TH1 = UART_BTR[2]; //|   32*2^smod*12*(256-TL1)  
 TCON |= 0x40;  //start                             
                                                                                                                
 TI = 0;                                             
}

//-----------------------------------------------
//
// 看门狗“喂狗”程序,WDT的一个下降沿触发一次
//
//-----------------------------------------------
void W_WDT(void)   //triggle WDT
{
 unsigned char i;
 WDT = 1;
 for (i=0;i<10;i++)
 {
 }
 WDT = 0;
}

//---------------------------------------------------
//
// 中断初始化
//  
//  ----外部中断0有效,下降沿触发,用于SJA1000产生CAN事件中断
//  ----定时器中断,用于判定串口接收的顺序两个字节是否分属两帧
//  ----串口中断,RX使用中断,TX未使用
//  ----中断优先级暂时未设定
//
//---------------------------------------------------
void Interrupt_init(void)
{
 //IP = 0x00;     
 IT0 = 0x01;      //外部0中断沿触发
 
 ET0 = 1;      //定时器0中断使能
 EX0 = 1;      //外部中断使能
 ES = 1;                //串行中断使能
}

//---------------------------------------------------
//
// 定时中断程序
//  
//  一旦中断,说明一帧的接收已经结束,开始启动CAN发送程序
//  把串口接收到的数据准备好给CAN总线发送
//  RX_buffer ===> CAN_TX_buffer
//
//---------------------------------------------------
void Timer0_ISR(void) interrupt 1 using 2
{
 static unsigned char i;
 //unsigned char counter;

 //TH0 = temp_TH0;
 //TL0 = temp_TL0;

 /*counter += 1;
 if (counter == 20)    //到1S了么?
 {
  //UART_flag = YES;
 }
 if (counter == 40)    //到2S了么?
 {
  //CAN_flag = YES;
  counter = 0;
 }*/
 //AAA = !AAA;
 TR0  = 0;      //定时器关,开始次CAN信息传送

 for (i=0;i {
  CAN_TX_Data[i] = UART_RX_Data[i];
 }
 UART_Length = UART_DataLength;
 UART_DataLength = 0;
 CAN_flag = YES;
}
//---------------------------------------------------------------
//
//  串口中断服务程序
//
//  ----只有接收使用   
//  ----每收一个数重新初始化定时器
//
//----------------------------------------------------------------
void RX_INT(void) interrupt 4 using 3
{
 static unsigned char  n;
 
 if (RI==1)
 {
  do
  {
   RI = 0;
  }
  while (RI != 0);

  //UART_RX_Data[UART_DataLength++] = SBUF;
  n = SBUF;
  UART_Send_Byte(n);
  
  TH0 = temp_TH0;  
  TL0 = temp_TL0;
  TR0  = 1;       //启动数据间隔定时,判断是否分属两帧
 }
 else
 {
  //TX
 }
}
//---------------------------------------------------------------
//
//  串口发送单字节程序
//
//----------------------------------------------------------------
void UART_Send_Byte(unsigned char Data)
{    
 SBUF = Data; 
 while (TI == 0)     //等待发送完毕
 {
 }
 TI = 0; 
}

//---------------------------------------------------------------
//
//  初始化定时器程序
//
//  ----定时器0方式1,定时器1方式2留给串口
//
//----------------------------------------------------------------
void Timer_init(void)
{
 TMOD |= 0x01;     //使用定时器0-方式1
 
 TH0 = temp_TH0;
 TL0 = temp_TL0;
 //TR0  = 1;      //这里不打开定时器
}

void CAN_init(void)
{
 
 EA = 0;
 MOD_CAN1 |= 0x08;     //单滤波方式
 do
 {
  MOD_CAN1 |= 0x01;               //request to reset mode
 }
 while ((MOD_CAN1&0x01) != 0x01);
 
 CDR_CAN1 = 0xc8;     //选择PeliCAN模式,使用输入比较器,clk_out关闭
 IER_CAN1 = 0x01;     //允许发送中断,其他中断禁能

 ACR0_CAN1 = ACR_ID[0];
 ACR1_CAN1 = ACR_ID[1];
 ACR2_CAN1 = ACR_ID[2];
 ACR3_CAN1 = ACR_ID[3];
 AMR0_CAN1 = AMR_ID[0];
 AMR1_CAN1 = AMR_ID[1];
 AMR2_CAN1 = AMR_ID[2];
 AMR3_CAN1 = AMR_ID[3];

 //ECC_CAN1 = 0;
 //TXERR_CAN1 = 0;
 //RBSA_CAN1 = 0;

 BTR0_CAN1 = CAN_BTR0[0];   
 BTR1_CAN1 = CAN_BTR1[0];
 OCR_CAN1 = 0xaa;     //normal output

 W_WDT();
 do
 {
  MOD_CAN1 &= 0xfe;
 }
 while ((MOD_CAN1&0x01) != 0x00);
 EA = 1;
}

//-----------------------------------
//
//  串口发送一帧接受到的CAN数据
//   
//   ----长度1-8,根据接收到的CAN信息来确定
//
//-----------------------------------
void UART_Transmit(void) //using 0
{
 unsigned char i;
 
 LED3 = !LED3;
 for (i=0;i {
  UART_Send_Byte(CAN_RX_Data[i]);
 }
}
//-----------------------------------
//
//  CAN发送接受到的一帧串口数据
//   
//   ----最大长度255,根据接收到的串口信息的
//    个数来确定
//   ----按每依次8个数据作为一个CAN帧的报文部分
//    不足8个或超过8的倍数的部分按实际个数作
//    为CAN报文
//   ----FarmeType = 1为扩展帧,FarmeType = 0为
//    标准帧
//-----------------------------------
void CAN_Transmit(bit FarmeType)
{

 unsigned char i;
 unsigned char m;
 unsigned char can_status;
 unsigned char xdata *pointer;
 
    
 if (FarmeType == 0)   //标准帧
 {
  for (m=0;m<(UART_Length/8);m++)
  {
   W_WDT();
   do         //发送缓冲区空么?
   {
    can_status = SR_CAN1;
   }
   while ((can_status&0x04) != 0x04);
   
   TXFrameInfo1 = 0x00 + 0x08;
   pointer = &TXID1;
   for (i=0;i<2;i++)
   {
    *(pointer++) = CAN_TX_ID[i];
   }

   pointer = &TXID3; 
   for (i=0;i<8;i++)
   {
    *(pointer++) = CAN_TX_Data[i+8*m];
   }
   CMR_CAN1 = Request_TX;
   W_WDT();
  }
  
  if ((UART_Length%8) != 0)
  {
   W_WDT();
   do          //发送缓冲区空么?
   {
    can_status = SR_CAN1;
   }
   while ((can_status&0x04) != 0x04);
   TXFrameInfo1 = 0x00 + UART_Length%8;
   pointer = &TXID1;
   for (i=0;i<2;i++)
   {
    *(pointer++) = CAN_TX_ID[i];
   }

   pointer = &TXID3; 
   for (i=0;i<(UART_Length%8);i++)
   {
    *(pointer++) = CAN_TX_Data[i+8*(UART_Length/8)];
   }
   CMR_CAN1 = Request_TX;
   W_WDT();
  }
  else
  {
  }
 }
 else        //扩展帧
 {
  for (m=0;m<(UART_Length/8);m++)
  {
   W_WDT();                                                 
   do         //发送缓冲区空么?   
   {                                                        
    can_status = SR_CAN1;                                
   }                                                        
   while ((can_status&0x04) != 0x04);                       

   TXFrameInfo1 = 0x80 + 0x08;
   pointer = &TXID1;
   for (i=0;i<4;i++)
   {
    *(pointer++) = CAN_TX_ID[i];
   }

   pointer = &TXDATA1;  
   for (i=0;i<8;i++)
   {
    *(pointer++) = CAN_TX_Data[i+8*m];
   }
   CMR_CAN1 = Request_TX;
   W_WDT();
  }
  
  if ((UART_Length%8) != 0)
  {
   W_WDT();
   do         //发送缓冲区空么?
   {
    can_status = SR_CAN1;
   }
   while ((can_status&0x04) != 0x04);
   TXFrameInfo1 = 0x80 + UART_Length%8;
   pointer = &TXID1;
   for (i=0;i<4;i++)
   {
    *(pointer++) = CAN_TX_ID[i];
   }

   pointer = &TXDATA1;  
   for (i=0;i<(UART_Length%8);i++)
   {
    *(pointer++) = CAN_TX_Data[i+8*(UART_Length/8)];
   }
   CMR_CAN1 = Request_TX;
   W_WDT();
  }
  else
  {
  }
 }
 
 UART_Length = 0;

}

//-----------------------------------
//
//  CAN接收中断服务程序
//   
//   ----判断是否是RX中断,如果是
//    把接受到的CAN信息通过串行口发送出去
//   ----其他的中断说明CAN总线出现错误或脱离
//    
//-----------------------------------
void CAN_ISR(void) interrupt 0 using 1
{
 unsigned char can_int;

 EA = 0;

 can_int = IR_CAN1;
 if ((can_int&0x01) == 0x01)   //接收中断
 {
  CAN_Receive();
  CMR_CAN1 |= ReleaseRXBuf;
 }
 else
 {
  CAN_ERROR_flag = YES;   //其他中断,暂时未用
 }

 //UART_flag = YES;
 //CAN_flag = YES;
 UART_Transmit();

 EA = 1;
}

//-----------------------------------
//
//  CAN接收数据函数
//   
//   ----根据接受到的帧信息,按不同的长度存储
//    报文数据
//    
//-----------------------------------           
void CAN_Receive(void) using 1
{
 unsigned char i;
 unsigned char xdata *pointer;
 unsigned char Info;

 Info = RXFrameInfo1;

 if ((Info&0x80) == 0)   //standard Frame
 {
  //CAN_RX_ID[0] = RXID1;  
  //CAN_RX_ID[1] = RXID2;

  CAN_DataLength = Info&0x0f;
  pointer = &RXID3;
  for (i=0;i  {
   CAN_RX_Data[i] = *(pointer++);
  }
  for (;i<8;i++)
  {
   CAN_RX_Data[i] = 0x00;
  }
 }
 else       //Ex  Frame
 {
  //CAN_RX_ID[0] = RXID1;  
  //CAN_RX_ID[1] = RXID2;
  //CAN_RX_ID[2] = RXID3;  
  //CAN_RX_ID[3] = RXID4;
  CAN_DataLength = Info&0x0f;
  pointer = &RXDATA1;
  for (i=0;i  {
   CAN_RX_Data[i] = *(pointer++);
   //pointer += 1;
  }
  for (;i<8;i++)
  {
   CAN_RX_Data[i] = 0x00;
  }
 } 
}
//-----------------------------------
//
//  清0缓冲区
//   
//   ----pointer,指向待清0 的缓冲区首地址
//   ----length 清0 的长度   
//-----------------------------------
void Clear_Buffer(unsigned char *pointer,unsigned char length)
{
 unsigned char i;

 for (i=0;i {
  *(pointer++) = 0x00;
 }
}

另外头文件为:

#ifndef _CANCOM_H
#define _CANCOM_H

#define CS1_SJA1000  0x7f00       //SJA1000 Pin /CS ----> P2.7,low level active
  
#define MOD_CAN1  XBYTE[CS1_SJA1000+0]   //Peli
#define CMR_CAN1  XBYTE[CS1_SJA1000+1]  //command
#define SR_CAN1   XBYTE[CS1_SJA1000+2]   //state
#define IR_CAN1   XBYTE[CS1_SJA1000+3]   //interrupt
#define IER_CAN1  XBYTE[CS1_SJA1000+4]  //interrupt enable  //Peli
#define BTR0_CAN1  XBYTE[CS1_SJA1000+6]        //bus timing0
#define BTR1_CAN1  XBYTE[CS1_SJA1000+7]        //bus timing1
#define OCR_CAN1  XBYTE[CS1_SJA1000+8]
#define TEST_CAN1  XBYTE[CS1_SJA1000+9]
#define ECC_CAN1  XBYTE[CS1_SJA1000+12]  //error catch
#define EWLR_CAN1  XBYTE[CS1_SJA1000+13]  //error warning limit
#define RXERR_CAN1  XBYTE[CS1_SJA1000+14]  //
#define TXERR_CAN1  XBYTE[CS1_SJA1000+15]
#define ACR0_CAN1  XBYTE[CS1_SJA1000+16]
#define ACR1_CAN1  XBYTE[CS1_SJA1000+17]
#define ACR2_CAN1  XBYTE[CS1_SJA1000+18]
#define ACR3_CAN1  XBYTE[CS1_SJA1000+19]
#define AMR0_CAN1  XBYTE[CS1_SJA1000+20]
#define AMR1_CAN1  XBYTE[CS1_SJA1000+21]
#define AMR2_CAN1  XBYTE[CS1_SJA1000+22]
#define AMR3_CAN1  XBYTE[CS1_SJA1000+23]
#define RBSA_CAN1  XBYTE[CS1_SJA1000+30]  //beginning of receive
#define CDR_CAN1  XBYTE[CS1_SJA1000+31]  //clock devide

#define TXFrameInfo1  XBYTE[CS1_SJA1000+16]  
#define TXID1    XBYTE[CS1_SJA1000+17]  
#define TXID2    XBYTE[CS1_SJA1000+18]  
#define TXID3    XBYTE[CS1_SJA1000+19]  
#define TXID4    XBYTE[CS1_SJA1000+20]  
#define TXDATA1   XBYTE[CS1_SJA1000+21]
#define TXDATA2   XBYTE[CS1_SJA1000+22]
#define TXDATA3   XBYTE[CS1_SJA1000+23]
#define TXDATA4   XBYTE[CS1_SJA1000+24]
#define TXDATA5   XBYTE[CS1_SJA1000+25]
#define TXDATA6   XBYTE[CS1_SJA1000+26]
#define TXDATA7   XBYTE[CS1_SJA1000+27]
#define TXDATA8   XBYTE[CS1_SJA1000+28]

#define RXFrameInfo1  XBYTE[CS1_SJA1000+16]  
#define RXID1    XBYTE[CS1_SJA1000+17]  
#define RXID2    XBYTE[CS1_SJA1000+18]  
#define RXID3    XBYTE[CS1_SJA1000+19]  
#define RXID4    XBYTE[CS1_SJA1000+20]  
#define RXDATA1   XBYTE[CS1_SJA1000+21]
#define RXDATA2   XBYTE[CS1_SJA1000+22]
#define RXDATA3   XBYTE[CS1_SJA1000+23]
#define RXDATA4   XBYTE[CS1_SJA1000+24]
#define RXDATA5   XBYTE[CS1_SJA1000+25]
#define RXDATA6   XBYTE[CS1_SJA1000+26]
#define RXDATA7   XBYTE[CS1_SJA1000+27]
#define RXDATA8   XBYTE[CS1_SJA1000+28]

#define  GoToRESET    0x01
#define  ReleaseRXBuf   0x04
#define  Request_TX    0x01

#define  NOT  0
#define  YES  1
//4800bps 5bits 1.04mS
#define TIME_MS  1
#define temp_TH0 (0 - 922*TIME_MS)/256
#define temp_TL0 (0 - 922*TIME_MS)%256

sbit LED1 = P1^2;
sbit LED2 = P1^3;
sbit LED3 = P1^5;
sbit LED4 = P1^4;
sbit WDT = P3^4;

void System_init(void);
void Delay(unsigned char time);
void W_WDT(void);
void Interrupt_init(void);
void CAN_init(void);
//void CAN_Transmit(unsigned char Farmeinfo);
void CAN_Transmit(bit FarmeType);
void CAN_Receive(void);
void Timer_init(void);
void UART_ini(void);
void UART_Send_Byte(unsigned char Data);
void UART_Transmit(void);
void Clear_Buffer(unsigned char *pointer,unsigned char length);

#endif

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(901)
发表于:2007-11-5 17:34:51
标签:无标签

0

关于电阻的一点总结

国家标准规定了电阻的阻值按其精度分为两大系列,分别为E-24系列和E-96系列,E-24系列精度为5%,E-96系列为1%, 在这两种系列之外的电阻为非标电阻,较难采购。下面列出了常用的5%和1%精度电阻的标称值,供大家设计时参考。

精度为5%的碳膜电阻,以欧姆为单位的标称值:

1.0    5.6    33     160     820      3.9K     20K     100K     510K     2.7M
1.1    6.2    36     180     910      4.3K     22K     110K     560K     3M
1.2    6.8    39     200     1K       4.7K     24K     120K     620K     3.3M
1.3    7.5    43     220     1.1K     5.1K     27K     130K     680K     3.6M
1.5    8.2    47     240     1.2K     5.6K     30K     150K     750K     3.9M
1.6    9.1    51     270     1.3K     6.2K     33K     160K     820K     4.3M
1.8    10     56     300     1.5K     6.6K     36K     180K     910K     4.7M
2.0    11     62     330     1.6K     7.5K     39K     200K     1M       5.1M
2.2    12     68     360     1.8K     8.2K     43K     220K     1.1M     5.6M
2.4    13     75     390     2K       9.1K     47K     240K     1.2M     6.2M
2.7    15     82     430     2.2K     10K      51K     270K     1.3M     6.8M
3.0    16     91     470     2.4K     11K      56K     300K     1.5M     7.5M
3.3    18     100    510     2.7K     12K      62K     330K     1.6M     8.2M
3.6    20     110    560     3K       13K      68K     360K     1.8M     9.1M
3.9    22     120    620     3.2K     15K      75K     390K     2M       10M
4.3    24     130    680     3.3K     16K      82K     430K     2.2M     15M
4.7    27     150    750     3.6K     18K      91K     470K     2.4M     22M
5.1    30  
  
  精度为1%的金属膜电阻,以欧姆为单位的标称值:

10      33      100    332    1K       3.32K    10.5K    34K      107K    357K
10.2    33.2    102    340    1.02K    3.4K     10.7K    34.8K    110K    360K
10.5    34      105    348    1.05K    3.48K    11K      35.7K    113K    365K
10.7    34.8    107    350    1.07K    3.57K    11.3K    36K      115K    374K
11      35.7    110    357    1.1K     3.6K     11.5K    36.5K    118K    383K
11.3    36      113    360    1.13K    3.65K    11.8K    37.4K    120K    390K
11.5    36.5    115    365    1.15K    3.74K    12K      38.3K    121K    392K
11.8    37.4    118    374    1.18K    3.83K    12.1K    39K      124K    402K
12      38.3    120    383    1.2K     3.9K     12.4K    39.2K    127K    412K
12.1    39      121    390    1.21K    3.92K    12.7K    40.2K    130K    422K
12.4    39.2    124    392    1.24K    4.02K    13K      41.2K    133K    430K
12.7    40.2    127    402    1.27K    4.12K    13.3K    42.2K    137K    432K
13      41.2    130    412    1.3K     4.22K    13.7K    43K      140K    442K
13.3    42.2    133    422    1.33K    4.32K    14K      43.2K    143K    453K
13.7    43      137    430    1.37K    4.42K    14.3K    44.2K    147K    464K
14      43.2    140    432    1.4K     4.53K    14.7K    45.3K    150K    470K
14.3    44.2    143    442    1.43K    4.64K    15K      46.4K    154K    475K
14.7    45.3    147    453    1.47K    4.7K     15.4K    47K      158K    487K
15      46.4    150    464    1.5K     4.75K    15.8K    47.5K    160K    499K
15.4    47      154    470    1.54K    4.87K    16K      48.7K    162K    511K
15.8    47.5    158    475    1.58K    4.99K    16.2K    49.9K    165K    523K
16      48.7    160    487    1.6K     5.1K     16.5K    51K      169K    536K
16.2    49.9    162    499    1.62K    5.11K    16.9K    51.1K    174K    549K
16.5    51      165    510    1.65K    5.23K    17.4K    52.3K    178K    560K
16.9    51.1    169    511    1.69K    5.36K    17.8K    53.6K    180K    562K
17.4    52.3    174    523    1.74K    5.49K    18K      54.9K    182K    576K
17.8    53.6    178    536    1.78K    5.6K     18.2K    56K      187K    590K
18      54.9    180    549    1.8K     5.62K    18.7K    56.2K    191K    604K
18.2    56      182    560    1.82K    5.76K    19.1K    57.6K    196K    619K
18.7    56.2    187    562    1.87K    5.9K     19.6K    59K      200K    620K
19.1    57.6    191    565    1.91K    6.04K    20K      60.4K    205K    634K
19.6    59      196    578    1.96K    6.19K    20.5K    61.9K    210K    649K
20      60.4    200    590    2K       6.2K     21K      62K      215K    665K
20.5    61.9    205    604    2.05K    6.34K    21.5K    63.4K    220K    680K
21      62      210    619    2.1K     6.49K    22K      64.9K    221K    681K
21.5    63.4    215    620    2.15K    6.65K    22.1K    66.5K    226K    698K
22      64.9    220    634    2.2K     6.8K     22.6K    68K      232K    715K
22.1    66.5    221    649    2.21K    6.81K    23.2K    68.1K    237K    732K
22.6    68      226    665    2.26K    6.98K    23.7K    69.8K    240K    750K
23.2    68.1    232    680    2.32K    7.15K    24K      71.5K    243K    768K
23.7    69.8    237    681    2.37     7.32K    24.3K    73.2K    249K    787K
24      71.5    240    698    2.4K     7.5K     24.9K    75K      255K    806K
24.3    73.2    243    715    2.43K    7.68K    25.5K    76.8K    261K    820K
24.7    75      249    732    2.49K    7.87K    26.1K    78.7K    267K    825K
24.9    75.5    255    750    2.55K    8.06K    26.7K    80.6K    270K    845K
25.5    76.8    261    768    2.61K    8.2K     27K      82K      274K    866K
26.1    78.7    267    787    2.67K    8.25K    27.4K    82.5K    280K    887K
26.7    80.6    270    806    2.7K     8.45K    28K      84.5K    287K    909K
27      82      274    820    2.74K    8.66K    28.7K    86.6K    294K    910K
27.4    82.5    280    825    2.8K     8.8K     29.4K    88.7K    300K    931K
28      84.5    287    845    2.87K    8.87K    30K      90.9K    301K    953K
28.7    86.6    294    866    2.94K    9.09K    30.1K    91K      309K    976K
29.4    88.7    300    887    3.0K     9.1K     30.9K    93.1K    316K    1.0M
30      90.9    301    909    3.01K    9.31K    31.6K    95.3K    324K    1.5M
30.1    91      309    910    3.09K    9.53K    32.4K    97.6K    330K    2.2M
30.9    93.1    316    931    3.16K    9.76K    33K      100K     332K    
31.6    95.3    324    953    3.24K    10K      33.2K    102K     340K    
32.4    97.6    330    976    3.3K     10.2K    33.6K    105K     348K 

 

点击此处查看原文 >>

系统分类: 消费电子   |    用户分类:    |    来源: 整理

评论(1) | 阅读(585)
发表于:2007-11-5 17:24:29
标签:无标签