找回密码
 立即注册
楼主: wuzhengmin

比较器实验求救 | 已解决

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-09 08:53:15
已绑定手机

2

主题

225

回帖

666

积分

高级会员

积分
666
发表于 前天 09:15 | 显示全部楼层
但是第一个问题,计时秒数不能超过1000,就真不知道是哪里造成的?显示子函数也检查过了,没有操作

Test_cnt++ 或者 Test_cnt=0 的地方啊?

当然,本身时间就不对,感觉定时器快了10倍........

但是定时器0初始化也是1ms啊 搞蒙了.....................
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-09 08:53:15
已绑定手机

2

主题

225

回帖

666

积分

高级会员

积分
666
发表于 前天 09:30 | 显示全部楼层
折腾了1小时,第二个问题还没有复现


其实第二个问题更头痛,感觉好像是硬件损坏的样子...............

当然,也可能是第三个问题引起的。

开始乱改:

  1. void main()                                        //程序开始运行的入口
  2. {
  3.         sys_init();                                //USB功能+IO口初始化
  4.         usb_init();                                //usb库初始化
  5.         EUSB = 1;
  6.         Timer0_Init();                        //定时器0初始化
  7.         EA = 1;                                        //CPU开放中断,打开总中断。
  8.         while( DeviceState != DEVSTATE_CONFIGURED );
  9.         CMP_Init();                //比较器初始化
  10.         
  11.         
  12.                 if( bUsbOutReady )                                                               
  13.                 {
  14. //                        USB_SendData(UsbOutBuffer,OutNumber);
  15.                         usb_OUT_done();
  16.                 }
  17.                
  18.         
  19.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  20.                 {
  21.                         TIM_10MS_Flag = 0;                                                                        //清空标志位
  22.                 }
  23.                         
  24.                         EEPROM_read_n(EE_ADDRESS,tmp,2);        //读出2字节
  25.                         Test_cnt = ((u16)tmp[0] << 8) + tmp[1]; //秒计数
  26.                         if(Test_cnt > 55000)    Test_cnt = 0;   //秒计数范围为0~10000
  27.                         
  28.                         Test_cntSet();
  29.                         while(1)
  30.                         {
  31.                                         if((B_1ms) && (LowVolFlag == 0))   //1ms到,低电压时不工作
  32.                                         {
  33.                                                 B_1ms = 0;
  34.                                                                 if(++TimCount_z >= 100)   //1秒到这里不是应该1000么?
  35.                                                                 {
  36.                                                                         TimCount_z = 0;        //清1000ms计数
  37.                                                                         Test_cnt++;         //秒计数+1
  38.                                                                         if(Test_cnt > 55000)    Test_cnt = 0;   //秒计数范围为0~10000
  39.                                                                         
  40.                                                                         Test_cntSet();
  41.                                                                 }
  42.                                                                         
  43.                                         }
  44.                         }
  45. }
复制代码
把原来:if(Test_cnt > 10000)    Test_cnt = 0;   //秒计数范围

改成:if(Test_cnt > 55000)    Test_cnt = 0;   //秒计数范围

烧录进去,竟然能够越过1000,但是,马上试了一下掉电存储,结果又不行啦

试多一下,有时候又可以.............晕倒!!!!

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-09 08:53:15
已绑定手机

2

主题

225

回帖

666

积分

高级会员

积分
666
发表于 昨天 20:42 | 显示全部楼层
今天我努力奋斗,终于找到问题所在:


是显示函数出了问题:

先看正确的显示赋值函数:
  1. void Test_cntSet(void)
  2. {
  3.                         SEG0  = Test_cnt/10000%10;  //取10000位
  4.                         SEG1  = Test_cnt/1000%10;        //取1000位
  5.                         SEG2  = Test_cnt/100%10;        //取100位       
  6.                     SEG3  = Test_cnt/10%10;                //取10位
  7.                         SEG4  = Test_cnt%10;                //取1位
  8. }
复制代码
我把最后一行多除了10

这样,这个实验就OK啦



计时数据掉电保存.zip

361.48 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-09 08:53:15
已绑定手机

2

主题

225

回帖

666

积分

高级会员

积分
666
发表于 昨天 20:49 | 显示全部楼层
然后我多手,想进一步:


把时钟程序增加个掉电存储功能?

接着就发现有冲突:
  1. /**********************************************/
  2. void main(void)
  3. {
  4.     u8  i;
  5.         u16 count;
  6.         u8 Key_num;    //闪烁时要写入的Key值
  7.     SYS_Init();
  8.        
  9.         ADC_Init();
  10.    
  11.    
  12.    
  13.         Timer0_Init();
  14.        
  15.         //CMP_Init();                //比较器初始化
  16.        
  17.        
  18.    
  19.     EA = 1;     //打开总中断
  20.    
  21.     for(i=0; i<8; i++)  LED8[i] = 0x10; //上电消隐
复制代码
只要一CMP_Init();                //比较器初始化

数码管显示就出问题,特别是最后1位(倒数第二位也是有问题的)

查了图纸,也没发现有哪个管脚有冲突,总之一使能比较强,就显示出问题............

ADC应用-时钟存储.zip

289.3 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-09 08:53:15
已绑定手机

2

主题

225

回帖

666

积分

高级会员

积分
666
发表于 昨天 20:53 | 显示全部楼层
下午我又重新写了个显示函数:


好一点,勉强能验证是可以掉电保存时钟数据的

但是,最后一位数码管还是显示不正常:


计时数据掉电保存.zip

363.34 KB, 下载次数: 0

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-10 13:01 , Processed in 0.138506 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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