网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 设计资源 > 单片机 > 正文
中断服务子程序
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: Admin 发布时间: 09/07/23

  #include <reg52.h>    // 引用标准库的头文件

  #define uchar unsigned char

  #define uint unsigned int

  #define REQ_SEND  0x01

  #define REQ_RESEND  0x02       //为简化起见,假设了7位固定的采集数据

  #define DATA0  0x10

  #define DATA1  0x20

  #define DATA2  0x30

  #define DATA3  0x40

  #define DATA4  0x50

  #define DATA5  0x60

  #define DATA6  0x70

  sbit TXEN = P2^0;

  sbit CS = P2^1;

  sbit PWR = P2^2;

  void ClearT_buf();// 清除t_buf函数

  void ClearR_buf();// 清除r_buf函数

  void Delay5ms();// 延时5ms

  void GetData();// 采集数据

  void Send();// 采集并发送函数

  xdata uchar Flag_StartRec = 0 ;//开始接受数据标志位

  xdata uchar Flag_ReqSend = 0 ;//请求发送标志位

  xdata uchar Flag_ReqReSend = 0 ;//请求重发标志位

  xdata uchar Flag_Delay5ms = 1 ;//延时5ms标志

  xdata uchar Data[7];//采集的7个字节数据

  xdata uchar t_buf[11];// 1开始字节"contentquot;,1长度字节LEN,

  // 7字节数据,1校验和字节,

  // 1 结束字节"*"

  xdata uchar rCount = 0 ;

  xdata uchar r_buf[5];// 1开始字节"contentquot;,1长度字节LEN,

  // 1字节指令,1校验和字节,

  // 1 结束字节"*"

  /*************定时器0中断服务子程序**************/

  void timer() interrupt 1 using 2

  {

  Flag_Delay5ms = 0;

  TH0 = -5000/256;

  TL0 = -5000%256;

  }

  /*******************主程序************************/

  void main(void)

  {

  ClearT_buf();

  ClearR_buf();

  TXEN = 0;//初始为接收状态

  PWR = 1;//正常工作模式

  CS = 0;//选择频道0

  EA=0;            //11.0592MHz下,设置串口9600波特率,工作方式1              , 8位数据位,1位停止位,无奇偶校验

  TMOD = 0x21;//定时器1工作模式1,定时器0工作模式2

  SCON = 0x50;//串行口工作方式1,REN=1

  PCON = 0x00;//SMOD=0

  TL1 = 0xfd;

  TH1 = 0xfd;

  TR1=1;//定时器1开始计时

  PT0 = 1;//定时器0高优先级

  TH0 = -5000/256;//5ms

  TL0 = -5000%256;

  IE = 0x90;//EA=1,ES=1:打开串口中断

  while (1)

  {

  if (Flag_ReqSend)//收到"请求发送"指令

  {

  TXEN = 1;//改变为发射状态

  Delay5ms();//延时5ms

  GetData();//采集数据

  Send();//发送

  Flag_ReqSend = 0;

  TXEN = 0;//重设为接收状态

  }

  else if (Flag_ReqReSend)//收到"请求重发"指令

  {

  TXEN = 1;//改变为发射状态

  Delay5ms();//延时5ms

  Send();//重发

  Flag_ReqReSend = 0;

  TXEN = 0;//重设为接收状态

  }

  }

  }

  /***************串口中断服务子程序****************/

  void serial ( ) interrupt 4 using 1

  {

  RI = 0 ;

  if ((!Flag_StartRec) && (SBUF==0xaa))// 判断是否收到字符0xaa,置开始接收标志位

  {

  Flag_StartRec=1;

  }

  if  (Flag_StartRec)

  {

  if  (rCount <5)

  {

  r_buf[rCount]=SBUF;

  rCount ++;

  }

  if ((r_buf[rCount-1]==0x55)||(rCount==5))// 判断是否收到字符0x55,根据接收的指令设置相应标志位

  {

  rCount=0;

  Flag_StartRec=0;

  if (r_buf[2]==REQ_SEND)//收到"请求发送"指令

  {

  Flag_ReqSend=1;

  }

  if (r_buf[2]==REQ_RESEND)//收到"请求重发"指令

  {

  Flag_ReqReSend=1;

  }

  }

  else

  ClearR_buf();

  }

  }

  /**************清除发送SBUF程序*****************/

  void ClearT_buf(void)

  {

  uchar xdata k ;

  for (k=0;k<11;k++)

  {

  t_buf[k]=0;

  }

  }

  /*************清除接受SBUF程序******************/

  void ClearR_buf(void)

  {

  uchar xdata k ;

  for (k=0;k<5;k++)

  {

  r_buf[k]=0;

  }

  }

  /****************延迟5ms子程序*******************/

  void Delay5ms(void)

  {

  TR0=1;

  ET0=1;

  while( Flag_Delay5ms);

  ET0=0;

  TR0=0;

  Flag_Delay5ms=1;

  }

  /****************数据采集程

  • 上一篇资讯: 单片机简叙
  • 下一篇资讯: ADC0809采集数据
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 电话:013574892963 QQ:3710167 邮箱:Educs@163.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 Www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号