新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机学习笔记外部中断,定时器,串口中断

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

作者: 时间:2016-11-20 来源:网络 收藏
CPU收到中断请求,停下正在处理的工作A,去处理事件B,处理完后继续回到中断的地方继续执行事件A的过程,称为中断

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

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

本文引用地址://m.amcfsurvey.com/article/201611/318702.htm

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)interrupt0 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 00011
代码和校验:发送一块数据,多产生一个字节的校验字符,在代码末尾,
比特率:美妙传送的二进制代码的位数,单位是位/秒(bps)
例如:每秒传送240个字符, 0 1111 1111 1 10*240=2400bps

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


串口通讯要转换电压,开发板用的是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!=)// 表示字符串结束标志,
//通过检测是否字符串末尾
{
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;
}


评论


技术专区

关闭