| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
請教一個 C 語言中預(yù)處理的問題,望高人指教! | 
  
| 作者:石湖天隨 欄目:單片機 | 
我在做51單片機和PC的串口通訊時,寫了個通用的程序,TH1 是在頭文件中計算出來的,頭文件如下: #include <reg52.h> typedef unsigned CHAR INT8U; typedef unsigned int INT16U; #define UART_T1_WOKWAY 0x20 //串口工作時 T1 的工作方式設(shè)定 #define FOSE 12000000 //系統(tǒng)所用的晶振頻率(20M) #define BAUD_SET 1200 //串口波特率的設(shè)定 #define UART_SMOD 0x00 //SMOD 位的設(shè)定 0:0x00 1:0x80 #define UART_WOKWAY 0x40 //串口的工作方式設(shè)定 #if UART_SMOD == 0 #define UART_T1_VAL (256-(FOSE/(BAUD_SET*32*12))) //計算 TH1 的值 (SMOD = 0) 0xE6 #else #define UART_T1_VAL (256-(FOSE*2/(BAUD_SET*32*12))) //計算 TH1 的值 (SMOD = 1) #endif 問題是:程序編譯后 UART_T1_VAL 的值并不是 0xE6 而是 0x1D ,這是怎么回事啊,這方面我了解的并不多,希望高人指點,感激不盡。!  | 
  
| 2樓: | >>參與討論 | 
| 作者: jinbos 于 2005/10/20 12:14:00 發(fā)布:
         估計是溢出了  | 
  |
| 3樓: | >>參與討論 | 
| 作者: gossipxp 于 2005/10/20 13:40:00 發(fā)布:
         計算類型太復(fù)雜了  | 
  |
| 4樓: | >>參與討論 | 
| 作者: magic1983 于 2005/10/20 14:38:00 發(fā)布:
         我知道了!不是預(yù)處理的問題,是整數(shù)運算時溢出了 改寫下面兩行就行啦, #define FOSE 12000000l //系統(tǒng)所用的晶振頻率(20M) #define BAUD_SET 1200l //串口波特率的設(shè)定  | 
  |
| 5樓: | >>參與討論 | 
| 作者: 石湖天隨 于 2005/10/21 7:59:00 發(fā)布:
         謝謝樓上各位,我改下看看!  | 
  |
| 6樓: | >>參與討論 | 
| 作者: tyj_3 于 2005/10/21 11:57:00 發(fā)布:
         magic1983,說的是  | 
  |
| 7樓: | >>參與討論 | 
| 作者: isoar 于 2005/10/21 12:21:00 發(fā)布:
         你需要在表達式里添加“(unsigned CHAR)”這樣的東西 下面是我的669用的波特率計算編譯預(yù)處理,你可以參考一下,不過這個波特率的算法和你用的不一樣: #define FOSC 20000000ul //11059200ul #define BAUD 19200 #define BRGR1_VAL (unsigned CHAR)((FOSC/BAUD-16)/256) #define BRGR0_VAL (unsigned CHAR)((FOSC/BAUD-16)%256)  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |