位声明
sbit r1 = P3^0; # 对P3.1进行声明
中断优先级
| 外部中断0 | 0 |
|---|---|
| 定时器中断0 | 1 |
| 外部中断1 | 2 |
| 定时器中断1 | 3 |
| 串口中断 | 4 |
定时器和串口使用
直接通过stcisp配置
void Timer0Init(void) //50毫秒@11.0592MHz{AUXR &= 0x7F; //定时器时钟12T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x00; //设置定时初值TH0 = 0x4C; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时}void UartInit(void) //115200bps@11.0592MHz{SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //设定定时器1为16位自动重装方式TL1 = 0xE8; //设定定时初值TH1 = 0xFF; //设定定时初值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1}
若需要持续触发,则需要在中断服务函数中重载初值
void timer1() interrupt 3{static int i=0;TL0 = 0x00; //设置定时初值TH0 = 0x4C; //设置定时初值if(++i==20){i=0;flag=1;}}
串口字符串发送
//通过串口发送字符串void uart_sendstring(unsigned char *str){unsigned char *p;p = str;while(*p != '\0'){SBUF = *p;while(TI == 0); //等待发送标志位置位TI = 0;p++;}}
串口printf的重定义
C51的printf 格式化方式和标准C不太一样。。
#include <stdio.h>void send_char(unsigned char ch){SBUF=ch;while(!TI);TI=0;}char putchar(char c){send_char(c);return c;}
常用配置
#ifndef _UART_H_#define _UART_H_#include "stc8h.h"#include <stdio.h>void UartInit(void);void sendbyte(unsigned char dat);#endif
#include "uart.h"void UartInit(void) //9600bps@11.0592MHz{SCON = 0x50; //8位数据,可变波特率AUXR |= 0x01; //串口1选择定时器2为波特率发生器AUXR |= 0x04; //定时器2时钟为Fosc,即1TT2L = 0xE0; //设定定时初值T2H = 0xFE; //设定定时初值AUXR |= 0x10; //启动定时器2}void sendbyte(unsigned char dat){SBUF=dat;while(!TI);TI=0;}char putchar(char ch){sendbyte(ch);return ch;}
