找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11321|回复: 16
收起左侧

STC12C5A60S2做的时钟,内部EEPROM掉电不丢失

  [复制链接]
ID:79544 发表于 2015-10-2 16:18 | 显示全部楼层 |阅读模式
  1. /******************************************
  2.         功能 使用STC12C5A60S2时钟,数码管显示
  3.                 片内EEPROM掉电不丢失       
  4.         单片机:STC12C5A60S2
  5.         晶振 :11。0592M
  6.         作者 :苏义江
  7.         时间 :2015.10.2下午
  8.         说明:在下载程序是要把下次下载程序时擦除
  9.                         用户EEPROM的框里打钩。
  10.                         5v单片机在3.7v以上可以操作EEPROM
  11.                         3.3V单片机在2.4v以上才可以操作EEPROM
  12.                 否则单片机不执行EEPROM       
  13. *******************************************/
  14. #include<stc12c5a60s2.h>
  15. #include<stc12ceeprom.h>

  16. //第一扇区起始位
  17. #define DATA_flash_START_address 0x0000
  18. //第二扇区起始位
  19. //#define DATA_flash_START_address 200 -3FF
  20. //第三扇区起始位
  21. //#define DATA_flash_START_address 400 -5FF
  22. //第四扇区起始位
  23. //#define DATA_flash_START_address 600 -7FF
  24. //第五扇区起始位
  25. //#define DATA_flash_START_address 800 -9FF
  26. //第六扇区起始位
  27. //#define DATA_flash_START_address a00 -bff
  28. //第七扇区起始位
  29. //#define DATA_flash_START_address c00 -dff
  30. //第八扇区起始位
  31. //#define DATA_flash_START_address e00 -fff

  32. sbit wei=P0^6;//573使能位选
  33. sbit duan=P0^7;//573使能段选

  34. uchar t,a1, a2, b1,b2,miao,fen;
  35. bit flag;
  36. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  37.                                 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
  38.                                 0xa1,0x86,0x8e,0x89};//0到H共阳段码

  39. void delay(uint x)
  40. {
  41.         uint z,j;
  42.         for(z=x;z>0;z--)
  43.         for(j=600;j>0;j--);
  44. }
  45. void t0init()
  46. {
  47.         TMOD=0X01;
  48.         TH0=(65536-42000)/256;
  49.         TL0=(65536-42000)%256;
  50.         EA=1;
  51.         ET0=1;
  52.         TR0=1;
  53.         t=0;
  54.         miao=0;
  55.         fen=0;
  56. }
  57. void display(uchar fen,uchar miao)
  58. {
  59.         a1=fen%10;
  60.         a2=fen/10;
  61.         b1=miao%10;
  62.         b2=miao/10;       
  63.         wei=1;
  64.         P2=0xfe;
  65.         wei=0;
  66.         P2=0xFF;
  67.         duan=1;
  68.         P2=table[a2];
  69.         duan=0;
  70.         P2=0xFF;
  71.         delay(10);

  72.         wei=1;
  73.         P2=0xfd;
  74.         wei=0;
  75.         P2=0xFF;
  76.         duan=1;
  77.         P2=table[a1];
  78.         duan=0;
  79.         P2=0xFF;
  80.         delay(10);

  81.         wei=1;
  82.         P2=0xfb;
  83.         wei=0;
  84.         P2=0xFF;
  85.         duan=1;
  86.         P2=table[b2];
  87.         duan=0;
  88.         P2=0xFF;
  89.         delay(10);
  90.        
  91.         wei=1;
  92.         P2=0xf7;
  93.         wei=0;
  94.         P2=0xFF;
  95.         duan=1;
  96.         P2=table[b1];
  97.         duan=0;
  98.         P2=0xFF;
  99.         delay(10);
  100. }
  101. void main()
  102. {
  103.         t0init();       
  104.         miao=Byte_read(0x0000);//从第一扇区读一个字节
  105.         if(miao>=60)
  106.         miao=0;
  107.         fen =Byte_read(0x200);//从第二扇区读一个字节
  108.         if(fen>=60)       
  109.         fen=0;                       
  110.         while(1)
  111.         {
  112.                 if(flag==1)//到1秒
  113.                 {
  114.                         flag=0;//标志位清零
  115.                         sector_Erase(0x0000);//擦除第一扇区
  116.                         Byte_write(0x0000,miao);//写入第一扇区

  117.                         sector_Erase(0x200);//擦除第二扇区                       
  118.                         Byte_write(0x200,fen);//写入第二扇区       
  119.                 }
  120.                 display(fen,miao);                       
  121.         }
  122. }
  123. void t0() interrupt 1
  124. {
  125.         TH0=(65536-42000)/256;
  126.         TL0=(65536-42000)%256;
  127.         t++;
  128.         if(t==24)
  129.         {
  130.                 t=0;
  131.                 flag=1;
  132.                 miao++;
  133.                 if(miao==60)
  134.                 {
  135.                         miao=0;
  136.                         fen++;
  137.                         if(fen==60)
  138.                         fen=0;
  139.                 }
  140.                
  141.                        
  142.         }
  143. }
  144. #ifndef __STC12CEEPROM_H__
  145. #define __STC12CEEPROM_H__
  146. #include<intrins.h>
  147. #define uchar unsigned char
  148. #define uint unsigned int
  149. //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
  150. //#define ENABLE_ISP 0X80//晶振小于30M
  151. //#define ENABLE_ISP 0X81//晶振小于24M
  152. #define ENABLE_ISP 0X82//晶振小于20M
  153. //#define ENABLE_ISP 0X83//晶振小于12M
  154. //#define ENABLE_ISP 0X84//晶振小于6M
  155. //#define ENABLE_ISP 0X85//晶振小于3M
  156. //用于STC12C2052
  157. //sfr  IAP_DATA   =0XE2;
  158. //sfr  IAP_ADDRH  =0XE3;
  159. //sfr  IAP_ADDRL  =0XE4;
  160. //sfr  IAP_CMD    =0XE5;
  161. //sfr  IAP_TRIG   =0XE6;
  162. //sfr  IAP_CONTR  =0XE7;
  163. //#define  WD1  0X46
  164. //#define  WD2  0XB9
  165. //用于STC12C5A60S3
  166. //sfr  IAP_DATA   =0XC2;
  167. //sfr  IAP_ADDRH  =0Xc3;
  168. //sfr  IAP_ADDRL  =0Xc4;
  169. //sfr  IAP_CMD    =0Xc5;
  170. //sfr  IAP_TRIG   =0Xc6;
  171. //sfr  IAP_CONTR  =0Xc7;
  172. #define  WD1  0X5A
  173. #define  WD2  0XA5

  174. uchar Byte_read(uint add);//读一字节 调用前打开IAP
  175. void Byte_write(uint add,uchar ch);//字节编程
  176. void sector_Erase(uint add);//擦除扇区
  177. void IAP_Disable();//关闭IAP
  178. //读一字节 调用前打开IAP
  179. uchar Byte_read(uint add)
  180. {
  181.         IAP_DATA=0X00;
  182.         IAP_CONTR=ENABLE_ISP;
  183.         IAP_CMD =0X01;
  184.         IAP_ADDRH=add/256;
  185.         IAP_ADDRL =add%256;
  186.        
  187.         IAP_TRIG  =WD1;
  188.         IAP_TRIG  =WD2;
  189.         _nop_();_nop_();
  190.         IAP_Disable();
  191.         return (IAP_DATA);
  192. }
  193. //字节编程
  194. void Byte_write(uint add,uchar ch)
  195. {
  196.         IAP_CONTR  =ENABLE_ISP;
  197.         IAP_CMD =0X02;
  198.         IAP_ADDRH=add/256;
  199.         IAP_ADDRL =add%256;
  200.         IAP_DATA=ch;
  201.         IAP_TRIG  =WD1;
  202.         IAP_TRIG  =WD2;
  203.         _nop_();_nop_();
  204.         IAP_Disable();
  205. }
  206. //擦除扇区
  207. void sector_Erase(uint add)
  208. {
  209.         IAP_CONTR =ENABLE_ISP;
  210.         IAP_CMD =0X03;
  211.         IAP_ADDRH=add/256;
  212.         IAP_ADDRL =add%256;
  213.         IAP_TRIG  =WD1;
  214.         IAP_TRIG  =WD2;
  215.         _nop_();_nop_();
  216.         IAP_Disable();
  217. }
  218. //关闭IAP
  219. void IAP_Disable()
  220. {
  221.         IAP_CONTR =0;
  222.         IAP_CMD =0;
  223.         IAP_TRIG  =0;
  224.         IAP_ADDRH=0;
  225.         IAP_ADDRL =0;       
  226. }
  227. #endif
  228. #ifndef __STC12C5A60S2_H_
  229. #define __STC12C5A60S2_H_

  230. /////////////////////////////////////////////////

  231. //--------------------------------------------------------------------------------
  232. //新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs
  233. //                                          7     6      5       4     3    2    1     0   Reset Value
  234. sfr ACC  = 0xE0; //Accumulator                                                              0000,0000
  235. sfr B    = 0xF0; //B Register                                                               0000,0000
  236. sfr PSW  = 0xD0; //Program Status Word      CY    AC    F0    RS1   RS0    OV    F1    P    0000,0000
  237. //-----------------------------------
  238. sbit CY  = PSW^7;
  239. sbit AC  = PSW^6;
  240. sbit F0  = PSW^5;
  241. sbit RS1 = PSW^4;
  242. sbit RS0 = PSW^3;
  243. sbit OV  = PSW^2;
  244. sbit P   = PSW^0;
  245. //-----------------------------------
  246. sfr SP   = 0x81; //Stack Pointer                                                            0000,0111
  247. sfr DPL  = 0x82; //Data Pointer Low Byte                                                    0000,0000
  248. sfr DPH  = 0x83; //Data Pointer High Byte                                                   0000,0000
  249. //--------------------------------------------------------------------------------
  250. //新一代 1T 8051系列 单片机系统管理特殊功能寄存器
  251. //                                          7     6      5    4     3      2    1     0     Reset Value
  252. sfr PCON   = 0x87; //Power Control        SMOD  SMOD0  LVDF  POF   GF1    GF0   PD   IDL    0001,0000
  253. //                                        7     6       5      4     3      2      1      0   Reset Value
  254. sfr AUXR  = 0x8E; //Auxiliary Register  T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS  0000,0000
  255. //-----------------------------------
  256. sfr AUXR1 = 0xA2; //Auxiliary Register 1  -  PCA_P4  SPI_P4  S2_P4  GF2    ADRJ   -    DPS  0000,0000
  257. /*
  258. PCA_P4:
  259.     0, 缺省PCA 在P1 口
  260.     1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,
  261.                                    PCA0/PWM0 从P1.3 切换到P4.2 口
  262.                                    PCA1/PWM1 从P1.4 切换到P4.3 口
  263. SPI_P4:
  264.     0, 缺省SPI 在P1 口
  265.     1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口
  266.                                MISO 从P1.6 切换到P4.2 口
  267.                                MOSI 从P1.5 切换到P4.1 口
  268.                                SS 从P1.4 切换到P4.0 口
  269. S2_P4:
  270.     0, 缺省UART2 在P1 口
  271.     1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口
  272.                                  RxD2 从P1.2 切换到P4.2 口
  273. GF2: 通用标志位

  274. ADRJ:
  275.     0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
  276.     1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

  277. DPS: 0, 使用缺省数据指针DPTR0
  278.      1,使用另一个数据指针DPTR1
  279. */
  280. //-----------------------------------
  281. sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO
  282. /*
  283.       7            6          5          4          3       2       1      0         Reset Value
  284.    PCAWAKEUP  RXD_PIN_IE  T1_PIN_IE  T0_PIN_IE  LVD_WAKE    _    T1CLKO  T0CLKO      0000,0000B

  285. b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。
  286. b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。
  287. b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。
  288. b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。
  289. b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。
  290. b2 -
  291. b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率
  292. b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率
  293. */
  294. //-----------------------------------
  295. sfr CLK_DIV = 0x97; //Clock Divder          -     -      -       -     -  CLKS2 CLKS1 CLKS0 xxxx,x000
  296. //-----------------------------------
  297. sfr BUS_SPEED = 0xA1; //Stretch register      -     -    ALES1   ALES0   -   RWS2  RWS1  RWS0 xx10,x011
  298. /*
  299. ALES1 and ALES0:
  300. 00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle
  301. 01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.
  302. 10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)
  303. 11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

  304. RWS2,RWS1,RWS0:
  305.   000 : The MOVX read/write pulse is 1 clock cycle.
  306.   001 : The MOVX read/write pulse is 2 clock cycles.
  307.   010 : The MOVX read/write pulse is 3 clock cycles.
  308.   011 : The MOVX read/write pulse is 4 clock cycles. (default)
  309.   100 : The MOVX read/write pulse is 5 clock cycles.
  310.   101 : The MOVX read/write pulse is 6 clock cycles.
  311.   110 : The MOVX read/write pulse is 7 clock cycles.
  312.   111 : The MOVX read/write pulse is 8 clock cycles.
  313. */
  314. //--------------------------------------------------------------------------------
  315. //新一代 1T 8051系列 单片机中断特殊功能寄存器
  316. //有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义
  317. //其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南
  318. //                                           7     6     5    4     3    2    1    0   Reset Value
  319. sfr IE      = 0xA8;  //中断控制寄存器        EA  ELVD  EADC   ES   ET1  EX1  ET0  EX0  0x00,0000
  320. //-----------------------
  321. sbit EA       = IE^7;
  322. sbit ELVD     = IE^6; //低压监测中断允许位
  323. sbit EADC     = IE^5; //ADC 中断允许位
  324. sbit ES       = IE^4;
  325. sbit ET1      = IE^3;
  326. sbit EX1      = IE^2;
  327. sbit ET0      = IE^1;
  328. sbit EX0      = IE^0;
  329. //-----------------------
  330. sfr IE2       = 0xAF;  //Auxiliary Interrupt   -     -     -    -     -    -  ESPI  ES2  0000,0000B
  331. //-----------------------
  332. //                                          7     6     5    4    3    2    1    0    Reset Value
  333. sfr IP      = 0xB8; //中断优先级低位      PPCA  PLVD  PADC  PS   PT1  PX1  PT0  PX0   0000,0000
  334. //--------
  335. sbit PPCA     = IP^7;  //PCA 模块中断优先级
  336. sbit PLVD     = IP^6;  //低压监测中断优先级
  337. sbit PADC     = IP^5;  //ADC 中断优先级
  338. sbit PS       = IP^4;
  339. sbit PT1      = IP^3;
  340. sbit PX1      = IP^2;
  341. sbit PT0      = IP^1;
  342. sbit PX0      = IP^0;
  343. //-----------------------
  344. //                                         7      6      5     4     3     2     1     0    Reset Value
  345. sfr IPH   = 0xB7; //中断优先级高位       PPCAH  PLVDH  PADCH  PSH  PT1H  PX1H  PT0H  PX0H   0000,0000
  346. sfr IP2   = 0xB5; //                       -      -      -     -     -     -   PSPI   PS2   xxxx,xx00
  347. sfr IPH2  = 0xB6; //                       -      -      -     -     -     -   PSPIH  PS2H  xxxx,xx00
  348. //-----------------------
  349. //新一代 1T 8051系列 单片机I/O 口特殊功能寄存器
  350. //                                      7     6     5     4     3     2     1     0         Reset Value
  351. sfr P0   = 0x80; //8 bitPort0          P0.7  P0.6  P0.5  P0.4  P0.3  P0.2  P0.1  P0.0       1111,1111
  352. sbit P00 = P0^0;
  353. sbit P01 = P0^1;
  354. sbit P02 = P0^2;
  355. sbit P03 = P0^3;
  356. sbit P04 = P0^4;
  357. sbit P05 = P0^5;
  358. sbit P06 = P0^6;
  359. sbit P07 = P0^7;
  360. sfr P0M0 = 0x94; //                                                                         0000,0000
  361. sfr P0M1 = 0x93; //                                                                         0000,0000
  362. sfr P1   = 0x90; //8 bitPort1          P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0       1111,1111
  363. sbit P10 = P1^0;
  364. sbit P11 = P1^1;
  365. sbit P12 = P1^2;
  366. sbit P13 = P1^3;
  367. sbit P14 = P1^4;
  368. sbit P15 = P1^5;
  369. sbit P16 = P1^6;
  370. sbit P17 = P1^7;
  371. sfr P1M0 = 0x92; //                                                                         0000,0000
  372. sfr P1M1 = 0x91; //                                                                         0000,0000
  373. sfr P1ASF = 0x9D; //P1 analog special function
  374. sfr P2   = 0xA0; //8 bitPort2          P2.7  P2.6  P2.5  P2.4  P2.3  P2.2  P2.1  P2.0       1111,1111
  375. sbit P20 = P2^0;
  376. sbit P21 = P2^1;
  377. sbit P22 = P2^2;
  378. sbit P23 = P2^3;
  379. sbit P24 = P2^4;
  380. sbit P25 = P2^5;
  381. sbit P26 = P2^6;
  382. sbit P27 = P2^7;
  383. sfr P2M0 = 0x96; //                                                                         0000,0000
  384. sfr P2M1 = 0x95; //                                                                         0000,0000
  385. sfr P3   = 0xB0; //8 bitPort3          P3.7  P3.6  P3.5  P3.4  P3.3  P3.2  P3.1  P3.0       1111,1111
  386. sbit P30 = P3^0;
  387. sbit P31 = P3^1;
  388. sbit P32 = P3^2;
  389. sbit P33 = P3^3;
  390. sbit P34 = P3^4;
  391. sbit P35 = P3^5;
  392. sbit P36 = P3^6;
  393. sbit P37 = P3^7;
  394. sfr P3M0 = 0xB2; //                                                                         0000,0000
  395. sfr P3M1 = 0xB1; //                                                                         0000,0000
  396. sfr P4   = 0xC0; //8 bitPort4          P4.7  P4.6  P4.5  P4.4  P4.3  P4.2  P4.1  P4.0       1111,1111
  397. sbit P40 = P4^0;
  398. sbit P41 = P4^1;
  399. sbit P42 = P4^2;
  400. sbit P43 = P4^3;
  401. sbit P44 = P4^4;
  402. sbit P45 = P4^5;
  403. sbit P46 = P4^6;
  404. sbit P47 = P4^7;
  405. sfr P4M0 = 0xB4; //                                                                         0000,0000
  406. sfr P4M1 = 0xB3; //                                                                         0000,0000
  407. //                                      7      6         5         4      3     2     1     0     Reset Value
  408. sfr P4SW = 0xBB; //Port-4 switch        -   LVD_P4.6  ALE_P4.5  NA_P4.4   -     -     -     -       x000,xxxx

  409. sfr P5   = 0xC8; //8 bitPort5           -     -       -      -    P5.3  P5.2  P5.1  P5.0    xxxx,1111
  410. sbit P50 = P5^0;
  411. sbit P51 = P5^1;
  412. sbit P52 = P5^2;
  413. sbit P53 = P5^3;
  414. sfr P5M0 = 0xCA; //                                                                         0000,0000
  415. sfr P5M1 = 0xC9; //                                                                         0000,0000
  416. //--------------------------------------------------------------------------------
  417. //新一代 1T 8051系列 单片机定时器特殊功能寄存器
  418. //                                          7     6     5     4     3     2     1     0     Reset Value
  419. sfr TCON = 0x88; //T0/T1 Control           TF1   TR1   TF0   TR0   IE1   IT1   IE0   IT0    0000,0000
  420. //-----------------------------------
  421. sbit TF1 = TCON^7;
  422. sbit TR1 = TCON^6;
  423. sbit TF0 = TCON^5;
  424. sbit TR0 = TCON^4;
  425. sbit IE1 = TCON^3;
  426. sbit IT1 = TCON^2;
  427. sbit IE0 = TCON^1;
  428. sbit IT0 = TCON^0;
  429. //-----------------------------------
  430. sfr TMOD = 0x89; //T0/T1 Modes             GATE1 C/T1  M1_1  M1_0  GATE0 C/T0  M0_1  M0_0   0000,0000
  431. sfr TL0  = 0x8A; //T0 Low Byte                                                              0000,0000
  432. sfr TH0  = 0x8C; //T0 High Byte                                                             0000,0000
  433. sfr TL1  = 0x8B; //T1 Low Byte                                                              0000,0000
  434. sfr TH1  = 0x8D; //T1 High Byte                                                             0000,0000
  435. //--------------------------------------------------------------------------------
  436. //新一代 1T 8051系列 单片机串行口特殊功能寄存器
  437. //                                          7     6     5     4     3     2     1     0     Reset Value
  438. sfr SCON = 0x98; //Serial Control         SM0/FE SM1   SM2   REN   TB8   RB8    TI    RI    0000,0000
  439. //-----------------------------------
  440. sbit SM0 = SCON^7;  //SM0/FE
  441. sbit SM1 = SCON^6;
  442. sbit SM2 = SCON^5;
  443. sbit REN = SCON^4;
  444. sbit TB8 = SCON^3;
  445. sbit RB8 = SCON^2;
  446. sbit TI  = SCON^1;
  447. sbit RI  = SCON^0;
  448. //-----------------------------------
  449. sfr SBUF = 0x99; //Serial Data Buffer                                                     xxxx,xxxx
  450. sfr SADEN = 0xB9; //Slave Address Mask                                                    0000,0000
  451. sfr SADDR = 0xA9; //Slave Address                                                         0000,0000
  452. //-----------------------------------
  453. //                                7      6      5      4      3      2     1     0        Reset Value
  454. sfr S2CON = 0x9A; //S2 Control  S2SM0  S2SM1  S2SM2  S2REN  S2TB8  S2RB8  S2TI  S2RI      00000000B
  455. sfr S2BUF = 0x9B; //S2 Serial Buffer                                                      xxxx,xxxx
  456. sfr BRT = 0x9C; //S2 Baud-Rate Timer                                                    0000,0000
  457. //--------------------------------------------------------------------------------
  458. //新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器
  459. sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
  460. //                                      7     6     5      4       3      2   1   0     Reset Value
  461. //                                  WDT_FLAG  -  EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0    xx00,0000
  462. //-----------------------

  463. //--------------------------------------------------------------------------------
  464. //新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器
  465. //                                         7     6     5     4     3     2     1     0     Reset Value
  466. sfr CCON   = 0xD8;   //PCA 控制寄存器。    CF    CR    -     -     -     -    CCF1  CCF0   00xx,xx00
  467. //-----------------------
  468. sbit CF     = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。
  469. sbit CR     = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。
  470. //-
  471. //-
  472. sbit CCF1   = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。
  473. sbit CCF0   = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。
  474. //-----------------------
  475. sfr CMOD  = 0xD9; //PCA 工作模式寄存器。   CIDL   -     -     -   CPS2   CPS1  CPS0  ECF   0xxx,x000
  476. /*
  477. CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

  478. CPS2: PCA 计数器脉冲源选择位 2。
  479. CPS1: PCA 计数器脉冲源选择位 1。
  480. CPS0: PCA 计数器脉冲源选择位 0。
  481.    CPS2   CPS1   CPS0
  482.     0      0      0    系统时钟频率 fosc/12。
  483.     0      0      1    系统时钟频率 fosc/2。
  484.     0      1      0    Timer0 溢出。
  485.     0      1      1    由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。
  486.     1      0      0    系统时钟频率,  Fosc/1
  487.     1      0      1    系统时钟频率/4,Fosc/4
  488.     1      1      0    系统时钟频率/6,Fosc/6
  489.     1      1      1    系统时钟频率/8,Fosc/8

  490. ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。
  491. */
  492. //-----------------------
  493. sfr CL     = 0xE9; //PCA 计数器低位                                                        0000,0000
  494. sfr CH     = 0xF9; //PCA 计数器高位                                                        0000,0000
  495. //-----------------------
  496. //                                         7     6      5      4     3     2     1     0     Reset Value
  497. sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器  -   ECOM0  CAPP0  CAPN0  MAT0  TOG0  PWM0  ECCF0   x000,0000
  498. sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器  -   ECOM1  CAPP1  CAPN1  MAT1  TOG1  PWM1  ECCF1   x000,0000

  499. //ECOMn = 1:允许比较功能。
  500. //CAPPn = 1:允许上升沿触发捕捉功能。
  501. //CAPNn = 1:允许下降沿触发捕捉功能。
  502. //MATn  = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
  503. //TOGn  = 1:当匹配情况发生时, CEXn 将翻转。
  504. //PWMn  = 1:将 CEXn 设置为 PWM 输出。
  505. //ECCFn = 1:允许 CCON 中的 CCFn 触发中断。

  506. //ECOMn  CAPPn  CAPNn  MATn  TOGn  PWMn  ECCFn
  507. //  0      0      0     0     0     0     0   0x00   未启用任何功能。
  508. //  x      1      0     0     0     0     x   0x21   16位CEXn上升沿触发捕捉功能。
  509. //  x      0      1     0     0     0     x   0x11   16位CEXn下降沿触发捕捉功能。
  510. //  x      1      1     0     0     0     x   0x31   16位CEXn边沿(上、下沿)触发捕捉功能。
  511. //  1      0      0     1     0     0     x   0x49   16位软件定时器。
  512. //  1      0      0     1     1     0     x   0x4d   16位高速脉冲输出。
  513. //  1      0      0     0     0     1     0   0x42   8位 PWM。

  514. //ECOMn  CAPPn  CAPNn  MATn  TOGn  PWMn  ECCFn
  515. //  0      0      0     0     0     0     0   0x00   无此操作
  516. //  1      0      0     0     0     1     0   0x42   普通8位PWM, 无中断
  517. //  1      1      0     0     0     1     1   0x63   PWM输出由低变高可产生中断
  518. //  1      0      1     0     0     1     1   0x53   PWM输出由高变低可产生中断
  519. //  1      1      1     0     0     1     1   0x73   PWM输出由低变高或由高变低都可产生中断

  520. //-----------------------
  521. sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。                                    0000,0000
  522. sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。                                    0000,0000
  523. sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。                                    0000,0000
  524. sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。                                    0000,0000
  525. //-----------------------
  526. //                                                       7   6   5   4   3   2    1     0    Reset Value
  527. sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。            -   -   -   -   -   -  EPC0H EPC0L   xxxx,xx00
  528. sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。            -   -   -   -   -   -  EPC1H EPC1L   xxxx,xx00
  529. //PCA_PWMn:    7      6      5      4      3      2      1      0
  530. //             -      -      -      -      -      -    EPCnH  EPCnL
  531. //B7-B2: 保留
  532. //B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。
  533. //B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
  534. //--------------------------------------------------------------------------------
  535. //新一代 1T 8051系列 单片机 ADC 特殊功能寄存器
  536. //                                            7        6      5       4         3      2    1    0   Reset Value
  537. sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
  538. sfr ADC_RES  = 0xBD;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2    0000,0000
  539. sfr ADC_RESL = 0xBE;  //A/D 转换结果低2位                                           ADCV.1 ADCV.0    0000,0000
  540. //--------------------------------------------------------------------------------
  541. //新一代 1T 8051系列 单片机 SPI 特殊功能寄存器
  542. //                                      7     6     5     4     3     2     1     0    Reset Value
  543. sfr SPCTL  = 0xCE; //SPI Control Register  SSIG  SPEN  DORD  MSTR  CPOL  CPHA  SPR1  SPR0  0000,0100
  544. sfr SPSTAT = 0xCD; //SPI Status Register   SPIF  WCOL   -     -     -     -     -     -    00xx,xxxx
  545. sfr SPDAT  = 0xCF; //SPI Data Register                                                     0000,0000
  546. //--------------------------------------------------------------------------------
  547. //新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器
  548. sfr IAP_DATA    = 0xC2;
  549. sfr IAP_ADDRH   = 0xC3;
  550. sfr IAP_ADDRL   = 0xC4;
  551. //                                                7    6    5      4    3    2    1     0    Reset Value
  552. sfr IAP_CMD     = 0xC5; //IAP Mode Table          0    -    -      -    -    -   MS1   MS0   0xxx,xx00
  553. sfr IAP_TRIG    = 0xC6;
  554. sfr IAP_CONTR   = 0xC7; //IAP Control Register  IAPEN SWBS SWRST CFAIL  -   WT2  WT1   WT0   0000,x000
  555. //--------------------------------------------------------------------------------
  556. sfr isp_data=0xe2;  
  557. sfr isp_addrh=0xe3;  
  558. sfr isp_addrl=0xe4;  
  559. sfr isp_cmd=0xe5;  
  560. sfr isp_trig=0xe6;  
  561. sfr isp_contr=0xe7;
  562. /////////////////////////////////////////////////

  563. #endif
