位声明

  1. sbit r1 = P3^0; # 对P3.1进行声明

中断优先级

外部中断0 0
定时器中断0 1
外部中断1 2
定时器中断1 3
串口中断 4

定时器和串口使用

直接通过stcisp配置

  1. void Timer0Init(void) //50毫秒@11.0592MHz
  2. {
  3. AUXR &= 0x7F; //定时器时钟12T模式
  4. TMOD &= 0xF0; //设置定时器模式
  5. TL0 = 0x00; //设置定时初值
  6. TH0 = 0x4C; //设置定时初值
  7. TF0 = 0; //清除TF0标志
  8. TR0 = 1; //定时器0开始计时
  9. }
  10. void UartInit(void) //115200bps@11.0592MHz
  11. {
  12. SCON = 0x50; //8位数据,可变波特率
  13. AUXR |= 0x40; //定时器1时钟为Fosc,即1T
  14. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  15. TMOD &= 0x0F; //设定定时器116位自动重装方式
  16. TL1 = 0xE8; //设定定时初值
  17. TH1 = 0xFF; //设定定时初值
  18. ET1 = 0; //禁止定时器1中断
  19. TR1 = 1; //启动定时器1
  20. }

若需要持续触发,则需要在中断服务函数中重载初值

  1. void timer1() interrupt 3
  2. {
  3. static int i=0;
  4. TL0 = 0x00; //设置定时初值
  5. TH0 = 0x4C; //设置定时初值
  6. if(++i==20){
  7. i=0;
  8. flag=1;
  9. }
  10. }

串口字符串发送

  1. //通过串口发送字符串
  2. void uart_sendstring(unsigned char *str)
  3. {
  4. unsigned char *p;
  5. p = str;
  6. while(*p != '\0')
  7. {
  8. SBUF = *p;
  9. while(TI == 0); //等待发送标志位置位
  10. TI = 0;
  11. p++;
  12. }
  13. }

串口printf的重定义

C51的printf 格式化方式和标准C不太一样。。
image.png

  1. #include <stdio.h>
  2. void send_char(unsigned char ch)
  3. {
  4. SBUF=ch;
  5. while(!TI);
  6. TI=0;
  7. }
  8. char putchar(char c)
  9. {
  10. send_char(c);
  11. return c;
  12. }

常用配置

  1. #ifndef _UART_H_
  2. #define _UART_H_
  3. #include "stc8h.h"
  4. #include <stdio.h>
  5. void UartInit(void);
  6. void sendbyte(unsigned char dat);
  7. #endif
  1. #include "uart.h"
  2. void UartInit(void) //9600bps@11.0592MHz
  3. {
  4. SCON = 0x50; //8位数据,可变波特率
  5. AUXR |= 0x01; //串口1选择定时器2为波特率发生器
  6. AUXR |= 0x04; //定时器2时钟为Fosc,即1T
  7. T2L = 0xE0; //设定定时初值
  8. T2H = 0xFE; //设定定时初值
  9. AUXR |= 0x10; //启动定时器2
  10. }
  11. void sendbyte(unsigned char dat)
  12. {
  13. SBUF=dat;
  14. while(!TI);
  15. TI=0;
  16. }
  17. char putchar(char ch)
  18. {
  19. sendbyte(ch);
  20. return ch;
  21. }