首先感谢STC公司免费送的AI8051U试验箱。今天收到试验箱了。图片:
继续学习 第八集 定时器周期性任务调度 编程过程中难免有错误,要根据编译错误提示的行数及上一行、下一行进行查找错误。 1,周期性任务介绍 2,文件的创建 3,结构体的介绍 4,结构体数组的周期性任务调度 一,周期性任务 任务1:用一个定时器来实现LED1 0.3秒反转一次,LED2 0.6秒反转一次,LED3 0.9秒反转一次。任务特点都有定时器1毫秒加的变量,都有一个设定的计数目标,都有需要执行的功能,定时时间到了才能执行。 编程思路:通过一个变量计数,假定每1毫秒自加一次,加到300即为300毫秒,加到600即为600毫秒,加到900即为900毫秒,计数达到次数后清0重新开始计数,进行下一次的循环。 数组定义:数组类型 数组名[长度] = {元素}; 各元素之间用逗号隔开。 赋值:数组名[下标] = 数值; 使用:数组名[下标] 下标是从0开始的正整数。 #define u8 unsigned char;//u8为unsigned char的重命名 u8 static[8] = {1,2,3,4,5,6,7,8};//定义数组static Printf(“static数组的第一个元素是:%d\r\n”,Static[0]);//使用数组的第一个元素。[]中的0为 //下标,表示第一个元素。 \\定义计数变量数组 U8 count_ms[] = {0,0,0}; \\使用计数变量 Void timer0_isr(void) interrupt 1 { For(i=0;i<3;i++) { Count_ms[0]++; If(count_ms[0]>=300) { count_ms[0] = 0; State 1= !state1 P00 = state1; } If(count_ms[1]>=600) { count_ms[1] = 0; State 2= !state2 P01 = state2; } If(count_ms[2]>=900) { count_ms[2] = 0; State 3= !state3 P02 = state3; } } } 任务2:流水灯的数组实现,从P00---P07八个灯依次点亮熄灭 定义state[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 主程序中加入 While(1) { If(count_ms<=500)//定时器延时到500毫秒时 { Count_ms = 0; P0 =~ state[num];//按位取反 Num++; If(num>7) Num = 0; } } 任务3:按键按一下,流水灯移动一下,不能再使用while()语句来判断按键是否弹起了。 If(count_ms[2]>=10) { Count_ms[2] = 0; If(P32 ==0) { Key_vol++; If(key_vol==5) Num++; } Else Key_vol = 0;
}
由于第八集的内容太多,分两次发表。这是前一部分。
|