单片机学习笔记--外部中断,定时器,串口中断

单片机学习笔记--外部中断,定时器,串口中断
CPU收到中断请求,停下正在处理的工作A,去处理事件B,处理完后继续回到中断的地方继续执行事件A的过程,称为中断

51有5个中断源    外部中断0    定时计数中断0    外部中断1    定时继续中断1    串口中断

 

MCS-51单片机中断系统的结构:

5个中断源的符号、名称及产生的条件如下。

INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。

INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。

T0:定时器/计数器0中断,由T0计满回零引起。

T1:定时器/计数器l中断,由T1计满回零引起。

TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。

 

图片 

 
 图片


外部中断           引脚P3.2       P3.3

                  EA=1;          //全局中断开
                  EX0=1;         //外部中断0开
                  IT0=0;         //0为低电平触发     1为下降沿触发

void ISR_Key(void) interrupt 0 using 1
{
             P1=~P1;     //进入中断程序执行程序,
                                //此时可以通过 EA=0指令暂时关掉中断    
}



定时计数器              引脚P3.4       P3.5     引脚做计数功能

void Init_Timer0(void)
{
 TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响       
 TH0=0x00;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
 TL0=0x00;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}


void Timer0_isr(void) interrupt 1 
{
 TH0=0x00;    //重新赋值
 TL0=0x00;

 LED=~LED;        //指示灯反相,可以看到闪烁

}


串口通讯
        并行通讯  控制简单 8位数据线    一个询问线 一个应答线    
                        线多用于短距离    速度快的通讯  对硬件要求高
        串口通讯    线少    用于长距离    传送成本低    数据一位一位的发送
        
        异步通讯    指发送与接收设备使用各自的时钟控制数据的发送和接收的过程    起始位0 + 8位数据位 + 结束位1
                            数据以帧为单位,不要求双方时钟严格一致,实现容易,设备开销小,传输效率不高
        
                            单工:单方向传送,例如遥控器
                            半双工:同一时间只能一方发一方收,例如对讲机
                            全双工:可以同时数据双向传送。手发不影响。

                            奇偶效验:奇校验:0000 0001 0    偶校验:0000 0001 1  
                             代码和校验:发送一块数据,多产生一个字节的校验字符,在代码末尾,
        比特率:美妙传送的二进制代码的位数,单位是位/秒(bps)
                            例如: 每秒传送240个字符, 0 1111 1111 1     10*240=2400bps

RS232    是EIA  美国电子工业协会1969年修订的标准,定义了数据终端设备DTE与数据通信设备DCE之间的物理结接口标准
        RS232 规定用25针连接器,
                一般有作用的是3跟线            TXD    RXD    SGND
 

图片
 
串口通讯要转换电压,开发板用的是MAX232   把TTL电平转换成RS232电平

图片

 图片

 图片

 图片

 图片
 图片
图片 

 

方式1,3的波特率=1/32或1/16*计时器2的溢出率
此处有一个公式:
波特率=1/16或1/32*(晶振的频率/12*(256-TH1))
代入:
9600=11059200/32*12*(256-TH1)
TH1=TH0=FDH

定时器为工作方式2    可自动再装载的8位波特率发生器 

void InitUART  (void)
{
    SCON  = 0x50;          // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    //ES    = 1;                  //打开串口中断
}   

void main (void)
{
InitUART();
 
        while (1)                       
            {
                    SendStr("UART test,技术论坛: thank you!");
                     DelayMs(240);//延时循环发送
                    DelayMs(240);
            }
}
/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
 SBUF = dat;
 while(!TI);
      TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
 while(*s!='\0')// \0 表示字符串结束标志,
                //通过检测是否字符串末尾
  {
  SendByte(*s);
  s++;
  }
}  












/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量 
   
   if(RI)                        //判断是接收中断产生
     {
   RI=0;                      //标志位清零
   Temp=SBUF;                 //读入缓冲区的值
   P1=Temp;                   //把值输出到P1口,用于观察
      SBUF=Temp;                 //把接收到的值再发回电脑端
  }
   if(TI)                        //如果是发送标志位,清零
     TI=0;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值