找回密码
 立即注册
查看: 508|回复: 5

这eeprom看不见,摸不着,好难哦,不像pwm那样可以看见调试

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-1 21:06:57 | 显示全部楼层 |阅读模式
这个是代码.

串口也见不到FF
也看不到效果.
不懂怎么诊断了
  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. #define MAIN_Fosc 11059200UL
  4. #define BRT         (65536 - MAIN_Fosc / 115200 / 4)
  5.   
  6. typedef unsigned char u8;typedef unsigned int u16;
  7. void delayms(u16 ms);   
  8. void sys_init();
  9. void PWM_init(void);
  10. //void Timer0_Init(void);
  11. void UartInit();
  12. void UartSend(char dat);
  13. char IapRead(unsigned int addr);
  14. void IapProgram(unsigned int addr, char dat);
  15. void IapErase(unsigned int addr);
  16. void IapIdle();
  17. u8 temp,number,save;
  18. bit flag;
  19. sbit key=P3^2;
  20.          static u8 state;
  21.          
  22. void UartInit()
  23. {
  24.     SCON = 0x5a;
  25.     T2L = BRT;
  26.     T2H = BRT >> 8;
  27.     AUXR = 0x15;
  28. }
  29. void UartSend(char dat)
  30. {
  31.     while (!TI);
  32.     TI = 0;
  33.     SBUF = dat;
  34. }
  35. void main()
  36. {       
  37.        
  38.         P_SW2|=0x80;
  39.         sys_init();  
  40.    UartInit();
  41.   UartSend();
  42.   IapRead();
  43.   IapProgram();
  44.   IapErase();
  45.   IapIdle();
  46.         temp = IapRead(0x0000);
  47. //        if(temp != 0xFF) number = temp;         
  48.        
  49.           while(1)
  50.         {
  51.         switch(state)
  52.         {
  53.                 case 0 :  PWMA_CCR1 = 0;   break;
  54.                 case 1 :  PWMA_CCR1 = 5;   break;
  55.                 case 2 :  PWMA_CCR1 = 25;   break;
  56.                 case 3 :  PWMA_CCR1 = 70; IapErase(0x0000);IapProgram(0x0000,state); break;
  57.                 default:break;
  58.         }
  59.         }
  60.          
  61.        
  62. }
  63. void INT0_Isr(void) interrupt 0
  64. {
  65.   delayms(10);
  66.   if(INT0==0)
  67.   {
  68.   state++;
  69. if(state >= 4)
  70. state=0;
  71.   }
  72. }
  73. void sys_init(void)
  74. {
  75.         P_SW2=0x80;
  76.        
  77.     P3M0 = 0x00; P3M1 = 0xf8;       P1M0 = 0x00; P1M1 = 0xfe;
  78.        
  79.              PWM_init();
  80. //         Timer0_Init();
  81.        
  82.        
  83.         IT0=1;EX0=1;
  84.         INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
  85. //        IP2H=0x00;               
  86.         IP2=0x10;
  87.        
  88.         EA=1;                        //打开总中断
  89. }
  90. //// 初始化PWM功能
  91. void PWM_init(void) {
  92.     PWMA_CCER1 = 0x00;                          // 写CCMRx前必须先清零CCERx关闭通道
  93.     PWMA_CCMR1 = 0x60;                          // 设置CC1为PWMA输出模式
  94.     PWMA_PS        = 0x00;                      //  
  95.     PWMA_CCER1 = 0x03;                          // 使能CC4通道双极
  96.     PWMA_CCR1 = temp;                              // 初始化CCR4计数值为0
  97.     PWMA_ARR = 100;                           // 设置周期时间为12000个计数周期
  98.     PWMA_ENO = 0x01;                            // 使能PWM4P+N端口输出
  99.     PWMA_PSCR = 0;                              // PWM时钟预分频寄存器设置为0
  100.     PWMA_BKR = 0x80;                            // 使能主输出
  101.     PWMA_CR1 = 0x01;                            // 开始计时
  102.        
  103. }
  104. void Timer0_Isr(void) interrupt 1
  105. {
  106.         flag=1;
  107. }
  108. void Timer0_Init(void)                //1毫秒@11.0592MHz
  109. {
  110.         AUXR |= 0x80;                        //定时器时钟1T模式
  111.         TMOD &= 0xF0;                        //设置定时器模式
  112.         TMOD |= 0x01;                        //设置定时器模式
  113.         TL0 = 0xCD;                                //设置定时初始值
  114.         TH0 = 0xD4;                                //设置定时初始值
  115.         TF0 = 0;                                //清除TF0标志
  116.         TR0 = 1;                                //定时器0开始计时
  117.         ET0 = 1;                                //使能定时器0中断
  118. }
  119. void IapIdle()
  120. {
  121.         IAP_CONTR = 0;                                                 // 关闭 IAP 功能
  122.         IAP_CMD = 0;                                                 // 清除命令寄存器
  123.         IAP_TRIG = 0;                                                 // 清除触发寄存器
  124.         IAP_ADDRH = 0x00;                                        // 清零高地址寄存器
  125.         IAP_ADDRL = 0x00;                                        // 清零低地址寄存器
  126. }
  127. char IapRead(unsigned int addr)
  128. {
  129.         char dat;
  130.         IAP_CONTR = 0x80;                                 // 使能 IAP
  131.         IAP_TPS = 12;                                                 // 设置等待参数 12MHz
  132.         IAP_CMD = 1;                                                         // 设置 IAP 读命令
  133.         IAP_ADDRL = addr;                                 // 设置 IAP 低地址
  134.         IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址
  135.         IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
  136.         IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
  137.         _nop_();
  138.         _nop_();
  139.         _nop_();
  140.         _nop_();
  141.         dat = IAP_DATA;                                         // 读 IAP 数据
  142.         IapIdle();                                                                 // 关闭 IAP 功能
  143.         return dat;
  144. }
  145. void IapProgram(unsigned int addr, char dat)
  146. {
  147.         IAP_CONTR = 0x80;                                 // 使能 IAP
  148.         IAP_TPS = 12;                                                 // 设置等待参数 12MHz
  149.         IAP_CMD = 2;                                                        // 设置 IAP 写命令
  150.         IAP_ADDRL = addr;                                 // 设置 IAP 低地址
  151.         IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址
  152.         IAP_DATA = dat;                                         // 写 IAP 数据
  153.         IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
  154.         IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
  155.         _nop_();
  156.         _nop_();
  157.         _nop_();
  158.         _nop_();
  159.         IapIdle();                                                                // 关闭 IAP 功能
  160. }
  161. void IapErase(unsigned int addr)
  162. {
  163.        
  164.         IAP_CONTR = 0x80;                                 // 使能 IAP
  165.         IAP_TPS = 12;                                                 // 设置等待参数 12MHz
  166.         IAP_CMD = 3;                                                         // 设置 IAP 擦除命令
  167.         IAP_ADDRL = addr;                                 // 设置 IAP 低地址
  168.         IAP_ADDRH = addr >> 8;                 // 设置 IAP 高地址
  169.         IAP_TRIG = 0x5a;                                         // 写触发命令 (0x5a)
  170.         IAP_TRIG = 0xa5;                                         // 写触发命令 (0xa5)
  171.         _nop_();
  172.         _nop_();
  173.         _nop_();
  174.         _nop_();
  175.         IapIdle();                                                                 // 关闭 IAP 功能
  176. }
  177. void INT4_Isr(void) interrupt 16
  178. {
  179. IAP_CONTR=0x60;                       
  180. }
  181. void delayms(u16 ms)
  182.         {u16 i;
  183.         do{
  184.                 i = MAIN_Fosc /10000;
  185.                 while(--i);
  186.         }                while(--ms);
  187. }
  188.        
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-1 22:04:12 | 显示全部楼层
wnag*** 发表于 2024-8-1 21:28
我一般是哪个完整的代码删减,删到程序现象出异常为止,就找到可用代码的精简版了 ...


现在可以把串口助手调通了.
问题出在波特率,默认是9600
我改成115200就好了
现在慢慢吃读取,写入.

截图202408012203193130.jpg
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-1 23:15:51 | 显示全部楼层
又搞了点东西出来了.
现在每次断电,再打开,可以自动加1 了

截图202408012315236460.jpg
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-8-2 08:00:47 | 显示全部楼层
很厉害
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-8-2 08:46:02 | 显示全部楼层

都是这么过来的,慢慢摸索吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-8-2 09:04:41 | 显示全部楼层
烧录时的IRC频率设置需要跟程序里面定义从时钟参数一致才能正常工作,串口波特率参数也可以在定义里面修改
截图202408020903479942.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 05:49 , Processed in 0.139518 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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