找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4438|回复: 3
收起左侧

STC8A单片机串口发送数据程序

[复制链接]
ID:613800 发表于 2019-9-28 17:54 | 显示全部楼层 |阅读模式
上手了一块STC8A8K64S4A12,STC公司推出的最新的单片机,性能比51单片机要好非常多。详细的芯片信息可以在官网搜到。

  目前还没使用到高级的功能,只使用了串口功能,上手感觉和51没太大差别。逻辑一致,需要注意的是里面一些寄存器的配置,跟51有些区别,可以在stc-isp下载器那里查询相关的程序,直接套用即可。

  使用串口之前要先看看相关的寄存器配置,直接套用网上的例程可能会出错。我本次使用了两个定时器,定时器1作为串口1的波特率发送器,另开定时器2作为计时使用。使用定时器要考虑寄存器的赋值问题,刚开始使用我在两个定时器的初始化函数里面都对AUXR寄存器进行了赋值,导致跑程序时AUXR的值在两个初始化函数里面切来切去,整个功能都无法实现。

单片机源程序如下:
/***************************************************/


void UartInit(void)        //9600bps@24.000MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x40;        //定时器1时钟为Fosc,即1T
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD |= 0x20;        //设定定时器1为8位自动重装方式
    TL1 = 0xB2;            //设定定时初值
    TH1 = 0xB2;            //设定定时器重装值
    //ET1 = 0;            //禁止定时器1中断
    EA = 1;             //开总中断
    TR1 = 1;            //启动定时器1
    ES=1;                //开串口中断
    SBUF='B';           //先往串口数据缓存器里面塞东西
}


注意里面AUXR寄存器的配置,搞清楚&=和|=的区别。


例如    0x40=0100 0000;  AUXR|=0x40;就是保证第2位(上图B6位)为1,而其他7位的数值不受影响;


           0xFE=1111 1110;AUXR &= 0xFE; 就是确保最后一位(上图B0)为0,其他7位的数值不受影响;


简单来说|=是为了把某个位 置1,而&=是为了把某个位 置0 ;


void usart_isr() interrupt 4  //串口1中断服务函数
{
  if(TI)          //判断发送
  {
    P22=!P22;
    TI=0;
  }
  if(RI)        //判断接收
  {
    P55=!P55;
    RI=0;
  }
}


void Send_string(uint dat)      //串口发送数据
{
  SBUF=dat;
  while(TI==0);


//while(!TI)    //另一种方式
   TI=0;
}


需要注意SBUF,这是51单片机的串口数据缓存器——两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。


当SBUF='a',说明往发送缓存器送了字符a,意味着发送。


当b=SBUF,说明b变量被赋了SBUF里面的数值,意味着接收。


/********************************************/


void Timer5Init(void)        //1毫秒@24.000MHz
{
     AUXR |= 0x44;        //定时器时钟1T模式   当时修改为0x44主要是怕对定时器1的配置造成干扰
    //AUXR |= 0x04;        //定时器时钟1T模式  原版
    T2L = 0x40;            //设置定时初值
    T2H = 0xA2;            //设置定时初值
    AUXR |= 0x10;        //定时器2开始计时
    IE2 = ET2;          //使能定时器中断
}
void TM2_Isr() interrupt 12 using 1
{
    count_flag++;
    if(count_flag==1000)
    {
     P24=!P24;
     count_flag=0;
     AUXINTIF &= ~T2IF; //清中断标志
    }                             
}


以上两个函数均从STC-ISP下载器里面的例程复制过来的。好资源要懂得利用。


要注意开启定时器的计时功能,要开启中断;之前忘了加进去了,查了一个晚上,还以为是寄存器干扰问题。经大佬指点才知道忘开中断了。*************************************    IE2 = ET2;          //使能定时器2中断

当多个函数共同使用到同一个寄存器时,要注意赋值问题,否则会出现多次重置寄存器的情况,导致程序跑飞。所以官网数据手册尤为重要,要清楚知道一个位的功能和作用

链接:
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:689044 发表于 2020-2-5 15:37 | 显示全部楼层
stc8官网数据手册错误好多,上了好多当
回复

使用道具 举报

ID:613800 发表于 2020-4-25 14:40 | 显示全部楼层
datianli 发表于 2020-2-5 15:37
stc8官网数据手册错误好多,上了好多当

额,可能哪里细节没注意到吧
回复

使用道具 举报

ID:675799 发表于 2020-5-2 17:17 来自手机 | 显示全部楼层
datianli 发表于 2020-2-5 15:37
stc8官网数据手册错误好多,上了好多当

都有什么错的地方
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表