复制代码


评分

参与人数 4威望 +18 黑币 +26 收起 理由
持勤补拙 + 3 很给力!
壹贰叁肆伍 + 5 很给力!
王朗的诱惑 + 10 + 10 赞一个!
dzljp + 8 + 8 方便的话上个电路图

查看全部评分

回复

使用道具 举报

ID:91519 发表于 2015-10-2 17:26 来自手机 | 显示全部楼层
谢谢分享太好了正好需要这个程序,楼主能描述一下数码管的接法,是共阴的还是共阳的.要是有个电脑图就更好了吗?
回复

使用道具 举报

ID:67678 发表于 2015-10-2 20:30 | 显示全部楼层
回复楼上:数码管是共阳的。

楼主:方便的话上个电路图。
回复

使用道具 举报

ID:79544 发表于 2015-10-2 22:28 | 显示全部楼层
我用的是4位共阳数码管,用573做IO扩展,IO口程序里都明白。
回复

使用道具 举报

ID:84652 发表于 2015-10-4 02:30 | 显示全部楼层
数据手册上说EEPROM擦写次数10万次以上,1秒1次的话30小时就超10万了,不知道10万以上到底是多少,期待楼主的作品~
回复

使用道具 举报

ID:88707 发表于 2015-10-5 15:09 | 显示全部楼层
好长的代码啊
回复

