前几天在进行单片机实验时,目的是用定时器0写一个流水灯的程序,代码如下,编译没有问题,但就是灯不亮,检查了好几次始终找不到问题,现在找到了,分享一下
#include//调用头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
#define long_time 10 //定时时间,每次50ms
uint n=0; //查表变量
uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯查表实现
/*********主函数**************/
void main(void)
{
EA=1; //开总中断
ET0=1;//开定时器0中断
TMOD=0X01;//选择方式1
TH0=(65536-50000)/256;//每次定时50秒
TL0=(65526-50000)%256;
TR0=1;//开启定时器
while(1);
}
void time0(void) interrupt 1 using 0
{
uint i=0; //此处存在问题,每次进入中断函数i都会被置为0
i++; //i始终为1
if(long_time0==i)//如果long_time0=1,则程序不会出错即使不等于1,编译时也不会报错,属于逻辑错误
{
i=0;
P1=temp[n++];
if(8==n) n=0;
}
TH0=(65536-50000)/256;//重新装入初值
TL0=(65526-50000)%256;
}
收获:
1.中断函数中定义的变量一定要注意赋初值是否符合逻辑,特别是循环中的变量
2.局部变量和全局变量或者静态变量的作用范围,比如将上面中断函数中的变量定义为全局变量或者静态变量就不会有问题
关键字:51单片机 定时器 中断函数 变量初始化
引用地址:
51单片机定时器中断函数中变量初始化的问题
推荐阅读最新更新时间:2024-03-16 16:05
51单片机练习题
1、填空题 1.1、MCS-51系统中,当PSEN信号有效时,表示CPU要从(外部程序存储器)存储器读取信息。 1.2、PSW中的RS1RS0=10时,R2的地址为(12H),RS1RS0=11时,R2的地址为(1AH)。 1.3、一个机器周期=12个(振荡周期)=6个(状态周期/时钟周期)。 1.4、在MCS-51单片机中,如果采用9MHz晶振,1个机器周期为(1.5)us。 1.5、若(DPTR)=2000H,(A)=50H,执行指令 MOVC A,@A+DPTR 后,送入A的是程序存储器(2050H)单元的内容。 1.6、假定累加器(A)=50H,执行程序存储器2000H单元处的指令 MOVC A,@A+PC 后,送
[单片机]
51单片机-温度控制-PID算法-DS18B20-C语言
#include reg51.h #include intrins.h #include math.h #include string.h struct PID { unsigned int SetPoint; // 设定目标 Desired Value unsigned int Proportion; // 比例常数 Proportional Const unsigned int Integral; // 积分常数 Integral Const unsigned int Derivative; // 微分常数 Derivative Const unsigned int LastError; // Error u
[单片机]
51单片机PID算法程序(三)增量式PID控制算法
当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的 增量算法 。 增量式PID控制算法可以通过(2-4)式推导出。由(2-4)可以得到控制器的第k-1个采样时刻的输出值为: (2-5) 将(2-4)与(2-5)相减并整理,就可以得到增量式PID控制算法公式为: (2-6) 其中 由(2-6)可以看出,如果计算机控制系统采用恒定的采样周期T,一旦确定A、B、C,只要使用前后三次测量的偏差值,就可以由(2-6)求出控制量。 增量式PID控制算法与位置式PID算法(2-4)相比,计算量小得多,因此在实际中得到广泛的应用。
[单片机]
不同内存空间定义变量在51单片机编程中的注意事项
不同内存空间(data xdata bdata)定义变量在51单片机编程中的注意事项 减小字体 增大字体 1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同 3、确保你的程序中没有未调用的函数。 在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办
[单片机]
mini2440 按键驱动添加定时器消抖动
测试程序和Makefile同前面的实验一样的,这里只记录一下驱动的源代码就行了,改动不大,就是把唤醒进程和发送异步信号的操作移动到定时器的超时函数里面去了,这样做的目的是为了消除按键的机械抖动。 驱动源代码: #include linux/module.h #include linux/kernel.h #include linux/device.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/interrupt.h #include linux/irq.h #include linux/gp
[单片机]
51单片机 运算能力 测试
几天前在做51循迹小车程序的时候,为了能用得上PID算法,在程序中用了很多浮点数运算。大家都知道51单片机是8位单片机,而浮点数是32位的,当时我就在想,浮点运算用多了会不会影响到小车程序的反应速度和性能呢,当时为了完工,没有多想,只是想着 反正我在程序里也用不到多少,应该不会有太大的影响。 今天一想,为何不来做个测试呢,说做就做,程序很快调通了,测试结果也出来了。 首先说一下我所用的51单片机配置: STC12C5A60S2增强型51单片机, 11.0592M晶振, 1T模式(1个时钟周期执行1条指令,大部分51单片机是12T的,单片机这点和PC不同)。 测试原理: 1.用片上定时器/计数器0实现了一个计时器; 2.记录
[单片机]
基于51单片机的MODBUS通信C语言程序(从机)
#include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; #define TIMER_HIGHT 0xf8 #define TIMER_LOW 0xcd sbit bRunLED =P3^4; //运行指示灯 sbit bWatchDog =P1^7; //看门狗复位 sbit b485Send= P1^3; //75LBC184 发送接收控制 uint32 dwTickCount,dwIntTick; //时钟 uint8 i
[单片机]
51单片机小白零基础教程——独立键盘检测原理以及实际应用
一、键盘的概念 键盘:是电子系统中,人机对话的重要组成部分,是人向机器发出指令、输入信息必须的设备 通常来说,键盘有编码键盘和非编码键盘两种。 编码键盘:键盘上闭合键的识别由专门的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘,这种键盘使用方便,所需程序简单,但硬件电路复杂 非编码键盘:是利用软件编程来实别键盘的,在单片机组成的各种系统中,最常用的就是非编码键盘,特点是硬件电路简单 非编码键盘又分为独立键盘和矩阵式键盘。 二、独立键盘的检测 在单片机的外围电路中,常常用到的按键是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开。 如图,当按下开关时,原本连在一起的1和2脚,3
[单片机]