已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
硬件课程设计报告 - 1 - 硬件课程设计报告硬件课程设计报告 专业专业 班级班级 学号学号 姓名姓名 中国矿工业大学计算机科学与技术学院中国矿工业大学计算机科学与技术学院 2011 年年 12 月月 硬件课程设计报告 - 2 - 目 录 一、概要一、概要.3 3 二、焊接工艺总结二、焊接工艺总结.3 3 三、程序设计三、程序设计.3 3 (一)LED 灯应用.3 (二)数码管显示.12 (三)蜂鸣器播放音乐.21 (四)按键识别.23 (五)串口通信.26 (六)时钟定时器中断应用.33 (七)时钟日历时钟芯片 DS1302 应用.37 (八)数字温度计温度传感器 DS18B20 应用.47 四、体会与建议四、体会与建议.5353 硬件课程设计报告 - 3 - 一、一、 概要概要 实验开发板配置为 STC89C52RC 单片机,内置 8K 的 ROM 程序存储器,支持串口 ISP 在线下载。实验板上有 8 位数码管,可做静态显示、动态扫描以及数字时钟显示 等;16 位 LED 发光二极管,可进行流水灯等实验;6 个按键可实现按键查询、按键中 断等;利用蜂鸣器可进行报警提示、播放音乐等;利用 DS1302 时钟芯片可进行时钟 精确计时,制作简易的时钟日历;通过温度传感器 DS18B20 接口可编程获取环境温度, 制作数字温度计;MAX232 芯片构成标准的 RS232 串行通信接口,可与 PC 机、单片机 开发板进行串行通信,也可由计算机直接下载程序至单片机进行程序的烧录。通过编 程设计与本开发板配套的程序,完成相关硬件设备的应用,充分理解与掌握单片机的 原理与应用,提高动手实践与编程的综合能力。 二、二、 焊接工艺总结焊接工艺总结 本实验板为双面板,2 条腿以上的元件,焊上后拆下重焊比较困难。应按照顺序 先焊易焊元件如电阻、小电容、12M 和 32768HZ 的晶振、小开关等无极性元件。在焊 电路板时,首先焊接电源部分的元器件,J1、J2、S1、E1、E2、R5,然后接电源,检 查电路板是否正常;然后焊接 7 段 LED 显示器下面的元件,并安装好 7 段 LED 显示器 下的一个橡胶垫;然后焊其它元件,焊接元件按低高顺序,先焊低的,后焊高的,再 焊集成电路插座,最后焊接 7 段 LED 显示器和串口插座等。焊接过程中应注意排阻的 公共端不能焊反,以及四位的 LED 数码管和 LED 发光二极管等具有极性的元件的电极 也不能焊反。 三、程序设计三、程序设计 (一)LED 灯应用 1. 流水灯 (1)实现功能 在实验板上点亮第一个 LED 灯后,再熄灭第一个 LED 灯,然后延时一段时间,接着再点亮第二个 LED 灯,接着再熄灭第二个 LED 灯直至 16 个灯依次被点亮和熄灭,如此循环构成 16 个 LED 灯 亮灭显示的流水灯。 (2)编程思想 利用循环移位 先将 P2 赋值为 0 xff 关闭右边 8 个灯,再将 P0 口赋值为 0 xfe 点亮第一个 LED 灯,延时 50ms 后,将 0 xfe 循环左移一位再赋给 P0,接着再延时 50ms,如此循环下去,待 P0 口控制的 8 个灯循环完毕后, 再将 P0 赋值为 0 xff 关闭左边 8 个灯将 P2 口赋值为 0 xfe,重复上述的循环操作。这样可使 16 个 LED 灯实现右移的流水灯。实现左移的流水灯时,可先将 P0 赋值为 0 xff 关闭左边 8 个灯,再将 P2 硬件课程设计报告 - 4 - 口赋值为 0 x7f,然后延时 50ms,接着将 0 x7f 循环右移一位再赋给 P2,如此循环下去,循环完毕后 再将 P0 口赋值为 0 x7f 重复上述循环操作。这样可使 16 个 LED 灯实现左移的流水灯。 利用取表方式 定义两个数组 a,b,数组 a 中存放依次点亮 8 个灯时 P0 和 P2 口应赋的 8 个值,然后让 P0 和 P2 循环 取遍 a 中的值,如此可构成右移的流水灯,数组 b 中反序存放数组 a 中 8 个值,然后让 P0 和 P2 循环 取遍 b 中的值,如此可构成左移的流水灯。 (3)程序框图 循环移位方式 主程序框图: 右移函数框图: 否 否 是 是 开始 P2=0 xff,P0=0 xf e P0 口的值0 xfe循 环左移 1 位 循环 8 次? P0=0 xff,P2=0 xf e 延时 50ms 延时 50ms P2 口的值0 xfe循 环左移 1 位 循环 8 次? 结束 硬件课程设计报告 - 5 - 左移函数框图: 否 否 是 是 取表方式 主程序框图: 右移函数框图: 开始 P2=0 x7f,P0=0 xf f P2 口的值0 x7f循 环右移 1 位 循环 8 次? P2=0 xff,P0=0 x7 f 延时 50ms 延时 50ms P0 口的值0 x7f循 环右移 1 位 循环 8 次? 结束 硬件课程设计报告 - 6 - 否 否 是 是 左移函数框图: 否 否 是 是 开始 P2=0 xff i 自增 1 循环 8 次? P0=0 xff P0=ai 延时 50ms P2=ai 延时 50ms i 自增 1 循环 8 次 结束 开始 P0=0 xff i 自增 1 循环 8 次? P2=0 xff P2=bi 延时 50ms P0=bi 延时 50ms i 自增 1 循环 8 次? 结束 硬件课程设计报告 - 7 - (4)程序代码 循环移位方式 #include #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; void delayms(uchar); void youyi(); void zuoyi(); void main() while(1) youyi(); zuoyi(); void youyi() temp=0 xfe; P2=0 xff; P0=temp; for(i=0;i8;i+) delayms(50); temp=_crol_(temp,1); P0=temp; P0=0 xff; temp=0 xfe; P2=temp; for(j=0;j8;j+) delayms(50); temp=_crol_(temp,1); P2=temp; void zuoyi() temp=0 x7f; P0=0 xff; P2=temp; for(i=0;i0;y-); 取表方式 #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; uchar code a=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe; void delayms(uchar); void youyi(); void zuoyi(); void main() while(1) youyi(); zuoyi(); void youyi() P2=0 xff; for(i=0;i8;i+) P0=ai; delayms(50); P0=0 xff; for(j=0;j8;j+) P2=aj; delayms(50); 硬件课程设计报告 - 9 - void zuoyi() P0=0 xff; for(i=0;i0;y-); 2.闪烁灯 (1)实现功能 在实验板上点亮第一个 LED 灯后延时一段时间再熄灭第一个 LED 灯,然后再点亮第一个 LED 灯延时 一段时间再熄灭第一个 LED 灯,让第一个灯总共这样亮灭 4 次,接着再让第二个 LED 灯亮灭 4 次, 如此下去实现 16 个灯的亮灭闪烁并且能循环右移和左移。 (2)编程思想 定义两个数组 a,b,数组 a 中存放依次点亮 8 个灯时 P0 和 P2 口应赋的 8 个值,然后让 P0 和 P2 循环 取遍 a 中的值,每取 a 中的一个值时按如下方式循环 4 次:P0 和 P2 每次取值后先延时 100ms 再赋 值为 0 xff 再延时 100ms。这样下去可构成循环右移的闪烁灯。数组 b 中反序存放数组 a 中 8 个值, 然后让 P0 和 P2 按上述方式循环取遍 b 中的值,如此可构成循环左移的闪烁灯。 (3)程序框图 主程序框图: 硬件课程设计报告 - 10 - 右移闪烁函数程序框图: 左移闪烁函数程序框图: 硬件课程设计报告 - 11 - (4)程序代码 #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; uchar code a=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe; void delayms(uchar); void youshan(); void zuoshan(); void main() while(1) youshan(); zuoshan(); void youshan() P2=0 xff; for(i=0;i0;j-)/每个灯闪烁 4 次 P0=ai; delayms(100); P0=0 xff; delayms(100); P0=0 xff; for(i=0;i0;j-) P2=ai; delayms(100); P2=0 xff; delayms(100); void zuoshan() P0=0 xff; for(i=0;i0;j-) /亮灭 4 次 P2=bi; delayms(100); P2=0 xff; delayms(100); P2=0 xff; for(i=0;i0;j-) 硬件课程设计报告 - 12 - P0=bi; delayms(100); P0=0 xff; delayms(100); void delayms(uchar z) /z 取值(1127) uchar x,y; for(x=2*z;x0;x-) for(y=248;y0;y-); (二)数码管显示 1.数码管静态显示 1.1 数码管 1 位静态显示 (1)实现功能 在实验板上让第一个数码管显示数字 1,然后第一个数码管熄灭,接着第二个数码管显示数字 2, 然后第二个数码管熄灭,如此依次让 8 个依次循环显示数字 1 到 8。 (2)编程思想 定义两个数组 a,b,数组 a 中存放数码管要显示的数字的编码值, 数组 b 中存放数码管的位选值, P0 通过取 a 中的值来显示相应数字,P2 通过取 b 中的值来决定哪一位显示,利用 for 循环来循环 8 次每次分别让 P0 和 P2 取数字 1 到 8 相对应的数组中的编码值和位选值,每取一次取值后延时 300ms 显示,接着给 P2 赋值 0 xff 关闭位选为下一次显示消影。 (3)程序框图 硬件课程设计报告 - 13 - (4)程序代码 #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; void delay100ms(uchar); uchar code a=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0X6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /0-F uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/位选 void main() while(1) for(i=1;i0;x-) for(y=200;y0;y-) 硬件课程设计报告 - 14 - for(z=248;z0;z-); 1.2 数码管 8 位静态显示 (1)实现功能 在实验板上同时让 8 个数码管显示数字 0,然后让 8 个数码管同时熄灭,接着再让 8 个数码管同时 显示数字 1,然后再让 8 个数码管同时熄灭,如此让 8 个数码管同时显示数字 0 到 9 以及 16 进制 的 A 到 F 并且循环显示。 (2)编程思想 定义数组 a,数组 a 中存放数码管要显示的数字的编码值,P0 通过取 a 中的值来显示相应数字,P2 赋值为 0 即打开所有的位选,在 for 循环中依次让 P0 取遍 a 中的值,每取一次取值后延时 300ms 显示。 (3)程序框图 (4)程序代码 #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; void delay100ms(uchar); uchar code a= 0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0X6f, 0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /0-F void main() 硬件课程设计报告 - 15 - P2=0; while(1) for(i=0;i0;x-) for(y=200;y0;y-) for(z=248;z0;z-); 2.数码管动态显示 2.1 数码管动态显示“” (1)实现功能 在实验板上让 8 个数码管同时显示且第一个数码管显示数字 1,第二个数码管显示数字 2,第 8 个数码管显示数字 8。 (2)编程思想 定义两个数组 a,b,数组 a 中存放数码管要显示的数字的编码值, 数组 b 中存放数码管的位选值, P0 通过取 a 中的值来显示相应数字,P2 通过取 b 中的值来决定哪一位显示,利用 for 循环来循环 8 次每次分别让 P0 和 P2 取数字 1 到 8 相对应的数组中的编码值和位选值,每取一次值后延时 50us,接着给 P2 赋值 0 xff 关闭位选为下一次显示消影。 (3)程序框图 硬件课程设计报告 - 16 - (4)程序代码 #include #include #define uint unsigned int #define uchar unsigned char uchar temp,i,j; void delay50us(); uchar code a=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0X6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /0-F uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/位选 void main() P2=0 xff; while(1) for(i=1;i0;x-) _nop_(); 硬件课程设计报告 - 17 - 2.2 数码管拉幕式显示“” (1)实现功能 在实验板上让第 1 个数码管显示数字 1,延时一段时间后在第 1 个数码管显示数字 1 的同时让第 2 个数码管显示数字 2,延时一段时间后在前两个数码管显示数字 1 和 2 的同时让第 3 个数码管显示 数字 3如此下去让 8 个数码管显示的位数依次增加并且能够从左到右和从右到左显示。 (2)编程思想 定义变量 u 来统计显示的位数,定义变量 flg 来标识是否 8 位显示已满,定义两个数组 a,b,数组 a 中存放数码管要显示的数字的编码值, 数组 b 中存放数码管的位选值,数组 a 中存放数码管要显示 的数字的编码值, 数组 b 中存放数码管的位选值,P0 通过取 a 中的值来显示相应数字,P2 通过取 b 中的值来决定哪一位显示。在主函数中利用两个 for 循环来分别实现从左到右和从右到左的显示, 通过标志位 flg 来决定执行哪个 for 循环,在每个 for 循环中通过循环 u 次来显示 u 位数,每次分 别让 P0 和 P2 取数字 1 到 8 相对应的数组中的编码值和位选值,每取一次值后延时 50us,接着给 P2 赋值 0 xff 关闭位选为下一次显示消影。同时在主函数中设置定时器 0 为工作方式 1 并开定时器 0 中断,在定时器 0 的中断函数中每到 400ms 时让显示位数 u 加 1,当显示位数达到 8 位时将 u 清 零同将标志位 flg 取反,以便在主函数中执行从右到左显示的 for 循环。 (3)程序框图 硬件课程设计报告 - 18 - (4)程序代码 #include #include #define uint unsigned int #define uchar unsigned char uchar i,u=1,t=0; void delay50us(); uchar code a=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0X6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /0-F uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/位选 bit flg=0; void main() TMOD=0 x01;/定时 / 计数器 0 设为方式 1 TH0=(65536-50000)/256;/定时 50ms 初值的高 8 位送 TH0 TL0=(65536-50000)%256;/定时 50ms 初值的低 8 位送 TH0 TR0=1;/启动定时器 ET0=1;/开定时/计数器 0 的中断 EA=1; /开 CPU 中断 P2=0 xff; P0=0; while(1) if(!flg) for(i=1;i0;x-) _nop_(); (三).蜂鸣器播放音乐 (1)实现功能 在实验板上让蜂鸣器播放康定情歌的乐谱。 (2)编程思想 康定情歌的曲谱用 F 调来演唱,定义数组 tonetab_F 来存放晶振频率 12MHZ 时 F 调 3 个 8 度 7 音 阶的音高参数,定义结构体 music_type 它包括两项 tone 和 delay,其中 tone 表示对应简谱中音符的 音名,如分别用 3+0,3+7,3+14 表示低音 3、中音 3 和高音 3,delay 表示/对应简谱中音符的持续 时间,即每个音的节拍,如分别用 0 x01,0 x02,0 x04,0 x08 表示 1/4 拍、半拍、1 拍和 2 拍。将康定情 歌的简谱按上述表示方式写成编码存放在数据类型 music_type 的数组 notetab 中。在主函数里通过 取数组 notetab 里音名对应的值代到数组 tonetab_F 中取相应的音阶的音高参数作为初值送定时器 0,并启动定时器 0 中断,在中断函数里对控制蜂鸣器的引脚信号进行取反,通过定时器 0 来控制 音阶的频率。取数组 notetab 里音名对应的节拍的值来控制每个音符延时时间。 (3)程序框图 硬件课程设计报告 - 22 - (4)程序代码 #include #include #include #define uchar unsigned char #define uint unsigned int sbit beep=P14; struct music_type uchar tone; /对应简谱中音符的音名,如 3+0,3+7,3+14 分别表示低音 3、中音 3 和高音 3 uchar delay;/对应简谱中音符的持续时间,如 0 x01,0 x02,0 x04,0 x08 分别表示 1/4 拍、半拍、1 拍和 2 拍 ; /以 1/4 拍为最短节拍,本程序 1/4 拍控制为 150ms uchar tl0,th0; uint code tonetab_F= /晶振频率 12MHZ 时,F 调 3 个 8 度 7 音阶的音高参数 64104,64260,64400,64463,64579,64685,64778,/低音 17 64820,64898,64968,65000,65057,65110,65157,/中音 17 65178,65217,65252,65268,65297,65323,65346 /高音 17 ; struct music_type code notetab= /康定情歌乐谱 3+7,0 x02,5+7,0 x02,6+7,0 x02,6+7,0 x01,5+7,0 x01,6+7,0 x03,3+7,0 x01,2+7,0 x04, 3+7,0 x02,5+7,0 x02,6+7,0 x02,6+7,0 x01,5+7,0 x01,6+7,0 x02,3+7,0 x06, 3+7,0 x02,5+7,0 x02,6+7,0 x02,6+7,0 x01,5+7,0 x01,6+7,0 x03,3+7,0 x01,2+7,0 x04, 5+7,0 x02,3+7,0 x02,2+7,0 x01,3+7,0 x01,2+7,0 x01,1+7,0 x01,2+7,0 x02,6+0,0 x06, 6+0,0 x02,2+7,0 x06,5+7,0 x02,3+7,0 x06,2+7,0 x01,1+7,0 x01,6+0,0 x06, 6+0,0 x02,2+7,0 x06,5+7,0 x02,3+7,0 x06,2+7,0 x01,1+7,0 x01,6+0,0 x06,0,0 x00; void delay10ms(uchar); 硬件课程设计报告 - 23 - void delay100ms(uchar); void main() uchar i,j; TMOD=0 x01;/设置定时器 0 为工作方式 1 EA=1; /开总中断 ET0=1;/开定时器 0 中断 while(1) i=0; while(notetabi.delay) /音符的持续时间不为 0 if(!notetabi.tone) /音符为 0,关闭定时器 0 TR0=0; else th0=tonetab_Fnotetabi.tone-1/256; TH0=th0; /音符参数送 TH0 高 8 位 tl0=tonetab_Fnotetabi.tone-1%256; TL0=tl0; /音符参数送 TL0 低 8 位 TR0=1; /启动定时器 0 for(j=0;j0;x-) for(y=20;y0;y-) for(z=248;z0;z-); void delay100ms(uchar t) /z 取值(1127) uchar x,y,z; for(x=t;x0;x-) for(y=200;y0;y-) for(z=248;z0;z-); (四)按键识别 (1)实现功能 在实验板上按下 K1 至 K6 键时数码管分别显示数字 1 到 6,同时蜂鸣器报响。 (2)编程思想 硬件课程设计报告 - 24 - 定义两个数组 a,b,数组 a 中存放数码管要显示的数字的编码值, 数组 b 中存放数码管的位选值, P0 通过取 a 中的值来显示相应数字,P2 通过取 b 中的值来决定哪一位显示。定义变量 ID 来标识哪 一个键被按下。当确认有按键按下时延时 5ms 消抖再确认该键是否被按下如果该键被按下则将 ID 赋值为相应的按键值,同时让蜂鸣器发声。通过 ID 的值代到数组 a 中取得相应的数字编码付给 P0 让数码管显示。 (3)程序框图 (4)程序代码 #include #include #define uint unsigned int #define uchar unsigned char sbit K1=P32, K2=P33, K3=P34, K4=P35, K5=P16, K6=P17; sbit beep=P14; uchar ID=0; uchar code a=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0X6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /0-F uchar code b=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe;/位选 void delayms(uchar); void delay50us(); void keyscan(); void display(); void fengming(); 硬件课程设计报告 - 25 - void main() while(1) keyscan(); display(); void keyscan() if(K1=0) delayms(5);/延时 5ms 消抖 if(K1=0) ID=1; fengming(); while(K1=0) dodelayms(5);/延时 5ms 消抖 while(K1=0); if(K2=0) delayms(5);/延时 5ms 消抖 if(K2=0) ID=2; fengming(); while(K2=0) dodelayms(5);/延时 5ms 消抖 while(K2=0); if(K3=0) delayms(5);/延时 5ms 消抖 if(K3=0) ID=3; fengming(); while(K3=0) dodelayms(5);/延时 5ms 消抖 while(K3=0); if(K4=0) delayms(5);/延时 5ms 消抖 if(K4=0) ID=4; fengming(); while(K4=0) dodelayms(5);/延时 5ms 消抖 while(K4=0); if(K5=0) 硬件课程设计报告 - 26 - delayms(5);/延时 5ms 消抖 if(K5=0) ID=5; fengming(); while(K5=0) dodelayms(5);/延时 5ms 消抖 while(K5=0); if(K6=0) delayms(5);/延时 5ms 消抖 if(K6=0) ID=6; fengming(); while(K6=0) dodelayms(5);/延时 5ms 消抖 while(K6=0); void display() P2=0 xff; P0=0; if(ID) P0=aID; P2=bID-1; void fengming() uchar i; if(ID) for(i=100;i0;i-) beep=beep; delayms(1); void delayms(uchar z) /z 取值(1127) uchar x,y; for(x=2*z;x0;x-) for(y=248;y0;y-); (五)串口通信 1.单片机与 PC 机通信 (1)实现功能 借助电脑上 STC_ISP 烧写软件的串口调试助手向单片机发送一个数据,单片机收到该数据后向 PC 机发送字符串“I get the data”同时把收到的数据再发回给电脑显示。 硬件课程设计报告 - 27 - (2)编程思想 采用异步串行通信方式,设置串口为工作方式 1,波特率为 4800,用定时器 1 做波特率发生器, 并设定时器 1 为工作方式 2,根据波特率 4800 计算定时器的初值装入定时器。在主函数中打开串 口中断并启动定时器 1。设置标志位 flg 来判断是否收到了主机发送的数据,如果收到了主机发送 的数据则在串口中断函数中将 flg 置为 1,同时从 SBUF 中读取数据并将 RI 清零。在主函数中判断 如果 flg 为 1,则首先关闭串口中断,然后将字符串“I get the data”写入 SBUF 并发送,若发 送完毕把 TI 清零,接着把主机发来的数据写入 SBUF 进行发送,否则继续等待。待数据都发送完毕 后再打开串口中断并将 flg 清零,然后循环重复上述过程。 (3)程序框图 (4)程序代码 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table=I get the data ; /uchar code table=I, ,g,e,t, ; void init() /波特率设为 4800 TMOD=0 x20;/定时器 1 工作方式 2 PCON=0 x80;/波特率倍频 TH1=0 xf3;/T1 定时器高 8 位装初值 TL1=0 xf3;/T1 定时器低 8 位装初值 硬件课程设计报告 - 28 - TR1=1; /启动定时器 1 REN=1; /允许串口接收 SM0=0; /串口工作方式 1 SM1=1; EA=1; /开总中断 ES=1; /开串口中断 void main() init(); while(1) if(flag=1)/根据标志位判断是否接收到了数据 ES=0;/关闭串口中断防止进入死循环 for(i=0;i15;i+) SBUF=tablei;/将数据写入 SBUF while(!TI);/判断是否发送完毕 TI=0; /发送完毕后将 TI 置 0 SBUF=a; /将读回来的数据再发送回去 while(!TI); TI=0; ES=1;/再次打开串口中断 flag=0;/标志位置 0 void ser() interrupt 4 RI=0; /接受完毕后将 RI 置 0 a=SBUF;/将从 SBUF 读数据 flag=1;/标志位置 1 2.串口通信实现数码管显示 PC 机的键盘值 (1)实现功能 借助电脑上 STC_ISP 烧写软件的串口调试助手,按下电脑键盘上的 09、AF 以及 H、P、L、U 键向单片机发送数据,在单片机的数码管上用 8 位数码管显示该数据,当 8 位显示 区满时,将 8 位数码管显示清零从头接着显示。并且当按下单片机上的 K1K6 键时,能将该键 键值的 ASCII 码发送给电脑在 STC_ISP 烧写软件串口调试助手的显示区显示相应的键值,同时 在数码管上也显示键值。 (2)编程思想 采用异步串行通信方式,设置串口为工作方式 1,波特率为 4800,用定时器 1 做波特率发生器, 并设定时器 1 为工作方式 2,根据波特率 4800 计算定时器的初值装入定时器, 打开串口中断并启 动定时器 1。如果单片机接收到了主机发来的数据,则在串口中断函数里将 RI 清零,读取 SBUF 中 的数据,并将接收到的相应字符的 ASCII 码值进行转换保存到显示缓冲区数组 display_buff 里并在 主函数里调用显示函数送数码管显示。另外,在主函数里进行键盘扫描,判断如果有键按下则先将 串口中断关闭,再将该键值转换为相应 ASCII 码值发送给主机,发送完毕后将 TI 清零,再将串口 硬件课程设计报告 - 29 - 中断打开。循环重复上述过程。 (3)程序框图 (4)程序代码 #include #include #define uint unsigned int #define uchar unsigned char sbit K1=P32, K2=P33, K3=P34, K4=P35, K5=P16, K6=P17; sbit beep=P14; uchar recv_data=0,flg=0,ID=0,i=0,k; uchar display_buff8; uchar display_code=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0X6f,0 x77,0 x7c,0 x39,0 x5e,0 x79, 0 x71,0 x76,0 x38,0 x73,0 x3e;/0-F、 H、L、P、U uchar code wei= 0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe; void display(); void keyscan(); void init(); void fengming(); void delay50us
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西北海市人大常委会办公室面向社会招聘1人笔试考试备考试题及答案解析
- 2025中国锂电池回收利用技术突破及产业化前景评估报告
- 2025年不动产登记代理人《四科》考试题库附答案
- 2025中国金融科技领域创新应用与监管政策分析报告
- 2025中国金融科技行业发展前景与投资策略研究报告
- 2025中国金属3D打印技术突破分析及高端制造与产业基金布局报告
- (2025年)经济学试题及答案(附解析)
- 2025辽宁大连庄河市招录社区工作人员62人考试笔试备考试题及答案解析
- 2025中国裁断机行业渠道变革与营销创新研究报告
- 2025中国裁断机行业产品差异化与品牌定位策略报告
- 汉字笔画练习字帖
- 塔磨机安全操作规程
- 消防水泵房巡检签到表
- 全科医师转岗培训理论考试试题及答案
- 公会之间挂靠主播合作协议书
- 实验三基因组序列分析
- 2022年澄迈县辅警招聘笔试试题及答案解析
- 小学语文人教三年级上册 童话中有趣的角色
- 2022年临沧边境经济合作区国有资本投资运营有限公司招聘笔试试题及答案解析
- 思想道德与法治课件:第六章 第三节 维护宪法权威
- 高边坡锚杆施工记录表
评论
0/150
提交评论