




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学单片机原理与应用课程设计说明书目 录摘 要I1 基本原理11.1串行通信11.2 数码管动态显示11.3定时器11.4 LCD160222 设计过程32.1设计思路32.2电路图42.3 流程图53 程序代码63.1主程序63.2 串口通信程序83.3 数码管显示83.4 定时程序123.5 液晶模块124 运行结果144.1 仿真结果144.2 运行结果144.3 问题与改进:165 心得体会17参考文献18课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 题 目: PC和单片机的串行双工通信初始条件:具备单片机原理的理论知识和实践能力;熟悉51单片机的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1)利用串口设计4位静态数码管显示器,要求4位显示器上每隔1s交替显示“0123”和“4567”。2)完成PC和单片机的串行双工通信,单片机的P1口接一共阴极数码管,阴极接地。要求PC键盘每按“09”数字键能发送到单片机,并显示在单片机接的数码管上,单片机发送一串字符串能显示在PC的屏幕上,采用查询方式。波特率为1200。时间安排:一周,其中2天程序设计,2天程序调试,1天完成课程设计报告书及答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日18摘 要本设计运用51单片机设计了一个能和PC进行全双工通信的程序,能由单片机向PC发送字符串,当按PC上的数字键时,能在单片机上的数码管上显示相应数字,并且单片机的其他数码管能每隔1s交替显示0123和4567,还扩展了用lcd1602显示来自PC端的任意字符,并能统计和显示发送和接受的字符数。程序采用C语言分模块编写,并用proteus仿真通过,还有实物演示结果。关键词:单片机;串行通信;数码管武汉理工大学单片机原理与应用课程设计说明书1 基本原理1.1串行通信 单片机的串行通信使用的是异步串行通信。串行接口电路为用户提供了两个串行口缓冲寄存器(SBUF),一个称为发送缓存器,它的用途是接收片内总线送来的数据,即发送缓冲器只能写不能读。发送缓冲器中的数据通过TXD引脚向外传送。另一个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。接收缓冲器通过RXD引脚接收数据。因为这两个缓冲器一个只能写,一个只能读,所以共用一个地址99H。串行口控制寄存器SCON是MCS-51单片机的一个可位寻址的专用寄存器,用于串行数据通信的控制。单元地址为98H,位地址为98H9FH。寄存器的内容及位地址表示如下: SM0 、SM1串行口工作方式选择位M2允许方式2、3的多机通信控制位REN允许接收位TB8发送数据位8,RB8接收数据位8,TI发送中断标志位RI接收中断标志位.。位地址9FH9EH9DH9CH9BH9AH99H98H位符号SM0SM1SM2RENTB8RB8TIRI表1 SCON控制字1.2 数码管动态显示动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效,这样可以节省引脚。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。1.3定时器 MCS-51单片机内部共有两个16位可编程的定时器/计数器,即 定时器T0和定时器T1它们既有定时功能又有计数功能。 (1)定时器控制寄存器(TCON)TF0/TF1: 查询方式:禁止中断,软件查询TF0的值,软件清“0” 中断方式:硬件查询TF0的值,硬件自动清“0”位地址8FH8EH8DH8CH8BH8AH89H88H位符号TF1TR1TF0TR0IE1IT1IE0IT0表2 TCON控制字(2)工作方式寄存器(TMOD)功能:确定定时器的工作方式及功能选择。D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0表3 TMOD控制字GATE:门控位 功能选择位 M0M1工作方式选择位1.4 LCD1602 字符型液晶模块是一种用5x7 点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1 行16 个字、2 行16个字、2 行20个字等等,这里采用的是2 行16 个字的1602 液晶模块 1602液晶模块内部的字符发生存储器 (CGROM)已经存储了160个不同的点阵字符图形,内部的控制器共有11 条控制指令它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。 程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址例如0C0H,最后输入要显示的字符例如A 的代码41H。 2 设计过程2.1设计思路目前手头上有一个现成的51单片机开发板,上面有6个数码管,独立键盘等资源,根据题目要求可以分模块设计。 (1) 数码管显示:题目要求数码管数码管显示器每隔1s交替显示“0123”和“4567”,同时能按PC上的数字键能显示对于数字,6个数码显示够用。由于字选端口和位选端口都通过74HC573与P0口相连,采用分时操作的方法,先打开与字选端口锁存器,向P0口写入位选码,接着锁存,然后打开位选端口锁存器,向P0口写入字形码,再锁存,延时一定时间后在操作其他几个数码管。为保持数码管不熄灭,所以数码管显示程序要一直循环。 (2) 串行通信:要实现PC和单片机的串行双工通信,要设置接收允许。采用串行方式1,T1作为波特率发生器工作于方式2,取SMOD=0,T1的时间常数为E6。 发送部分程序采用查询式方法,先发送第一个字符,等待发送完毕后在发下一个,直字符串至全部发完。实际发送中要用按键控制,当按键按下一次时,发送一次。接收程序采用中断方式,当单片机接收到一个来自PC的字符时,产生串行口中断,将接受到的ASCII码转换成单片机能够显示的字形码。 (3) 定时器部分:要求数码管显示器每隔1s交替显示“0123”和“4567”,很容易想到定时器控制。选用定时器T0,工作方式1,16位计数,最大计数值65536,晶振为11.0592M,最大定时周期为71ms,不能满足要求,可以先定时50ms,此时计数初值为4C00,然后引入一个变量计数,每当定时器T0中断时变量加1,当计到20时刚好一秒,改变数码显示结果,再将计数变量清零,如此循环。 (4)液晶显示部分:用第一行接受来自PC端得字符,由于lcd1602一行只能显示16个字符,故要引入一个变量计数,每显示一个字符,计一次,计16次时表示屏幕显示满了,清屏。第二行显示发送和接受的字符串,故要引入两个变量统计收发的字符数。2.2电路图图1 总电路图2.3 流程图 图2 程序流程图3程序代码 本次设计的程序在keil上编写与调试,按照前面的设计思路采用分模块设计的方法,为每个模块建立一个文件,分别编写调试通过,然后在主函数中调用。3.1主程序 #include #define uchar unsigned char #define uint unsigned int extern void int_rec(void) ;/中断接收 extern void com_init(void); /串口初始化 extern void sendstr(uchar *p);/字符串发送函数 extern void display(uchar,uchar,uchar,uchar,uchar,uchar);/数码管显示函数 extern void init(); /lcd初始化 extern void write_com(uchar com); /lcd写命令 extern void write_data(uchar date); /lcd写数据 extern void timer0_init( ); /定时器初始化 extern uchar dingshi(uchar n); /定时1s函数 uint cnt_r=0,cnt_s=0;/发送接收计数 uchar cnt_xs=0; /显示计数 sbit key1=P37; /定义按键 uchar a6=0,1,2,3,19,19;/数码管显示值 uchar c=0xa0,0xa0,0xa0,0xa0,0; void num2char(uint temp) /无符号双字节数转为字符 c4=temp%10/1;/最低位 c3=temp%100/10; c2=temp%1000/100; c1=temp%10000/1000; c0=temp%100000/10000;/最高位 void lcd_disp( ) /lcd显示函数 uchar i; write_com(0x80+cnt_xs-1);/显示第一行 if(cnt_xs16) /第一行显示满后清屏 write_com(0x01);cnt_xs=1; write_data(a4); num2char(cnt_s); /字符转换 write_com(0x80+0x40);/显示第二行 write_data(S); write_data(E); write_data(:); /显示字符串“SE:” for(i=0;i5;i+)write_data(ci+0x30);/显示发送计数值 num2char(cnt_r);/ write_data(R); write_data(E); write_data(:); /显示字符串“RE:” for(i=0;i5;i+) write_data(ci+0x30); /显示接收计数值 main() /主函数 uchar cnt=0; /通过计数,控制按一次键发送的次数 com_init(); /串口初始化 timer0_init(); /定时器初始化 init();/lcd初始化 while(1) if (key1=0)/按键按下时单片机发送字符串 if(cnt1)sendstr(HanBing);cnt+; else cnt=0; /按键弹起cnt清零 display(a0,a1,a2,a3,19,a5); /6位数码管显示 lcd_disp( ); /lcd显示 if(dingshi(20) /计到50次时即1s ,变换显示数字 a0=4-a0; a1=6-a1; a2=8-a2; a3=10-a3; 3.2 串口通信程序#include #define uchar unsigned char#define uint unsigned intextern uchar a6; /数码管6位extern void write_com(uchar com);/lcd写数据void do_uart(unsigned char charRcv); /串口接收执字符时的操作void sendchar(uchar uart_dat); /字符串发送 extern uint cnt_r,cnt_s;/接收,发送计数extern uchar cnt_xs; /lcd显示计数/*串口发送字符串 */void sendstr(uchar *p) while(*p!=0) SBUF=*p; /待发送的数据写入缓冲区while(!TI); /等待发送完成TI=0; /清零发送标志位 p+; /指针加1 cnt_s+; /发送计数 void int_rec(void) interrupt 4 using 2 /*串口接收中断函数*/ unsigned char Rcv = 0; if(RI) /查询接收标志位(有数据发送过来时置为1) RI = 0; /接收标志位清零 Rcv = SBUF; /存储缓冲区的数据 do_uart(Rcv);/对接受到得字符操作 void com_init(void) /*串口初始化*/SCON = 0x50; /串口工作方式为1,串行允许接受 TMOD = 0x21; /定时器1工作在方式2 定时器0工作在方式1 TH1 = 0xe8;/fosc=11.0592MHz初值fd时 波特率 9600bps TL1 = 0xe8;/ 初值e8时,波特率1200bps ES = 1; /开串口中断 TR1 = 1; /允许定时器1工作 EA = 1; /开总中断 /*串口接收到字符的操作函数*/void do_uart(unsigned char Rcv) cnt_r+;/接收计数 if(Rcv=0&Rcv=a&Rcv=A&Rcv=F) a5=Rcv-55;/判断是否按AF else a5=20; /其他字符 if(Rcv=0x1B) write_com(0x01); /按Esc清显示,光标复位到地址00h处 a4=Rcv;/暂存接收到得数据 cnt_xs+;/显示计数加13.3 数码管显示#include #include #define uchar unsigned char#define uint unsigned intsbit dula=P26;/段选信号sbit wela=P27;/位选信号uchar code table= /共阴数码管表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x38,0,0x40;/h p l 灭 - void delay1(uint z) /延时子程序uint t1,y;for(t1=z;t10;t1-)for(y=110/2;y0;y-); void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g) /用6个数码管显示 dula=1;P0=0;dula=0;/段初始化 wela=1;P0=0xc0;wela=0;/位初始化 dula=1;P0=tableaa;dula=0;/选中第一位P0=0xff;wela=1;P0=0xfe;wela=0;delay1(5); dula=1;P0=tablebb;point=0;dula=0;/选中第二位 P0=0xff;wela=1;P0=0xfd;wela=0;delay1(5); dula=1;P0=tablecc;dula=0;/选中第三位P0=0xff;wela=1;P0=0xfb;wela=0;delay1(5); dula=1;P0=tableba;dula=0;/选中第四位P0=0xff;wela=1;P0=0xf7;wela=0;delay1(5);dula=1;P0=tablesh;dula=0;/选择第五位P0=0xff;wela=1;P0=0xef;wela=0;delay1(5);dula=1;P0=tableg;dula=0;/选择第六位P0=0xff;wela=1;P0=0xdf;wela=0;delay1(5);3.4 定时程序#include#define uchar unsigned char uchar t50ms=0;/50ms计数 void timer0_init(void)/定时器初始化 TH0=0x4c;TL0=0; /定时器T0赋初值,晶振11.092M,定时50msTR0=1; ET0=1;/启动定时器T0 uchar dingshi(uchar n) /定时50ms的n倍 if(t50ms=n) t50ms=0; /50ms计数清零return 1;return 0; void timer0()interrupt 2 using 1/定时器T0产生50ms中断 t50ms+; / TH0=0x4c; /计数值重载 TL0=0; 3.5液晶模块#include#define uchar unsigned char#define uint unsigned intsbit lcden=P34;/lcd使能端sbit lcdrs=P35; /寄存器选择端void delay2(uint z)/延时程序 uint x,y;for(x=z;x0;x-)for(y=110/4;y0;y-);void write_com(uchar com) /写lcd控制命令 lcdrs=0;P0=com;delay2(5);lcden=1;delay2(5);lcden=0;void write_data(uchar date) /写入ASCII码即可,lcdrs=1;P0=date;delay2(5);lcden=1;delay2(5);lcden=0;void init()lcden=0;write_com(0x38); /置功能,数据长度4位,双行显示,5*7显示write_com(0x0c);/显示开关控制,开显示,0x0f光标,闪烁,若改为0x0c则无光标 write_com(0x06);/光标右移,屏幕上所有文字不动write_com(0x01); /清显示,光标复位到地址00h处 4 运行结果4.1 仿真结果本设计采用的是Proteus仿真,电路图见前文,主意设置晶振为11.590M,串行全双工通信仿真采用的设备是虚拟终端,仿真前注意设置波特率为1200,数据位8位。按下单片机上的按钮的仿真结果:图3 串行通信仿真以下为液晶显示结果,第一行显示接收的字符,第二行显示已发送和接收的字符数图4 LCD显示仿真4.2 运行结果 PC端采用的串口调试助手来控制串行通信与观察运行结果,先设置正确的串口号,波特率为1200,采用字符格式显示和发送。当按下单片机上的独立按键时,在PC端观察收到字符串“HanBing”,且按一次发送一次。液晶屏显示的结果与仿真结果完全一样,由于液晶屏拍照效果不好,故未给出液晶屏显示截图 图5 PC上运行结果图6 数码显示结果1图7 数码管显示结果2将鼠标焦点移到串口调试助手的键盘发送区,当按下PC键盘的09,AF时,第六个数码管显示相应结果,按其他键时显示“”,并且前四个数码管每隔1s交替显示“0123”和“4567”4.3 问题与改进: 程序开始设计时,串行发送控制部分,采用当按键按下就发送,如果一直按着不动,由于程序是循环执行的,所以会一直发送下去。为达到按一次只发送一次的目的,可以引入变量cnt,先赋初值0,按键按下时,首先检测cnt是否大于0,然后cnt加1,发送字符串。第二次检测按键状态时,由于cnt0,不执行此句,即不发送字符串。当按键弹起时再将cnt清零。 数码管显示部分开始只设计了显示09,如果按其他键显示乱码,后来加入了多条选择语句,还能够显示AF六个字符,对于其他字符一律显示“-”。 液晶显示部分开始时始终只能显示当前接收的一个字符,后来通过改进能够用一行显示,并且显示满后能够自动清屏,还能在第二行显示收发的字符个数。 5 心得体会 时光飞逝,一转眼,一个学期又进尾声了,本学期的单片机综合课程设计也在一周内完成了。 通过该课程设计,全面系统的理解了单片机原理的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的单片机原理基础
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全国“安全生产月”《安全知识》答题活动考试题库及答案
- 2025年土木工程监理工程师《建设工程目标控制》真题及答案
- 2024年全国大学生商业精英学习知识竞赛试题(附含答案)
- 摆摊财管基础知识培训课件
- 山西省吕梁市交城县2024-2025学年八年级下学期期末语文试题(解析版)
- 摄影摄制基础知识培训课件
- 摄影基础知识培训班课件
- 深信服技术笔试题及答案
- 2025知识产权许可合同范本下载
- 2025年叉车维护服务合同模板
- Q-SY 08805-2021 安全风险分级防控和隐患排查治理双重预防机制建设导则
- 三相异步电动机正反转说课课件
- 桥架支吊架安装标准图-桥架支吊架图集
- GB/T 845-2017十字槽盘头自攻螺钉
- GB/T 328.20-2007建筑防水卷材试验方法第20部分:沥青防水卷材接缝剥离性能
- FZ/T 01093-2008机织物结构分析方法织物中拆下纱线线密度的测定
- 军工产品技术状态管理讲义课件
- 压力管道安装许可规则-TSG D3001-2021
- 互联网医院建设方案
- SQL注入技术原理及实战
- 东方通——数据中心项目数据交换平台技术方案
评论
0/150
提交评论