1. 程式人生 > 實用技巧 >微控制器成長之路(51基礎篇) - 029 STC89C52.h

微控制器成長之路(51基礎篇) - 029 STC89C52.h

感覺stc89c51的庫不好用,自己寫了個:

  1 #ifndef __STC89C52_H_
  2 #define __STC89C52_H_
  3 /* Above is STC additional SFR */
  4 // --------------------------------------------------------------------
  5 /* Registers */
  6 sfr P0        = 0x80;            // Port 0
  7 sfr SP        = 0x81;            // 堆疊指標
  8 sfr DPL        = 0x82
; // 資料指標(低) 9 sfr DPH = 0x83; // 資料指標(高) 10 sfr PCON = 0x87; // 電源控制暫存器 11 sfr TCON = 0x88; // 定時器控制暫存器 12 sfr TMOD = 0x89; // 定時器控制暫存器 13 sfr TL0 = 0x8A; // 定時器0低8位暫存器 14 sfr TL1 = 0x8B; // 定時器1低8位暫存器 15 sfr TH0 = 0x8C
; // 定時器0高8位暫存器 16 sfr TH1 = 0x8D; // 定時器1高8位暫存器 17 sfr AUXR = 0x8E; // 輔助暫存器 18 sfr P1 = 0x90; // Port 1 19 sfr SCON = 0x98; // 串列埠控制暫存器 20 sfr SBUF = 0x99; // 串列埠資料快取器 21 sfr P2 = 0xA0; // Port 2 22 sfr AUXR1 = 0xA2
; // 輔助暫存器 23 sfr IE = 0xA8; // 中斷允許暫存器 24 sfr SADDR = 0xA9; // 從地址暫存器 25 sfr P3 = 0xB0; // Port 3 26 sfr IPH = 0xB7; // 中斷優先順序暫存器(高) 27 sfr IP = 0xB8; // 中斷優先順序暫存器(低) 28 sfr SADEN = 0xB9; // 中斷優先順序暫存器(低) 29 sfr XICON = 0xC0; // Auxiliary Interrupt Control 30 sfr T2CON = 0xC8; // Timer/Counter 2 Mode 31 sfr T2MOD = 0xC9; // Timer/Counter 2 Mode 32 sfr RCAP2L = 0xCA; // Timer/Counter 2 Reload/Capture Low Byte 33 sfr RCAP2H = 0xCB; // Timer/Counter 2 Reload/Capture High Byte 34 sfr TL2 = 0xCC; // Timer/Counter Low Byte 35 sfr TH2 = 0xCD; // Timer/Counter High Byte 36 sfr PSW = 0xD0; // 程式狀態暫存器 37 sfr ACC = 0xE0; // 累加器 38 sfr WDT_CONTR = 0xe1; // 看門狗控制暫存器 39 sfr ISP_DATA = 0xe2; // ISP/IAP 資料暫存器 40 sfr ISP_ADDRH = 0xe3; // ISP/IAP 高8位地址暫存器 41 sfr ISP_ADDRL = 0xe4; // ISP/IAP 低8位地址暫存器 42 sfr ISP_CMD = 0xe5; // ISP/IAP 命令暫存器 43 sfr ISP_TRIG = 0xe6; // ISP/IAP 命令觸發暫存器 44 sfr ISP_CONTR = 0xe7; // ISP/IAP 控制暫存器 45 sfr P4 = 0xe8; // Port 4 46 sfr B = 0xF0; // B 暫存器 47 // -------------------------------------------------------------------- 48 /* Bit definition */ 49 // ----------------------------------- 50 // Bit 51 # define Bit0 0x01 52 # define Bit1 0x02 53 # define Bit2 0x04 54 # define Bit3 0x08 55 # define Bit4 0x10 56 # define Bit5 0x20 57 # define Bit6 0x40 58 # define Bit7 0x80 59 // ----------------------------------- 60 // sfr P0 = 0x80; // Port 0 61 sBit P00 = P0^0; 62 # define set_P00 P00=1 63 # define cle_P00 P00=0 64 # define git_P00 P00 65 sBit P01 = P0^1; 66 # define set_P01 P01=1 67 # define cle_P01 P01=0 68 # define git_P01 P01 69 sBit P02 = P0^2; 70 # define set_P02 P02=1 71 # define cle_P02 P02=0 72 # define git_P02 P02 73 sBit P03 = P0^3; 74 # define set_P03 P03=1 75 # define cle_P03 P03=0 76 # define git_P03 P03 77 sBit P04 = P0^4; 78 # define set_P04 P04=1 79 # define cle_P04 P04=0 80 # define git_P04 P04 81 sBit P05 = P0^5; 82 # define set_P05 P05=1 83 # define cle_P05 P05=0 84 # define git_P05 P05 85 sBit P06 = P0^6; 86 # define set_P06 P06=1 87 # define cle_P06 P06=0 88 # define git_P06 P06 89 sBit P07 = P0^7; 90 # define set_P07 P07=1 91 # define cle_P07 P07=0 92 # define git_P07 P07 93 // ----------------------------------- 94 // sfr PCON = 0x87; // 電源控制暫存器 95 // IDL 96 # define set_IDL (PCON | Bit0) // 進入IDLE模式(空閒),除系統不給CPU供時鐘,cpu不執行指令,其餘功能部件仍可繼續工作,可由任何一箇中斷喚醒。 97 # define cle_IDL (PCON & (~Bit0)) // 預設(關閉) 98 # define git_IDL (Bit0 == (PCON&Bit0)) 99 // PD 100 # define set_PD (PCON | Bit1) // 進入Power Down模式(停機,掉電),可以外部中斷低電平觸發或下降沿觸發喚醒,進入掉電模式時,內部時鐘停振,由於無時鐘CPU、定時器、序列口等功能部件停止工作,只有外部中斷繼續工作。停電模式可由外部中斷喚醒,中斷返回後,繼續執行原程式。掉電模式也叫停機模式,此時功耗 < 0.1uA。 101 # define cle_PD (PCON & (~Bit1)) // 預設(關閉) 102 # define git_PD (Bit1 == (PCON&Bit1)) 103 // DF0:通用工作標誌位,使用者可以任意使用 104 # define set_DF0 (PCON | Bit2) 105 # define cle_DF0 (PCON &(~Bit2)) 106 # define git_DF0 (Bit2 == (PCON&Bit2)) 107 // DF1:通用工作標誌位,使用者可以任意使用 108 # define set_DF1 (PCON | Bit3) 109 # define cle_DF1 (PCON &(~Bit3)) 110 # define git_DF1 (Bit3 == (PCON&Bit3)) 111 // POF:啟動標誌位(啟動時判斷:0為軟復位,1位冷啟動上電覆位) 112 # define set_POF (PCON | Bit4) // 判斷結果為:冷啟動 113 # define cle_POF (PCON & (~Bit4)) // 判斷結果為:熱啟動 114 # define git_POF (Bit4 == (PCON&Bit4)) 115 // 串列埠部分(SMOD 和 SMOD0) 116 // SMOD0:幀錯誤檢測有效控制位。 117 # define set_SMOD0 (PCON | Bit6) // SCON 暫存器中的SM0/FE位用於FE(幀錯誤檢測)功能; 118 # define cle_SMOD0 (PCON &(~Bit6)) // SCON 暫存器中的SM0/FE位用於SM0功能,和SM1一起指定串列埠的工作方式。復位時SMOD0 = 0; 119 # define git_POF (Bit6 == (PCON&Bit6)) 120 // SMOD:波特率選擇位。當SMOD 121 # define set_SMOD (PCON | Bit7) // 是串列埠通訊方式1、2、3的波特率加倍 122 # define cle_SMOD (PCON &(~Bit7)) // 所有串列埠通訊方式的波特率加倍,復位時 SMOD = 0 123 # define git_POF (Bit7 == (PCON&Bit7)) 124 // ----------------------------------- 125 // sfr TCON = 0x88; // 定時器控制暫存器 126 sBit IT0 = TCON^0; // 外部中斷0觸發方式 127 # define set_IT0 IT0=1 // 下降沿觸發 128 # define cle_IT0 IT0=0 // 低電平觸發 129 # define git_IT0 IT0 130 sBit IE0 = TCON^1; // 外部中斷0請求標誌位,當IE0=1外部中斷0向CPU請求中斷,當CPU響應外部中斷時,由硬體清 0(觸發方式為邊沿觸發) 131 # define set_IE0 IE0=1 // CPU中斷請求 132 # define cle_IE0 IE0=0 // 已清零 133 # define git_IE0 IE0 134 sBit IT1 = TCON^2; // 外部中斷1觸發方式 135 # define set_IT1 IT1=1 // 下降沿觸發 136 # define cle_IT1 IT1=0 // 低電平觸發 137 # define git_IT1 IT1 138 sBit IE1 = TCON^3; // 外部中斷1請求標誌位,當IE1=1外部中斷1向CPU請求中斷,當CPU響應外部中斷時,由硬體清 0(觸發方式為邊沿觸發) 139 # define set_IE1 IE1=1 // CPU中斷請求 140 # define cle_IE1 IE1=0 // 已清零 141 # define git_IE1 IE1 142 sBit TR0 = TCON^4; // 定時器0的執行控制位 143 # define set_TR0 TR0=1 // 允許 T0 開始計數 144 # define cle_TR0 TR0=0 // 禁止 T0 計數 145 # define git_TR0 TR0 146 sBit TF0 = TCON^5; // 定時器/計數器 T0 溢位中斷標誌位 147 # define set_TF0 TF0=1 // 定時器溢位 148 # define cle_TF0 TF0=0 // 硬體清零 149 # define git_TF0 150 sBit TR1 = TCON^6; // 定時器1的執行控制位 151 # define set_TR1 TR1=1 // 允許 T1 開始計數 152 # define cle_TR1 TR1=0 // 禁止 T1 計數 153 # define git_TR1 TR1 154 sBit TF1 = TCON^7; 155 # define set_TF1 TF1=1 156 # define cle_TF1 TF1=0 157 # define git_TF1 TF1 158 // ----------------------------------- 159 // sfr TMOD = 0x89; // 定時器控制暫存器 160 // Time0 // 定時器/計數器0 161 // Time0_M0 模式選擇(低) 162 # define set_Count0_M0 (TMOD | Bit0) 163 # define cle_Count0_M0 (TMOD &(~Bit0)) 164 # define git_Count0_M0 (Bit0 == (TMOD&Bit0)) 165 // Time0_M1 模式選擇(高) 166 # define set_Count0_M1 (TMOD | Bit1) 167 # define cle_Count0_M1 (TMOD &(~Bit1)) 168 # define git_Count0_M1 (Bit1 == (TMOD&Bit1)) 169 // C/T0:T0 計數器的時鐘輸入方式選擇 170 # define set_Count0_CT0 (TMOD | Bit2) // 電平來源(外部) 171 # define cle_Count0_CT0 (TMOD &(~Bit2)) // 內部時鐘(內部時鐘6/12分頻) 172 # define git_Count0_CT0 (Bit2 == (TMOD&Bit2)) 173 // GATE0:門控制位置 174 # define set_Count0_GATE (TMOD | Bit3) // 要用軟體使 TR 或 TR 為1,可以啟動定時器/計數器 175 # define cle_Count0_GATE (TMOD &(~Bit3)) // 只要用軟體TCON中的 TR* 暫存器為1,就可以啟動計數器工作 176 # define git_Count0_GATE (Bit3 == (TMOD&Bit3)) 177 // Time1 // 定時器/計數器0 178 // Time1_M0 模式選擇(低) 179 # define set_Count1_M0 (TMOD | Bit4) 180 # define cle_Count1_M0 (TMOD &(~Bit4)) 181 # define git_Count1_M0 (Bit4 == (TMOD&Bit4)) 182 // Time1_M1 模式選擇(高) 183 # define set_Count1_M1 (TMOD | Bit5) 184 # define cle_Count1_M1 (TMOD &(~Bit5)) 185 # define git_Count1_M1 (Bit5 == (TMOD&Bit5)) 186 // C/T1:T1 計數器的時鐘輸入方式選擇 187 # define set_Count1_CT1 (TMOD | Bit6) // 電平來源(外部) 188 # define cle_Count1_CT1 (TMOD &(~Bit6)) // 內部時鐘(內部時鐘6/12分頻) 189 # define git_Count0_CT1 (Bit6 == (TMOD&Bit6)) 190 // GATE1:門控制位置 191 # define set_Count1_GATE (TMOD | Bit7) // 要用軟體使 TR 或 TR 為1,可以啟動定時器/計數器 192 # define cle_Count1_GATE (TMOD &(~Bit7)) // 只要用軟體TCON中的 TR* 暫存器為1,就可以啟動計數器工作 193 # define git_Count1_GATE (Bit7 == (TMOD&Bit7)) 194 // 定時器模式配置 195 // Time0 196 # define Time0_mode_0 cle_Count0_M1;cle_Count0_M0 197 # define Time0_mode_1 cle_Count0_M1;set_Count0_M0 198 # define Time0_mode_2 set_Count0_M1;cle_Count0_M0 199 # define Time0_mode_3 set_Count0_M1;set_Count0_M0 200 // Time1 201 # define Time1_mode_0 cle_Count1_M1;cle_Count1_M0 202 # define Time1_mode_1 cle_Count1_M1;set_Count1_M0 203 # define Time1_mode_2 set_Count1_M1;cle_Count1_M0 204 # define Time1_mode_3 set_Count1_M1;set_Count1_M0 205 // ----------------------------------- 206 // sfr AUXR = 0x8E; // 輔助暫存器 207 // ALEOFF/P4.5 // ALE 訊號輸出控制使能 208 # define set_ALEOFF (AUXR|Bit0) // 為P4.5引腳 209 # define cle_ALEOFF (AUXR&(~Bit0)) // 設定為 ALE 輸出引腳 210 # define git_ALEOFF (Bit0 == (AUXR&Bit0)) 211 // EXTRAM 內部/外部RAM存取控制 212 # define set_EXTRAM (AUXR|Bit1) // 內部擴充套件的 EXTRAM 可以存取 213 # define cle_EXTRAM (AUXR&(~Bit1) // 外部資料存取儲存器 214 # define git_EXTRAM (Bit1 == (AUXR&Bit1)) 215 // ----------------------------------- 216 // sfr P1 = 0x90; // Port 1 217 sBit P10 = P1^0; 218 # define set_P10 P10=1 219 # define cle_P10 P10=0 220 # define git_P10 P10 221 sBit P11 = P1^1; 222 # define set_P11 P11=1 223 # define cle_P11 P11=0 224 # define git_P11 P11 225 sBit P12 = P1^2; 226 # define set_P12 P12=1 227 # define cle_P12 P12=0 228 # define git_P12 P12 229 sBit P13 = P1^3; 230 # define set_P13 P13=1 231 # define cle_P13 P13=0 232 # define git_P13 P13 233 sBit P14 = P1^4; 234 # define set_P14 P14=1 235 # define cle_P14 P14=0 236 # define git_P14 P14 237 sBit P15 = P1^5; 238 # define set_P15 P15=1 239 # define cle_P15 P15=0 240 # define git_P15 P15 241 sBit P16 = P1^6; 242 # define set_P16 P16=1 243 # define cle_P16 P16=0 244 # define git_P16 P16 245 sBit P17 = P1^7; 246 # define set_P17 P17=1 247 # define cle_P17 P17=0 248 # define git_P17 P17 249 // -------------- 250 sBit T2 = P1^0; 251 # define set_T2 T2=1 252 # define cle_T2 T2=0 253 # define git_T2 T2 254 sBit T2EX = P1^1; 255 # define set_T2EX T2EX=1 256 # define cle_T2EX T2EX=0 257 # define git_T2EX T2EX 258 // ----------------------------------- 259 // sfr SCON = 0x98; // 串列埠控制暫存器 260 sBit RI = SCON^0; // 序列口1接受中斷標誌位。若序列口1允許接受且以方式0工作,則每當接受到第8位資料時置1;若以方式1、2、3工作且SM2=0時,則每當接受到停止位的中間時置1當串列埠以方式1、2、3工作且SM2=1時,則僅當接收到第9位資料RB8位1後,同時還要接受到停止位的中間時置1。RI為1表示序列口1正向CPU申請中斷(接受中斷)。RI必須由使用者的中斷服務程式清零。 261 # define set_RI RI=1 // 向CPU申請中斷(需要使用者清理申請RI=0) 262 # define cle_RI RI=0 // 使用者已經清理 263 # define git_RI RI 264 sBit TI = SCON^1; // 序列口1傳送中斷標誌。序列口1以方式0傳送完8位資料,由硬體置1;若以方式1、方式2或方式3傳送時,在傳送停止位的開始時置1。TI=1表示序列口1正在向CPU申請中斷(傳送中斷) 。值得注意的是,CPU響應傳送中斷請求,轉向執行中斷服務程式時並不將TI清零,TI必須由使用者在中斷服務程式中清零。 265 # define set_TI TI=1 // 向CPU申請中斷(需要使用者清理申請TI=0) 266 # define cle_TI TI=0 // 使用者已經清理 267 # define git_TI TI 268 sBit RB8 = SCON^2; // 在方式2或方式3,是接收到的第9位資料,按需求由軟體置位或清零。例如,可用作資料的校驗位或多機通訊中表示地址幀/資料幀的標誌位。 269 # define set_RB8 RB8=1 270 # define cle_RB8 RB8=0 271 # define git_RB8 RB8 272 sBit TB8 = SCON^3; // 在方式2或方式3,它為要傳送的第9位資料,按需求由軟體置位或清零。例如,可用作資料的檢驗位或多機通訊中表示地址幀/資料幀的標誌位。 273 # define set_TB8 TB8=1 274 # define cle_TB8 TB8=0 275 # define git_TB8 TB8 276 sBit REN = SCON^4; // 允許/禁止 序列接收控制位。由軟體置位 REN,即 REN=1 為允許序列接收狀態,可啟動序列接收器 RxD,開始接收資訊。軟體復位 REN,即 REN=0,則禁止接收。 277 # define set_REN REN=1 // 允許串列埠接收 278 # define cle_REN REN=0 // 禁止串列埠接收 279 # define git_REN REN 280 sBit SM2 = SCON^5; // 允許方式2或方式3多級通訊控制位。在方式2或方式3時,如 SM2 位為1,REN位為1,則從機處於只有接收到RB8位為1(地址幀)時才啟用中斷申請標誌位RI位1,並向主機請求中斷處理。被確認為定址的從機則復位SM2為1,則只有在接收到有效的停止位時才置位中斷請求標誌位RI為1;在方式0時,SM2應為0。 281 # define set_SM2 SM2=1 // 在方式2或方式3時,如 SM2 位為1,REN位為1,則從機處於只有接收到RB8位為1(地址幀)時才啟用中斷申請標誌位RI位1,並向主機請求中斷處理。被確認為定址的從機則復位SM2為1,則只有在接收到有效的停止位時才置位中斷請求標誌位RI為1; 282 # define cle_SM2 SM2=0 // 在方式0時,SM2應為0。 283 # define git_SM2 SM2 284 sBit SM1 = SCON^6; // 串列埠的工作方式(高位) 285 # define set_SM1 SM1=1 286 # define cle_SM1 SM1=0 287 # define git_SM1 SM1 288 sBit FE = SCON^7; // alternatively "FE" 當PCON暫存器中的SMOD0/PCON.6位為1時,該位用於幀錯誤檢測。當檢測到一個無效停止位時,通過UART接收器設定改位。它必須由軟體清零。 289 # define set_FE FE=1 290 # define cle_FE FE=0 291 # define git_FE FE 292 sBit SM0 = SCON^7; // 串列埠的工作方式(低位) 當PCON暫存器中的SMOD0/PCON.6位為0時,該位和SM1一起指定序列通訊的工作方式如下: 293 # define set_SM0 SM0=1 294 # define cle_SM0 SM0=0 295 # define git_SM0 SM0 296 // SM0、SM1 工作方式 297 // 當微控制器工作在12T 模式時,定時器1的溢位率 = sysclk/12/(256 - TH1) 298 // 當微控制器工作在 6T 模式時,定時器1的溢位率 = sysclk/ 6/(256 - TH1) 299 #define UART0_mode_0 cle_SM0;cle_SM1 // 方式0,同步移位序列方式;移位暫存器 波特率時sysclk/12 300 #define UART0_mode_1 cle_SM0;set_SM1 // 方式1,8位UART,波特率可變 ((2^SMOD)/32)x(定時器1的溢位率) 301 #define UART0_mode_2 set_SM0;cle_SM1 // 方式2,9位UART ((2^SMOD)/64)xSYSclk系統工作時鐘頻率) 302 #define UART0_mode_3 set_SM0;set_SM1 // 方式3,9位UART, 波特率可變 ((2^SMOD)/32)x(定時器1的溢位率) 303 // ----------------------------------- 304 // sfr P2 = 0xA0; // Port 2 305 sBit P20 = P2^0; 306 # define set_P20 P20=1 307 # define cle_P20 P20=0 308 # define git_P20 P20 309 sBit P21 = P2^1; 310 # define set_P21 P21=1 311 # define cle_P21 P21=0 312 # define git_P21 P21 313 sBit P22 = P2^2; 314 # define set_P22 P22=1 315 # define cle_P22 P22=0 316 # define git_P22 P22 317 sBit P23 = P2^3; 318 # define set_P23 P23=1 319 # define cle_P23 P23=0 320 # define git_P23 P23 321 sBit P24 = P2^4; 322 # define set_P24 P24=1 323 # define cle_P24 P24=0 324 # define git_P24 P24 325 sBit P25 = P2^5; 326 # define set_P25 P25=1 327 # define cle_P25 P25=0 328 # define git_P25 P25 329 sBit P26 = P2^6; 330 # define set_P26 P26=1 331 # define cle_P26 P26=0 332 # define git_P26 P26 333 sBit P27 = P2^7; 334 # define set_P27 P27=1 335 # define cle_P27 P27=0 336 # define git_P27 P27 337 // ----------------------------------- 338 // 此係列微控制器有兩個16-bit資料指標,DPTR0,DPTR1,當 DPS 選擇位為0時,選擇DPTR0,當 DPS 選擇位為1時,選擇DPTR1. 339 // AUXR1 特殊功能暫存器,位於A2H單元,其中的位不可用布林指標快速訪問,但由於DPS位位於bit0,故對AUXR1暫存器用INC指令,DPS位便會翻轉,由0變成1或由1變成0,即可實現雙資料指標的快速切換。 340 // sfr AUXR1 = 0xA2; // 輔助暫存器 雙資料指標功能暫存器 341 // DPS DPTR 暫存器選擇 342 # define set_DPS (AUXR1|Bit0) // DPTR0 被選擇 343 # define cle_DPS (AUXR1&(~Bit0)) // DPTR1 被選擇 344 # define git_DPS (Bit0 == (AUXR1&Bit0)) 345 // GF2: 通用工作標誌位,使用者可以任意使用。 346 # define set_GF2 (AUXR1|Bit3) 347 # define cle_GF2 (AUXR1&(~Bit3)) 348 # define git_GF2 (Bit3 == (AUXR1&Bit3)) 349 // ----------------------------------- 350 // sfr IE = 0xA8; // 中斷允許控制暫存器 351 // 外部中斷0中斷允許位。 352 sBit EX0 = IE^0; 353 # define set_EX0 EX0=1 // 允許中斷 354 # define cle_EX0 EX0=0 // 禁止中斷 355 # define git_EX0 EX0 356 // T0的溢位中斷允許位。 357 sBit ET0 = IE^1; 358 # define set_ET0 ET0=1 // 允許T0中斷 359 # define cle_ET0 ET0=0 // 禁止T0中斷 360 # define git_ET0 ET0 361 // 外部中斷1中斷允許位。 362 sBit EX1 = IE^2; 363 # define set_EX1 EX1=1 // 允許外部中斷1中斷 364 # define cle_EX1 EX1=0 // 禁止外部中斷1中斷 365 # define git_EX1 EX1 366 // 定時/計數器 T1 的溢位中斷允許位。 367 sBit ET1 = IE^3; 368 # define set_ET1 ET1=1 // 允許T1中斷 369 # define cle_ET1 ET1=0 // 禁止T1中斷 370 # define git_ET1 ET1 371 // 序列口1中斷允許位。 372 sBit ES = IE^4; 373 # define set_ES ES=1 // 允許序列口1中斷 374 # define cle_ES ES=0 // 禁止序列口1中斷 375 # define git_ES ES 376 // 定時/計數器 T2 的溢位中斷允許位。 377 sBit ET2 = IE^5; 378 # define set_ET2 ET2=1 // 允許T2中斷 379 # define cle_ET2 ET2=0 // 禁止T2中斷 380 # define git_ET2 ET2 381 // 低壓檢測中斷 382 sBit EC = IE^6; 383 # define set_EC EC=1 384 # define cle_EC EC=0 385 # define git_EC EC 386 // CPU的總中斷允許控制位, 387 sBit EA = IE^7; 388 # define set_EA EA=1 // CPU 開放中斷 389 # define cle_EA EA=0 // CPU遮蔽所有中斷申請。 390 # define git_EA EA 391 // ----------------------------------- 392 // sfr P3 = 0xB0; // Port 3 393 sBit P30 = P3^0; // P30 394 # define set_P30 P30=1 395 # define cle_P30 P30=0 396 # define git_P30 P30 397 sBit RxD = P30; // 串列埠1接收引腳 398 # define set_P30 P30=1 399 # define cle_P30 P30=0 400 # define git_P30 P30 401 sBit P31 = P3^1; // P31 402 # define set_P31 P31=1 403 # define cle_P31 P31=0 404 # define git_P31 P31 405 sBit TxD =P31; // 串列埠1傳送引腳 406 # define set_P31 P31=1 407 # define cle_P31 P31=0 408 # define git_P31 P31 409 sBit P32 = P3^2; // P32 410 # define set_P32 P32=1 411 # define cle_P32 P32=0 412 # define git_P32 P32 413 sBit INT0 = P3^2; // INT0:外部中斷0,下降沿中斷或低電平中斷 414 # define set_INT0 INT0=1 415 # define cle_INT0 INT0=0 416 # define git_INT0 INT0 417 sBit P33 = P3^3; // P33 418 # define set_P33 P33=1 419 # define cle_P33 P33=0 420 # define git_P33 P33 421 sBit INT0 = P3^3; // INT0:外部中斷1,下降沿中斷或低電平中斷 422 # define set_INT1 INT1=1 423 # define cle_INT1 INT1=0 424 # define git_INT1 INT1 425 sBit P34 = P3^4; // P34 426 # define set_P34 P34=1 427 # define cle_P34 P34=0 428 # define git_P34 P34 429 sBit T0 = P3^4 // 定時器/計數器 0 的外部輸入 430 # define set_T0 T0=1 431 # define cle_T0 T0=0 432 # define git_T0 T0 433 sBit P35 = P3^5; // P35 434 # define set_P35 P35=1 435 # define cle_P35 P35=0 436 # define git_P35 P35 437 sBit T1 = P3^5; // 定時器/計數器 1 的外部輸入 438 # define set_T1 T1=1 439 # define cle_T1 T1=0 440 # define git_T1 T1 441 sBit P36 = P3^6; // P36 442 # define set_P36 P36=1 443 # define cle_P36 P36=0 444 # define git_P36 P36 445 sBit WR = P3^6; // 外部資料儲存寫脈衝 446 # define set_WR WR=1 447 # define cle_WR WR=0 448 # define git_WR WR 449 sBit P37 = P3^7; // P37 450 # define set_P37 P37=1 451 # define cle_P37 P37=0 452 # define git_P37 453 sBit RD = P3^7; // 外部資料儲存器讀脈衝 454 # define set_RD RD=1 455 # define cle_RD RD=0 456 # define git_RD RD 457 // ----------------------------------- 458 // sfr IPH = 0xB7; // 中斷優先順序暫存器(高) 459 // PT0H:外部中斷0優先順序配置位(高) 460 # define set_PX0H (IPH |Bit0) 461 # define cle_PX0H (IPH &(~Bit0)) 462 # define git_PX0H (Bit0 == (IPH&Bit0)) 463 // PX0H:計數器0優先順序配置位(高) 464 # define set_PT0H (IPH |Bit1) 465 # define cle_PT0H (IPH &(~Bit1)) 466 # define git_PT0H (Bit1 == (IPH&Bit1)) 467 // PT1H:外部中斷1優先順序配置位(高) 468 # define set_PX1H (IPH |Bit2) 469 # define cle_PX1H (IPH &(~Bit2)) 470 # define git_PX1H (Bit2 == (IPH&Bit2)) 471 // PX1H:計數器1優先順序配置位(高) 472 # define set_PT1H (IPH |Bit3) 473 # define cle_PT1H (IPH &(~Bit3)) 474 # define git_PT1H (Bit3 == (IPH&Bit3)) 475 // PSH:串列埠優先順序配置位(高) 476 # define set_PSH (IPH |Bit4) 477 # define cle_PSH (IPH &(~Bit4)) 478 # define git_PSH (Bit4 == (IPH&Bit4)) 479 // PT2H:定時器2中斷優先順序控制位(高) 480 # define set_PT2H (IPH |Bit5) 481 # define cle_PT2H (IPH &(~Bit5)) 482 # define git_PT2H (Bit5 == (IPH&Bit5)) 483 // PX2H:外部中斷2優先順序控制位(高) 484 # define set_PX2H (IPH |Bit6) 485 # define cle_PX2H (IPH |(~Bit6)) 486 # define git_PX2H (Bit6 == (IPH&Bit6)) 487 // PX3H:外部中斷3優先順序控制位(高) 488 # define set_PX3H (IPH |Bit7) 489 # define cle_PX3H (IPH &(~Bit7)) 490 # define git_PX3H (Bit7 == (IPH&Bit7)) 491 // ----------------------------------- 492 // sfr IP = 0xB8; // 中斷優先順序暫存器(低) 493 sBit PX0 = IP^0; // 外部中斷0優先順序控制位(低) 494 # define set_PX0 PX0=1 495 # define cle_PX0 PX0=0 496 # define git_PX0 PX0 497 sBit PT0 = IP^1; // 定時器0中斷優先順序控制位(低) 498 # define set_PT0 PT0=1 499 # define cle_PT0 PT0=0 500 # define git_PT0 PT0 501 sBit PX1 = IP^2; // 外部中斷1優先順序控制位(低) 502 # define set_PX1 PX1=1 503 # define cle_PX1 PX1=0 504 # define git_PX1 PX1 505 sBit PT1 = IP^3; // 定時器1中斷優先順序控制位(低) 506 # define set_PX1 PX1=1 507 # define cle_PX1 PX1=0 508 # define git_PX1 PX1 509 sBit PS = IP^4; // 串列埠優先順序配置位(低) 510 # define set_PS PS=1 511 # define cle_PS PS=0 512 # define git_PS PS 513 sBit PT2 = IP^5; // 定時器2中斷優先順序控制位(低) 514 # define set_PT2 PT2=1 515 # define cle_PT2 PT2=0 516 # define git_PT2 PT2 517 // ----------------------------------- 518 // sfr XICON = 0xC0; // Auxiliary Interrupt Control 519 // IT2:外部中斷2中斷源型別選擇位。IT2=0,(~INT2)/P4.3 引腳上的低電平可觸發外部中斷2。IT2=1,外部中斷2為下降沿觸發方式。 520 # define set_IT2 IT2=1 521 # define cle_IT2 IT2=0 522 # define git_IT2 IT2 523 // IE2:外部中斷2中斷申請標誌位,中斷條件成立後,IE2=1,可由硬體自動復位。 524 # define set_IE2 IE2=1 525 # define cle_IE2 IE2=0 526 # define git_IE2 IE2 527 // EX2:如被設定成1,允許外部中斷2中斷;如被清成0,禁止外部中斷2中斷。 528 # define set_EX2 EX2=1 529 # define cle_EX2 EX2=0 530 # define git_EX2 EX2 531 // PX2:置位表明外部中斷2的優先順序為高,優先順序最終由[PX2H,PX2]=[0,0],[0,1],[1,0],[1,1]來表決。 532 # define set_PX2 PX2=1 533 # define cle_PX2 PX2=0 534 # define git_PX2 PX2 535 // IT3:外部中斷3中斷請求標誌位。IT3=0,(~INT3)/P4.2引腳上的低電平可觸發外部中斷3。IT3=1,外部中斷3為下降沿觸發方式。 536 # define set_IT3 IT3=1 537 # define cle_IT3 IT3=0 538 # define git_IT3 IT3 539 // IE3:外部中斷3中斷源請求標誌位,中斷條件成立後,IE3=1,可由硬體自動清零。 540 # define set_IE3 IE3=1 541 # define cle_IE3 IE3=0 542 # define git_IE3 IE3 543 // EX3:如被設定成1,允許外部中斷3中斷;如被清零,禁止外部中斷2中斷。 544 # define set_EX3 EX3=1 545 # define cle_EX3 EX3=0 546 # define git_EX3 EX3 547 // PX3:置位表明外部中斷3的優先順序為高,優先順序最終由[PX3H,PX3]=[0,0],[0,1],[1,0],[1,1]來決定。 548 # define set_PX3 PX3=1 549 # define cle_PX3 PX3=0 550 # define git_PX3 PX3 551 // ----------------------------------- 552 // sfr T2CON = 0xC8; // Timer/Counter 2 Mode 553 // CP/(~RL2):捕獲/從裝標誌。置位:EXEN=1時,T2EX的負跳變產生捕獲。清零:EXEN2=0時,定時器2溢位或T2EX的負跳變都可使定時器自動重灌。當RCLK=1或TCLK=1時,該位無效且定時器強制為溢位時自動重灌。 554 sBit CP_RL2= T2CON^0; 555 # define set_CP_RL2 CP_RL2=1 556 # define cle_CP_RL2 CP_RL2=0 557 # define git_CP_RL2 CP_RL2 558 // C/T2:定時器/計數器選擇。(定時器2) 559 sBit C_T2 = T2CON^1; 560 # define set_C_T2 C_T2=1 // 外部事件計數器(下降沿觸發) 561 # define cle_C_T2 C_T2=0 // 內部定時器(OSC/12或OSC/6) 562 # define git_C_T2 C_T2 563 // TR2:定時器2啟動/停止控制位。置1時啟動定時器。 564 sBit TR2 = T2CON^2; 565 # define set_TR2 TR2=1 566 # define cle_TR2 TR2=0 567 # define git_TR2 TR2 568 // EXEN2:定時器2外部使能標誌。當其置位且定時器2未作為串列埠時鐘時,允許T2EX的負跳變產生捕獲或重灌。EXEN2=0時,T2EX的跳變對定時器2無效。 569 sBit EXEN2 = T2CON^3; 570 # define set_EXEN2 EXEN2=1 571 # define cle_EXEN2 EXEN2=0 572 # define git_EXEN2 EXEN2 573 // TCLK:傳送時鐘標誌。TCLK置位時,定時器2的溢位脈衝作為序列口模式1和模式3的傳送時鐘。TCLK=0時,將定時器1的溢位脈衝作為傳送時鐘。 574 sBit TCLK = T2CON^4; 575 # define set_TCLK TCLK=1 576 # define cle_TCLK TCLK=0 577 # define git_TCLK TCLK 578 // RCLK:接收時鐘標誌。RCLK置位時,定時器2的溢位脈衝作為序列口模式1和模式3的接收時鐘。TCLK=0時,將定時器1的溢位脈衝作為接收時鐘。 579 sBit RCLK = T2CON^5; 580 # define set_RCLK RCLK=1 581 # define cle_RCLK RCLK=0 582 # define git_RCLK RCLK 583 // EXF2:定時器2外部中斷標誌。當EXNE2=1且T2EX的負跳變產生捕獲或重灌時,EXF2置位。定時器2中斷使能時,EXF2=1將使CPU從中斷向量處執行定時器2中斷子程式。EXF2位必須用軟體清零在遞增/遞減計數器模式(DCEN=1)中,EXF2不會引起中斷。 584 # define git_EXF2 EXF2=1 585 # define cle_EXF2 EXF2=0 586 # define git_EXF2 EXF2 587 // TF2:定時器2溢位標誌。定時器2溢位時置位,必須由軟體清零。當RCLK或TCLK=1時,TF2將不會置位。 588 sBit TF2 = T2CON^7; 589 # define git_TF2 TF2=1 590 # define cle_TF2 TF2=0 591 # define git_TF2 TF2 592 // ----------------------------------- 593 // sfr T2MOD = 0xC9; // Timer/Counter 2 Mode 594 // DECN:向下計數使能位。定時器2 可配置成向上/向下計數器。(使用者勿將其置1。這些位在將來80C51系列產品中用來實現新特性。在這種情況下,以後用到保留位,復位時或有效狀態時,它的值應為0;而這些位有效狀態時,它的值為1。從保留位讀到的值是不確定的。) 595 # define git_DECN (T2MOD|Bit0) 596 # define cle_DECN (T2MOD&(~Bit0)) 597 # define git_DECN (Bit0 == (T2MOD&Bit0)) 598 // T2OE:定時器2輸出使能位。 599 # define git_T2OE (T2MOD|Bit1) 600 # define cle_T2OE (T2MOD&(~Bit1)) 601 # define git_T2OE (Bit1 == (T2MOD&Bit1)) 602 // ----------------------------------- 603 // sfr PSW = 0xD0; // 程式狀態暫存器 604 // 奇偶標誌位。該標誌位始終體現累加器ACC中1的個數的奇偶性。如果累加器ACC中1的個數位奇數,則P置1;當累加器ACC中的個數為偶數(包括0個)時,P位為0 605 sBit P = PSW^0; 606 # define set_P P=1 607 # define cle_P P=0 608 # define git_P P 609 // F1:使用者標誌位1。 610 sBit F1 = PSW^1; 611 # define set_F1 F1=1 612 # define cle_F1 F1=0 613 # define git_F1 F1 614 // OV:溢位標誌位 615 sBit OV = PSW^2; 616 # define set_OV OV=1 617 # define cle_OV OV=0 618 # define git_OV OV 619 // 工作暫存器組的選擇位(低) 620 sBit RS0 = PSW^3; 621 # define set_RS0 RS0=1 622 # define cle_RS0 RS0=0 623 # define git_RS0 RS0 624 // 工作暫存器組的選擇位(高) 625 sBit RS1 = PSW^4; 626 # define set_SM1 SM1=1 627 # define cle_SM1 SM1=0 628 # define git_SM1 SM1 629 // 暫存器工作組 630 # define Register_bank_mode_0 cle_SM1;cle_SM0 631 # define Register_bank_mode_1 cle_SM1;set_RS0 632 # define Register_bank_mode_2 set_SM1;cle_SM0 633 # define Register_bank_mode_3 set_SM1;set_RS0 634 // 使用者標誌位0 635 sBit F0 = PSW^5; 636 # define set_F0 F0=1 637 # define cle_F0 F0=0 638 # define git_F0 F0 639 // 進位輔助位置。進行加法計算時,當B3位由進位,或執行減法運算最高位有借位時,AC為1;反之位0.設定輔助進位標誌AC的目的是為了便於BCD碼加法、減法運算的調整。 640 sBit AC = PSW^6; 641 # define set_AC AC=1 642 # define cle_AC AC=0 643 # define git_AC AC 644 // 標誌位。進行加法運算時,當最高位即B7位有進位,或執行減法運算最高位有借位時,CY為1;反之位0 645 sBit CY = PSW^7; 646 # define set_CY CY=1 647 # define cle_CY CY=0 648 # define git_CY CY 649 // ----------------------------------- 650 // sfr WDT_CONTR = 0xe1; // 看門狗控制暫存器 651 // PS0:看門狗預分頻係數(低位) 652 # define set_PS0_WDT (WDT_CONTR|Bit0) 653 # define cle_PS0_WDT (WDT_CONTR&(~Bit0)) 654 # define git_PS0_WDT (Bit0 == (WDT_CONTR&Bit0)) 655 // PS1:看門狗預分頻係數(中位) 656 # define set_PS1_WDT (WDT_CONTR|Bit1) 657 # define cle_PS1_WDT (WDT_CONTR&(~Bit1)) 658 # define git_PS1_WDT (Bit1 == (WDT_CONTR&Bit1)) 659 // PS2:看門狗預分頻係數(高位) 660 # define set_PS2_WDT (WDT_CONTR|Bit2) 661 # define cle_PS2_WDT (WDT_CONTR&(~Bit2)) 662 # define git_PS2 _WDT (Bit1 == (WDT_CONTR&Bit2)) 663 // 看門狗定時器分頻值 664 # define WDT_Sub_mode_2 cle_PS2_WDT;cle_PS1_WDT;cle_PS0_WDT 665 # define WDT_Sub_mode_4 cle_PS2_WDT;cle_PS1_WDT;set_PS0_WDT 666 # define WDT_Sub_mode_8 cle_PS2_WDT;set_PS1_WDT;cle_PS0_WDT 667 # define WDT_Sub_mode_16 cle_PS2_WDT;set_PS1_WDT;set_PS0_WDT 668 # define WDT_Sub_mode_32 set_PS2_WDT;cle_PS1_WDT;cle_PS0_WDT 669 # define WDT_Sub_mode_64 set_PS2_WDT;cle_PS1_WDT;set_PS0_WDT 670 # define WDT_Sub_mode_128 set_PS2_WDT;set_PS1_WDT;cle_PS0_WDT 671 # define WDT_Sub_mode_256 set_PS2_WDT;set_PS1_WDT;set_PS0_WDT 672 // IDLE_WDT:看門狗“IDLE”模式位,當設定為“1”,看門狗定時器在“空閒模式”計數當清“0”該位時,看門狗定時器在“空閒模式”時不計數。 673 # define set_IDLE_WDT (WDT_CONTR|Bit3) // 看門狗在“空閒模式”時計數。 674 # define cle_IDLE_WDT (WDT_CONTR&(~Bit3)) // 看門狗在“空閒模式”時不計數。 675 # define git_IDLE_WDT (Bit3 == (IDLE_WDT&Bit3)) 676 // CLR_WDT:看門狗計數自動清零使能 677 # define set_CLR_WDT (WDT_CONTR | Bit4) // 清空看門狗重置 678 # define cle_CLR_WDT (WDT_CONTR &(~Bit4)) 679 # define git_CLR_WDT (Bit4 == (WDT_CONTR&Bit4)) 680 // EN_WDT:看門狗允許位 681 # define set_EN_WDT (WDT_CONTR |Bit5) // 啟動看門狗(啟動後不可關閉) 682 # define cle_EN_WDT (WDT_CONTR &(~Bit5)) // 預設關閉 683 # define git_EN_WDT (Bit5 == (WDT_CONTR&Bit5)) 684 // ----------------------------------- 685 // sfr ISP_CMD = 0xe5; // ISP/IAP 命令暫存器 686 // MS0: 687 # define set_ISP_IAP_MS0 (ISP_CMD |Bit0) 688 # define cle_ISP_IAP_MS0 (ISP_CMD &(~Bit0)) 689 // MS1: 690 # define set_ISP_IAP_MS1 (ISP_CMD |Bit1) 691 # define cle_ISP_IAP_MS1 (ISP_CMD &(~Bit1)) 692 // MS2: 693 # define set_ISP_IAP_MS2 (ISP_CMD |Bit2) 694 # define cle_ISP_IAP_MS2 (ISP_CMD &(~Bit2)) 695 // ISP/IAP mode set 696 # define ISP_IAP_NO_mode cle_ISP_IAP_MS1;cle_ISP_IAP_MS0 // 待機模式,無操作 697 # define ISP_IAP_Byte_read cle_ISP_IAP_MS1;set_ISP_IAP_MS0 // 從使用者的應用程式區對"data flash / eeprom" 進行位元組讀 698 # define ISP_IAP_Byte_write set_ISP_IAP_MS1;cle_ISP_IAP_MS0 // 從使用者的應用程式區對"data flash / eeprom" 進行位元組寫 699 # define ISP_IAP_Sector_erase set_ISP_IAP_MS1;set_ISP_IAP_MS0 // 從使用者的應用程式區對"data flash / eeprom" 進行扇區刪除 700 // ----------------------------------- 701 // sfr ISP_CONTR = 0xe7; // ISP/IAP 控制暫存器 702 // WT0: 703 # define set_ISP_CONTR_WT0 (ISP_CONTR|Bit0) 704 # define cle_ISP_CONTR_WT0 (ISP_CONTR|(~Bit0)) 705 // WT1: 706 # define set_ISP_CONTR_WT1 (ISP_CONTR|Bit1) 707 # define cle_ISP_CONTR_WT1 (ISP_CONTR&(~Bit1)) 708 // WI2: 709 # define set_ISP_CONTR_WT2 (ISP_CONTR|Bit2) 710 # define cle_ISP_CONTR_WT2 (ISP_CONTR&(~Bit2)) 711 // 設定ISP/IAP操作的等待時間 712 # define ISP_CONTR_Time_mode0 cle_ISP_CONTR_WT2;cle_ISP_CONTR_WT1;cle_ISP_CONTR_WT0 // 預設 0 713 # define ISP_CONTR_Time_mode1 cle_ISP_CONTR_WT2;cle_ISP_CONTR_WT1;set_ISP_CONTR_WT0 714 # define ISP_CONTR_Time_mode2 cle_ISP_CONTR_WT2;set_ISP_CONTR_WT1;cle_ISP_CONTR_WT0 715 # define ISP_CONTR_Time_mode3 cle_ISP_CONTR_WT2;set_ISP_CONTR_WT1;set_ISP_CONTR_WT0 716 // SWRST:產生軟體復位 717 # define set_ISP_CONTR_SWRST (ISP_CONTR|Bit5) // 產生軟體系統復位,硬體自動復位。 718 # define cle_ISP_CONTR_SWRST (ISP_CONTR&(~Bit5)) // 不操作 719 // SWBS:SWRST產生軟體復位後啟動位置 720 # define set_ISP_CONTR_SWBS (ISP_CONTR|Bit6) // SWRST產生軟體復位後啟動位置(從系統ISP監控程式) 721 # define cle_ISP_CONTR_SWRS (ISP_CONTR&(~Bit6)) // SWRST產生軟體復位後啟動位置(從應用程式區啟動) 722 // ISPEN:ISP/IAP 功能允許位 723 # define set_ISP_CONTR_ISPEN (ISP_CONTR|Bit7) // 允許 ISP/IAP 讀寫擦除 data flash/eeprm 724 # define cle_ISP_CONTR_ISPEN (ISP_CONTR&(~Bit7)) // 禁止 ISP/IAP 讀寫擦除 data flash/eeprm 725 // ----------------------------------- 726 // sfr P4 = 0xe8; // Port 4 727 sBit P40 = P4^0; // P40 728 # define set_P40 P40=1 729 # define cle_P40 P40=0 730 # define git_P40 P40 731 sBit P41 = P4^1; // P41 732 # define set_P41 P41=1 733 # define cle_P41 P41=0 734 # define git_P41 P41 735 sBit P42 = P4^2; // P42 736 # define set_P42 P42=1 737 # define cle_P42 P42=0 738 # define git_P42 P42 739 sBit INT3 = P4^2; // (~INT3)外部中斷3,下降沿中斷或低電平中斷 740 # define set_INT3 INT3=1 741 # define cle_INT3 INT3=0 742 # define git_INT3 INT3 743 sBit P43 = P4^3; // P43 744 # define set_P43 P43=1 745 # define cle_P43 P43=0 746 # define git_P43 P43 747 sBit INT2 = P4^3; // (~INT2)外部中斷3,下降沿中斷或低電平中斷 748 # define set_INT2 INT2=1 749 # define cle_INT2 INT2=0 750 # define git_INT2 INT2 751 sBit P44 = P4^4; // P44 752 # define set_P44 P44=1 753 # define cle_P44 P44=0 754 # define git_P44 P44 755 sBit PSEN = P4^4; // 外部程式儲存器選通訊號輸入引腳 756 # define set_PSEN PSEN=1 757 # define cle_PSEN PSEN=0 758 # define git_PSEN PSEN 759 sBit P45 = P4^5; // ISP下載需勾選"ALE腳用作P4.5口" 760 # define set_P45 P45=1 761 # define cle_P45 P45=0 762 # define git_P45 P45 763 sBit ALE = P4^5; // ALE 764 # define set_ALE ALE=1 765 # define cle_ALE ALE=0 766 # define git_ALE ALE 767 sBit P46 = P4^6; // P46 768 # define set_P46 P46=1 769 # define cle_P46 P46=0 770 # define git_P46 P46 771 sBit EA = P4^6; // 外部儲存器選擇引腳 772 # define set_EA EA=1 773 # define cle_EA EA=0 774 # define git_EA EA 775 776 777 778 #endif