实验二 LED16*16点阵实验
开始 建立“欢迎使用星研实验仪”字符表 初始化8255,PA、PB、PC口为输出口 初始化8155,PA口为输出口 测试16*16 LED是否全亮 延时 熄灭16*16 LED 延时 字符数->计数器0 字符表首地址->SI 16->计数器1(一屏行数) 显示一屏子程序 SI=SI+2 计数器1 – 1 = 0 N N Y 计数器0 – 1 = 0 Y 开始 8->计数器2(一屏刷新8次) 16->计数器3 OFFFEH->BX(允许显示第一行) BX->8255的PA、PB 取字符表中数据->AL AL的0..7位调整到AL的7..0位 AL->8255的PC口(左边行) 取字符表中数据->AL AL的0..7位调整到AL的7..0位 AL->8155的PA(右边行) 延时10ms BX循环左移一位 N 计数器3 -1=0 Y N 计数器2 -1=0 Y 返回
实验三 数字式温度计实验
主程序
开始 初始化8255 调用启动DS18B20子程序 Y CF=1 N 延时1s 调用读温度子程序 16进制转10进制->3、2、1号数码管 4、5、6、7、8号数码管消隐
写18B20子程序
开始 8->CX 调用0->PC0子程序 ROR AL,1 CF=0 N Y 调用1->PC0子程序 保存CX,恢复CX 保存CX 12->CX CX-1=0 N Y 恢复CX 调用1->PC0子程序 N CX-1=0 Y 返回 读18B20子程序
开始 8->CX 8255控制口地址->DX 80H->AL AL->[DX](0->PC0) 89H->AL AL->[DX](PC口输入) NOP NOP NOP 8255PC口地址->DX [DX]->AL ROR AL,1 RCR BL,1 8255控制口地址->DX 80H->AL AL->[DX](0->PC0) 1->AL AL->[DX](1->PC0) N CX-1=0 Y BL->AL 返回
复位DS18B20子程序
开始 调用0->PC0子程序 (主机发出501us复位低脉冲) 136->CX N CX-1=0 Y 8255控制口地址->DX 89H->AX AL->[DX](PC输入状态) DX-1 15->CX [DX]->AL AL.0=1 N Y N 136->CX CX-1=0 Y CX-1=1 N 1->CF(18B20部不存在) Y 0->CF 返回 0->8255的PC0口子程序
开始 保存AX 8255的控制口-> DX 80H->AL AL->[DX](0->PC0口) 恢复AX 返回
启动DS18B20子程序
开始 调用复位DS18B20子程序 Y CF=1 N 0CCH->AL 调用写DS18B20子程序(跳过ROM匹配) 0BEH->AL 调用写DS18B20子程序(发出温度转换指令) 0->CF 返回 读温度子程序
开始 调用复位DS18B20子程序 0CCH->AL 调用写DS18B20子程序(跳过ROM匹配) 44H->AL 调用写DS18B20子程序(发出温度转换指令) 调用读18B20子程序 AL->AH 调用读18B20子程序 AL与AH交换 返回 1->8255的PC0口子程序
开始 保存AX 8255的控制口-> DX 01H->AL AL->[DX](0->PC0口) 恢复AX 返回
实验四 步进电机实验
开始 0->需要刷新显示标志 1->步进电机未转动过标志 1->转动方向标志(1:表示顺时针方向) 33H->下次送给步进电机值 5->步进电机转速 初始化8255(PC口输出) 初始化8253(计数器T0设置在模式2状态,BCD码计数,CLK0/210) 初始化8259(允许8253中断) 初始化8253中断向量 初始化显示缓冲区: (数码管第8位:0,顺时针方向;5、7位消隐;6位:转速; 1、2、3、4位:0,表示连续转动,其他值表示需要转动的步数) 调用显示子程序 有键按下 N 需要刷新显示标志=1 Y 0->需要刷新显示标志 调用步数调整子程序 关中断(终止步进电机转动) 键值>9 N Y Y Y Y 数码管的1、2、3位->2、3、4位 键值送给数码管的第一位 调用改变转向子程序 Y 键值=0AH N 键值=0BH 调用增速子程序 N 键值=0CH 调用减速子程序 N 键值=0DH 调用启动步进电机子程序 N
改变方向子程序:
启动步进电机子程序:
开始 Y 转动方向标志=0 N 0->转动方向标志 1->送给数码管的第7位 步进电机未转动过标志 91H->下次送给步进电机值 下次送给步进电机值循环右移二次 Y 1->转动方向标志 0->送给数码管的第7位 N 步进电机未转动过标志 Y 33H->下次送给步进电机值 下次送给步进电机值循环左移二次 返回 增速子程序:
开始 Y 转速=11 N 转速+1 转速送给数码管第5位 返回
开始 0->步进电机未转动过标志Y 取转动步数 取转速对应的延时值(转速延时) 转速延时< 50 N Y 初始转速延时=50 初始转速延时=转速延时 初始转速延时1=初始转速延时 开中断 返回 减速子程序:
开始 转速=0 Y N 转速-1 转速送给数码管第5位 返回
定时中断程序:
开始 N Y 初始转速延时 -1=0 Y 初始转速延时1=转速延时 N 初始转速延时1 - 1 初始转速延时=初始转速延时1 下次送给步进电机值->8255的PC口(控制步进电机转动一步) 转动方向标志=0 Y 下次送给步进电机值循环右移一次 N 下次送给步进电机值循环左移一次 Y 转动步数=0 N 1->需要刷新显示标志转动步数减一 N 转动步数=0 Y 关中断 N 清中断标志 返回
显示转速子程序:
开始 数码管5、6位上显示DA缓冲区的值 数码管1、2位上显示转速(十进制数) 返回
8253定时中断程序:
开始 1->1S定时到标志 转速=记录脉冲数缓冲区 / 4(转一圈产生4个脉冲) 0->记录脉冲数缓冲区 清中断标志 中断返回
光电开关的中断程序:
开始 读8253计数器1的16位寄存器->缓冲器 Y 缓冲器-16位计数缓冲区 < 100 (前后二次脉冲采样时间差小于1000,判断是干扰) N 记录脉冲数缓冲区+1 清中断标志 中断返回
实验七 ISD1420语音模块实验
开始 初始化8255(PA为输入,PC的低四位为输出) 初始化ISD1420(语音模块初始化,关闭录放音功能 调用键盘扫描子程序 N 有键按下标志=1 Y 调用按键处理子程序 N 有新的按键按下 Y
键扫描子程序:
开始 按键处理子程序:
开始 0->有键按下标志 键值=1 Y Y Y Y Y Y Y Y 取1号键录音首地址 N Y 8255的PA口=0FFH 键值=2 取2号键录音首地址 N 将PA口的值转化为键值1 延时40ms N 键值=3 取3号键录音首地址 N 键值=4 取4号键录音首地址 Y N 8255的PA口=0FFH 键值=5 取5号键放音首地址 N 将PA口的值转化为键值 N 键值=6 取6号键放音首地址 取7号键放音首地址 取8号键放音首地址 N 键值=键值1 N 键值1=键值 键值=7 N Y 8255的PA口=0FFH N 键值=8 Y 1->有键按下标志 N 返回
返回
录音子程序:
开始 20->计数器 设置录音起始地址 0->8255的PC0(REC变低,即开始录音) 放音子程序:
开始 20->计数器 设置放音起始地址 0->8255的PC1,1->8255的PC1 (0,1->PLAYE开始放音,边沿放音模式) 调用延时250毫秒子程序 Y 调用延时250毫秒子程序 有键按下标志=1 N 计数器-1=0 Y N 有键按下标志=1 N 计数器-1=0 Y 1->8255的PC0(REC变高,即停止录音) N Y 0->8255的PC2,1->8255的PC2 (PLAY:一个负脉冲停止放音) 返回
返回
延时250毫秒子程序:
开始 延时250ms 调用键扫描子程序 返回
实验九 电子钟实验
设置时间子程序:
开始 开始 1->刷新标志 初始化时、分、秒缓冲器 初始化8253(计数器T0设置在模式2状态,HEX记数,CLK0/7A12H,0.5s定时) 初始化8259,初始化中断向量 0->NUMBER(当前设置位于小时的十位上) 闪烁标志=1 0->闪烁标志 刷新时、分、秒,使当前设置时间位置闪烁 有键按下 调用键扫描库函数 N N Y 键值=0FH 调用键扫描库函数 Y 调用设置时间子程序 N 有键按下 Y 键值=0EH Y Y N 放弃设置 刷新标志=1 Y 0->刷新标志 显示时、分、秒 N 键值=0FH N N 键值在当前时间设置位有效范围Y 暂存当前时间 NUMBER+1 N NUMBER>5 Y 保存当前设置于当前时间缓冲区 返回
8253中断子程序:
开始 0->秒缓冲器设置闪烁标志 半秒缓冲器+1 分缓冲器+1 N N 分缓冲器>59 Y 0->分缓冲器时缓冲器+1 半秒缓冲器=2 Y 1->刷新标志 0->半秒缓冲器 秒缓冲器+1 N 时缓冲器>23 Y 0->时缓冲器 秒缓冲器>59 N 中断返回 Y
因篇幅问题不能全部显示,请点此查看更多更全内容