在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 4893|回复: 2

[原创] C8051F040串口中断处理程序

[复制链接]
发表于 2010-5-22 15:12:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
#include "c8051f040.h"               
#include "UART.h"
unsigned char uart_recv_state;
unsigned char uart_recv_cnt;
unsigned char uart_txd_cnt;
UART_CMD uare_cmd;
unsigned char xdata coma_rxd_buff  [ 10 ] ;
unsigned char xdata coma_txd_buff  [ 10 ] ;
void SYSCLK_Init (void)
{
   int i;                              // 延时计数器
   SFRPAGE   = CONFIG_PAGE;
   OSCXCN = 0x67;                      // 使用外部22.1184MHz晶振
   for(i=0; i<3000; i++);               // 等待1ms
   while ((OSCXCN & 0x80) == 0);           // 等待外部振荡器稳定
   CLKSEL    = 0x01;     //系统时钟不分频
}
void PORT_Init (void)
{
SFRPAGE   = CONFIG_PAGE;
XBR0   =   0x05;                    //设置XBR0,CP0,CEX0,UART0,SPI,SMBUS连接到端口引脚
XBR1   =   0x00;                    //
XBR2   =   0x44;                    //打开交叉开关和弱上拉,连接UART1到端口引脚
P0MDOUT = 0x00;      //设置P0口输出
P2MDOUT = 0x00;      //设置P2口输出
P4MDOUT = 0x00;
  P5MDOUT = 0x00;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN  = 0x00;      //P1端口设置为模拟输入                  
P3MDIN  = 0x00;      //P3端口设置为模拟输入  
P7 = 0xFF;    //设置P7口为数字输入  
}
void Uart0_Init(unsigned char BaudRate) //Uart0初始化        
{                                    
SFRPAGE   = TIMER01_PAGE;
TR1 = 0;                              // 关闭定时器Timer1
ET1 = 0;                              // 关闭定时器Timer1中断
PT1 = 0;                              // 关闭定时器Timer1中断优先权
TCON = 0x40;                        //
TMOD = 0x20;                        // TMOD: 定时器1, 模式2, 8位重载
SFRPAGE   = UART0_PAGE;
  SCON0  = 0x50;                      // SCON0: 模式1, 8位UART, 使能RX
SSTA0  = 0x00;      //SMOD=0
CKCON     = 0x10;
  TH1    = ~(SYSCLK/(BaudRate*1200)/32)+1;
ES0=0;                  // 关闭串口Uart0中断
PS=0;                  // 关闭串口Uart0中断优先权
TI0  = 0;
  RI0  = 0;                        // Indicate RX0 ready
  SFRPAGE   = TIMER01_PAGE;
  TR1  = 1;        //定时器1使能
//缓冲区初始化
   uart_recv_state = 0;
   uart_recv_cnt = 0;
}
void Uart0_Int_Proc(void) interrupt 4      
{                                    
  unsigned char recv_data;
SFRPAGE   = UART0_PAGE;
if ( RI0 )
   {
if(uart_recv_state == 0){
     recv_data =  SBUF0;
     uart_recv_cnt++;
     switch(uart_recv_cnt){
      case 1:
         if(recv_data!='X') uart_recv_cnt = 0;
         break;
      case 2:
         uare_cmd.package_length = recv_data;
         break;
      case 3:
         uare_cmd.cmd_state = recv_data;
         break;
      case 4:
         uare_cmd.cmd_func = recv_data;
         break;
   case 5:
         uare_cmd.port_num = recv_data;
         break;
      case 6:
         uare_cmd.data_h = recv_data;
         break;
      case 7:
         uare_cmd.data_l = recv_data;
         break;
      case 8:
         uare_cmd.crc = recv_data;
         break;   
     default:   
         break;
     }
  
      if(uart_recv_cnt>=8){
      uart_recv_cnt=0;
      uart_recv_state = 1;
     }
    }
   RI0 = 0 ;
}
  if ( TI0 )
   {
    if ( uart_txd_cnt < 8)
      {
        SBUF0 = coma_txd_buff [ uart_txd_cnt ] ;
        uart_txd_cnt ++ ;
      }
    else
   {
  uart_txd_cnt = 0x00 ;
      }
    TI0 = 0 ;
   }
}
void main (void)
{
  EA = 0;         
WDTCN = 0xde;                       //向WDTCN 寄存器写入0xDE 后再写入0xAD 将禁止WDT
WDTCN = 0xad;
SYSCLK_Init();                     
PORT_Init();                 
   Uart0_Init(BaudRate_9600);                        // UART0初始化
ES0=1;                  // 开启串口Uart0中断
PS=1;                  // 串口Uart0中断优先权设置为高
//中断使能
EA = 1;
while (1)
{
  if(uart_recv_state==0x01)
  {
   
   coma_txd_buff [ 0 ] = 0x58 ;
   coma_txd_buff [ 1 ] = uare_cmd.package_length;
   coma_txd_buff [ 2 ] = uare_cmd.cmd_state;   
   coma_txd_buff [ 3 ] = uare_cmd.cmd_func;   
   coma_txd_buff [ 4 ] = uare_cmd.port_num;  
   coma_txd_buff [ 5 ] = uare_cmd.data_h;
   coma_txd_buff [ 6 ] = uare_cmd.data_l;  
   coma_txd_buff [ 7 ] = uare_cmd.crc;  
   uart_txd_cnt = 1;
   SFRPAGE   = UART0_PAGE;
   SBUF0 = coma_txd_buff [ 0 ];
   uart_recv_state = 0x00;
   P2 = ~P2;
  }
}
}
 楼主| 发表于 2010-5-22 15:15:41 | 显示全部楼层
Uart.h
#define  bool   unsigned char
#define  SYSCLK   22118400      //SYSCLK frequency in Hz
#define BaudRate_1200    1                //1*1200
#define BaudRate_2400    2                //2*1200
#define BaudRate_4800    4                //4*1200
#define BaudRate_9600    8                //8*1200
#define BaudRate_19200   16                //16*1200
#define BaudRate_38400   32                //32*1200
#define BaudRate_57600   48                //48*1200
#define BaudRate_115200  96          //96*1200
#define RI1  SCON1&0x01
#define TI1  SCON1&0x02
#define WDT_CLOSE   EA=0; WDTCN=0xde; WDTCN=0xad; EA=1;
#define WDT_OPEN    WDTCN = 0xff;
#define WDT_CLR     WDTCN = 0xa5;

typedef struct  {
unsigned char package_length ; //包长标识
unsigned char cmd_state ;   //状态标识
unsigned char cmd_func;   //功能标识1,标识POE测试功能代码
unsigned char port_num;   //功能标识2,标识端口号
//unsigned char xdata func_ID3 ;   //功能标识3,标识详细功能项
unsigned char data_h;   //高字节内容
unsigned char data_l;   //低字节内容
unsigned char crc;    //命令校验和字段
}UART_CMD;
void Uart0_Init(unsigned char BaudRate);
发表于 2014-9-1 07:32:10 | 显示全部楼层
谢谢 !!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-6 05:00 , Processed in 0.016666 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表