历史上的今天
今天是:2024年11月20日(星期三)
2018年11月20日 | 单片机日常系列!今天我在修改定时器定时功能...
2018-11-20 来源:eefocus
慎用标志位(本人单片机菜鸟,高手请高抬贵手,欢迎指点!~)
这里说的是合理谨慎的运用标志位,否则很容易出现错误,也很难debug。
今天工作的时候,修改定时器定时功能的时候,得出的经验,这里说的与具体的单片机无关,是个通用的想法。
以我今天修改的为例:
PIC单片机的两个I/O引脚控制着两个LED灯(分别为蓝灯和红灯,这里以LED代替,避免涉及公司里的内容)的亮和灭。
要求是
蓝灯每5s亮一次,大概亮100ms;
红灯每隔10s亮一次,每次亮100ms;
红灯和蓝灯尽量错开。
我的思路是,
定义一个10s的时间轴,用定时器来实现,在2.5秒和7.5秒时刻点亮蓝灯,在10s时刻点亮红灯。
有一个全局变量cnt。
定义一个全局变量times = 0。
[cpp] view plain copy print?
0 2.5s 5s 7.5s 10s
|-------------|===|-------------|-------------|===|-------------|+++|
blue blue red
|----times=0------|----------times=1----------|----times=0-----------|
我理所当然的就
每10ms进一次中断
if((cnt > 250)&&(times == 0))
{
times = 1;
blue_led_light_flag = 1;
blue_led_on = 1;
}
if((cnt > 750)&&(times == 1))
{
times = 0;
blue_led_light_flag = 1;
blue_led_on = 1;
}
if(cnt > 1000)
{
red_led_light_flag = 1;
red_led_on = 1;
}
if((cnt > 250)&&(times == 0)) 理所当然的以为这样是可以的,且不知这里有一个bug,因为在7.5-10s的时候,也符合这个条件的。。。这样出来的系哦啊过就不是上面所想的
我们应该改为if((cnt > 250)&&(times == 0)&&(cnt < 750))这样才是可以的。。。
史海拾趣
|
各位哥哥哥姐这个程序第一次启动定时器可以正常运行,第二次启动定时器就不中断了,小弟初学单片机,实在是找不出原因了。 ORG 0000H LJMP START MORG 000BH LJMP TIMER1 ;定时器1的中断处理 ORG 30H START: &nbs ...… 查看全部问答> |
|
虽说越来越多的人把时间花在网络上,但静静地读一本好书,从中获得的不仅仅是书本身,而是一种心灵暂时的宁静。 李笑来,这个名字对于那些考过托福、GRE的人并不陌生,这位前新东方的老师著有一些应试的畅销书。而对于我这个从没想过出国的人来说 ...… 查看全部问答> |
|
下述代码用VC能编译通过,用ads1.2编译器则不行,错误提示:Serious error: C2432E: non-constant initialiser #define BYTE unsigned char #define WORD unsigned short int #define DWORD unsigned int #define SDWORD signed int #define SBYTE signed char #define SWORD signed short int static SWORD neg_pow2[17]={0,-1,-3,-7,-15,-31,-63,-12 ...… 查看全部问答> |
|
请教一个EVC中动态改变静态文本控件颜色的问题; 现在正在开发一个基于WinCE.net4.2平台的应用程序,用EVC开发一个MFC应用程序。 碰到的问题是:我在对话框中依次排列了四个静态文本控件,ID分别为IDC_STATIC1,IDC_STATIC2,IDC_STA ...… 查看全部问答> |
|
请教版主,STM8S103F单片机AD的模拟输入通道为AIN2~AIN6,如果需要使用AD扫描采样的话,能不能从AIN2开始扫描。… 查看全部问答> |
|
我的单通道多次转换AD,已经有软件的平滑滤波,但是检测大于1V的信号是显示低于1V接近1V 检测200mV的信号显示0.956~0.542之间不断波动,总之是与实际值相差较大,检测2V以上信号时 ...… 查看全部问答> |