使用道具 举报

ID:140967 发表于 2016-9-30 11:21 | 显示全部楼层
用户EEPROM的框里打钩。是什么意思
回复

使用道具 举报

ID:88060 发表于 2016-10-7 08:36 | 显示全部楼层
其实STC的“EEPROM”是FLASH,不是真正的EEPROM,因为不支持字节读写
回复

使用道具 举报

ID:70330 发表于 2016-11-17 16:06 | 显示全部楼层
好代码,文件不长,分离几个头文件后,代码很简洁,收藏了,谢谢楼主
回复

使用道具 举报

ID:130345 发表于 2017-8-31 22:52 | 显示全部楼层
直接省了24C02
回复

使用道具 举报

ID:244589 发表于 2017-12-4 09:20 | 显示全部楼层

我也这么觉得,感觉很难消化
回复

使用道具 举报

ID:163950 发表于 2018-1-19 13:04 | 显示全部楼层
看上去是中断触发时时存储呢?楼主 如果掉电存储可以不?
回复

使用道具 举报

ID:370231 发表于 2018-8-6 15:53 | 显示全部楼层
看不懂,太长了
回复

使用道具 举报

ID:33544 发表于 2018-9-6 14:15 | 显示全部楼层
我也在找这样的案例
回复

使用道具 举报

ID:229821 发表于 2019-3-24 17:56 | 显示全部楼层
不错的好东西啊。很好啊。谢谢了。
回复

使用道具 举报

ID:227832 发表于 2019-4-5 19:34 | 显示全部楼层
收藏了,谢谢楼主。
回复

使用道具 举报

ID:505153 发表于 2019-4-9 00:32 | 显示全部楼层
不对吧。不是用1302做时钟吗。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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