本次的实验仍然沿用计数器的电路,不作电的改变,但却要更换程序。使用新的程序,可以赋予旧电路新的功能,以定时器来说,原先在计数器的递增按钮,在这里因程序的改写 而变成清除按钮;而原先的归零按钮,也变成计时开关按钮;至于两个七段显示,则由显示递增次数改为显示递增秒数,但上限仍然是"99"。 当送电开始后,秒数是不计时的,只显示"00"。按下计时开关钮后,即启动计时功能,显示就开始显示递增的秒数。当再度按下计时按钮(计时开关)后,这时显示持续显示暂停前的秒数,不再改变。 计时开关按钮就是一个计时的启动与暂停开关,与计数器的归零按钮异曲同工。无论是在计时中或是在暂停计时中,按下此按钮马上可以将定时值归零,而原先是计时的状态依然继续计时,暂停的状态依然继续。 1. 目的 □电路上:与实习5-7的相同。 □程序上:学习如何在不修改电路的情况下,增加或转变硬件的功能。 2. 材料 与实习5-7的相同 3. 电路 图5-34 原理图 4. 实照 图5-35 实照 5. 步骤 与实习5-7的相同。 6. 流程 图5-36 流程图 7. 程序 □标号说明 · RESET:起始程序的进点 · DISP_ZERO:显示"00"字进入点 · RE_OP:重新循环执行进入点 · CLRB:按钮状态值保存处 · BIT4:等待同步判断程序的进入点 · BIT8:等待同步判断程序的进入点 · BIT12:等待同步判断程序的进入点 · BIT13:等待同步判断程序的进入点 · NO_CY_ONE:定时值个位数递增,但十位数不受影响的数值处理进入点 · NO_CY_TEN:定时值十、个位数都递增,但十位数递增不溢了的数值处理进入点 · WAIT_DISP:等待同步判断程序的进入点 · WAIT_DISP3:等待同步判断程序的进入点 · WAIT_DISP4:等待同步判断程序的进入点 · WAIT_DISP5:等待同步判断程序的进入点 · DISP_CURR:显示程序进入点 · DELAY_10MS:请参照实习先例 · DELAY1:请参照实习先例 · DELAY2:请参照实习先例 · DELAY_7US:请参照实习先例 · DLY7:请参照实习先例 · DELAY_1MS:请参照实习先例 · DDA:请参照实习先例 · DDB:请参照实习先例 寄存器使用配置 · F3:程序状态字 · F7:I/O端口,包含读取按键电位、输出显示值、 · F23:欲显示数据的暂放区 · F24:延时子程序递减循环计数 · F25:延时子程序递减循环计数 · F26:循环计数,达50次为秒钟 · F27:开始计时按钮状态的保存处(1:按下0:未按) · F28:导入按键值的的暂放处 · F29:定时值的十位数存放处 · F30:定时值的个位数存放处 · F31:定时值存放处,使用BCD格式保存
8. 说明 (1)初始设置 这是设置端口引脚状态的程序,与计数器的初始设置相同。 (2)显示起始值 当刚送电后,显示器显示"00",表示由零开始计时。 (3)读取按钮 我们每秒取样导入按钮状态一百次振荡频率,只要两次取样的按钮值相等即代表按钮状态成立,而前后值若不等则视同抖动,不予理人。取样的间隔为10μs,是以消除抖动之用。 (4)判断按钮 当取入的按钮值成立时,以清除按钮的处理优先于计时开并按钮,如果清除按钮被按下的话,便显示"00"重新开始计时,如果没被按下,则进行计时开关按钮的判断。 (5)判断按钮二 此处是判断计时开关按钮是否被按下?如果有,则切换计时状态位。计时状态位为1表示按下,0表示未按下。 (6)同步处理 由于上述的各个步骤处理时间不一但为了使计时时间准确,所以在这里插入同步的处理。上述程序中处理较快完成的程序,当处理完时就将它跳跃至延时时间较长的地址去执行,反之处理较慢完成的程序,则将它跳跃至延时时间较短的地址去执行。这样无论程序处理流程条件如何,计时时间都不会受到影响。 (7)定时值递增 这里的递增程序与计数器的雷同,不过必须执行此处达50次才可递增一次,原因是程序全程执行一次是20毫秒,即是指1秒之内会执行50次,当重复执行至此50次后,便是时间经过1秒了,此时才可使定时值递增。为了能够知道是否已累积达50次,所以设立了一个记录次数的寄存器,每招待到此1次,就递增此寄存器的数1次,并判断是否已达50次?若不是则不可递增定时值,若是已达50 ,便递增定时值,并清除计满50次的寄存器,以便重新累积次数。 (8)同步处理二 作用与前一个同步处理是相同的经过定时值递增的程序执行后,由于递增过程中使用到许多分个执行,使得程序分个执行完后又产生不同步的现象,所以在此又做一次同步处理,以使计时更准确。 (9)循环处理 到此处时已经将主程序全程执行一遍了,耗时约20毫秒,然后又重新开始执行,这样周而复始,永远循环,直到断电或复位才改变。 (10)读值延时 此程序约能延时10毫秒的时间。 (11)显示定时值 这里的程序操作与计数器的显示程序一模一样,可参考以前的说明。 (12)熄灭延时 此程序约能延时7毫秒的时间。 (13)显示延时 此程序约能延时5毫秒的时间。
9.除错 □电路方面的错误:参照实验5-9。 □程序方面的错误: 1. 延时参数的数值不能任意更改,不然会造成计时的间隔时间不准确。 2. NOP指令的数目不能任意更改,不然会造成计时的间隔时间不准确。 3. BTFSS与BTFSC指令交替使用次数颇多,切勿混淆。 4. 指令结果保存位置指向复杂,指向操作数的值需用要特别注意。 5. 调用延时子程序的次数颇多,且本次延时程序有3种,注意不要调用错误。
|