黄山学院本科毕业论文
子程序putc_to_serialport()、键盘扫描子程序Keys_Scan()、LED数据显示子程序Display_Result(int d)、延时子程序Delay()、主机串口接受中断子程序Serial_INT() interrupt 4。 (1)主程序
主程序对系统进行初始化,主要是进行定时/计数的初始化,然后调用键盘扫描程序Keys_Scan(),再根据按下的键来调用向串口发送数据子程序putc_to_serialport()将相应的数据发送给串行口。当没有键按下时,则送一个数F给LED显示器。其流程图见图4.1
(2)向串口发送数据子程序putc_to_serialport()
该程序首先将数据发送到串行口,当T1=0时,表明传送结束。其流程图如4.2所示
(3)键盘扫描子程序Keys_Scan()
该程序是先将行选好,然后再选定列就可以确定到具体的哪一个按键。其流程图如图4.3所示
(4)LED显示程序Display_Result(int d)
该子程序用的数码管动态显示方式。先将单片机的P2.7口选通进行位选,然后将位选的值发送给单片机P1口。接着将单片机的P2.6口选通进行段选,然后将要显示的数字的值发送给P0口。然后调用延时,接着将P2.7、P2.6口置0,下面是重复上面的过程,直到要显示的数字全部显示在数码上。其流程图如4.4所示。
(5)主机串口接受中断子程序Serial_INT() interrupt 4。
当RI =1时,接受串口过来的数据,并对该数据进行X*05H/0FFH的处理,接下来用处理过的数据调用LED显示程序Display_Result(int d)。如图4.4所示
26
黄山学院本科毕业论文
开始 初始化 启动定时器1 开中断 判断是否有按键按下 Y 再根据扫描到的键盘号,发送相应的数据给串口, N 调用一个Display()在LED上显示F
图4.1主程序
数据发送到串行口 当T1=0时,则传送结束 TI=0
图4.2 向串口发送数据子程序putc_to_serialport()
27
黄山学院本科毕业论文
开始 先将低4位置1选定4行 然后判断该按键发生在哪一列 N 是否有按键按下 Y KeyNo=16 将列数赋给KeyNo 将高4位置1选定4列 再判断发生在那一行 0—3行分别附加起始值0,4,8,12 返回
图4.3键盘扫描子程序Keys_Scan()
28
黄山学院本科毕业论文
开始 显示个位 显示十分位 显示百分位 显示小数点 结束
图4.4 LED显示程序Display_Result(int d)
开始 接受数据 对数据进行相关处理 调用Display_Result(m)
图4.5 主机串口接受中断子程序Serial_INT() interrupt 4
4.3 从机部分程序设计
该部分的程序包括一个主程序、三个子程序,三个子程序分别为从机串口接受中断函数Serial_INT() interrupt 4、向串口发送数据子程序putc_to_SerialPort(uchar c)和模数转换子程序ADCON。 (1)主程序
主程序是进行系统的初始化,由于主从两个单片机要进行通信,所以两个单
29
黄山学院本科毕业论文
片机的初始化应该是相同的,并调用A/D转换。其流程图如图4.6所示 (2)从机串口接受中断函数Serial_INT() interrupt 4
因为发送完成和接受到新字节都会触发串口中断,因此串口中断程序里用if(RI)来表示接受中断,然后将RI清0。再判断接受到的数据第4位是否为1,如果为1,则按照主机发送过来的通道进行采集,如果为0,则调用循环采集程序。如图4.7所示
(3)模数转换子程序ADCON
先要选通ADC0809,又因为ADC0809具有8个通道,利用For循环进行8次采集,接下来选择转换通道,F8H~FFH用以选择输入模拟信号的通道IN0~IN7的选择,首先从第一个通道开始,然后执行一条读取转换结果的指令,再将转换得到的结果送给串行口,再依次循环,将通道号自增1,直到8个通道全部转换完。其流程图如图4.8所示
(4)向串口发送数据子程序putc_to_SerialPort(uchar c)
程序首先将数据发送到串行口,当T1=0时,表明传送结束。如图4.2所示
开始 初始化 启动定时器1 开中断 调用Adcon() 结束
图4.6 主程序
30