欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5825|回復: 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 單片機教程網

快速回復 返回頂部 返回列表