单片机学习笔记--外部中断,定时器,串口中断
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中断,串行端口完成一帧字符发送/接收后引起。 LED=~LED; //指示灯反相,可以看到闪烁 } 串口通讯要转换电压,开发板用的是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; } |
单片机学习笔记--外部中断,定时器,串口中断
最新推荐文章于 2023-01-04 13:12:36 发布