任务5-1 简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)

2024-07-11
| 28页
| 31人阅读
| 2人下载
普通

内容正文:

任务5-1 简易秒表设计 1 一、任务导入 任务要求 用单片机控制两个LED数码管,采用静态连接方式,要求两个数码管显示00~99计数,时间间隔为1s。 硬件电路 两个共阳极数码管的段码分别由 P1口和 P2口控制,公共端接高电平 。 系统采用12MHz晶振 二、51单片机内部定时器 T0、T1:两个16位的计数器 TMOD: 方式寄存器 1.选择4种工作方式 2.选择定时/计数 3.决定启动方式 TCON: 控制寄存器 1.启动控制 2.计满溢出控制 6 TMOD(89H)寄存器格式 GATE(门控位) 0 1 0 TR1=1启动定时器,不受INT1控制 TR1=1,INT1=1共同启动定时器 • C/T(功能选择) 1 定时器 计数器 • M1M0(工作方式) T1 T0 7 6 5 4 3 2 1 0 GATE C/T M1 M0 GATE C/T M1 M0 功能 工作方式 M1 M0 13位计数器 方式0 0 0 16位计数器 方式1 0 1 8位计数器,初值自动重装 方式2 1 0 分成两个8位计数器,仅用于T0。T1停止使用 方式3 1 1 7 TCON(88H)寄存器格式 和定时计数器无关 分别控制T0、T1的启动与溢出 TR0=0 // 位操作指令,给TR0位清0 中断系统中才使用 7 6 5 4 3 2 1 0 TF1 TR1 TF0 TR0 T0启动位 TR0=1,启动T0工作 TR0=0,停止T0工作 T1启动位 TR1=1,启动T1工作 TR1=0,停止T1工作 TCON(88H)寄存器格式 while (!TF0); TF0=0; //查询TF0,这是查询方式的应用 //如果计满溢出,将TF0清0 7 6 5 4 3 2 1 0 TF1 TR1 TF0 TR0 1 计数溢出,硬件自动置1 0 中断方式:硬件自动清0 查询方式:软件清0 三、程序设计 定时时间与计数初值 定时时间与计数溢出 定时1秒 溢出查询、中断 软件设计思路 定时器编程步骤:定时器初始化(设置工作方式)、 初值计算和设置、 启动定时器计数、 计数溢出处理 用单片机定时器T1的工作方式1编制1s延时程序,假定系统采用12MHz晶振,T1的工作方式1定时时间为50ms,再循环20次即可定时到1s。 void timer_1() interrupt 3 //T1的中断类型号为3 { TH1=(65536-50000)/256; //重新设置T1计数初值高8位 TL1=(65536-50000)%256; //重新设置T1计数初值低8位 count++; //50ms计数器加1 if(count==20) //1s时间到 { count=0; //50ms计数器清0 miao++; //秒计数器加1 if(miao==100)miao=0; //miao计数到100,则从0开始计数 } } 溢出中断处理 中断源 n 外部中断0 0 定时器0 1 外部中断1 2 定时器1 3 串行口 4 中断服务程序以函数形式存在; 中断函数定义语法如下: void 函数名() interrupt n Click to edit Master text styles Second level Third level Fourth level Fifth level #include "reg51.h" //包含头文件reg51.h,定义了51单片机的专用寄存器 unsigned char count=0; //对50ms定时时间进行计数 unsigned char miao=0; //秒计数器 void disp(unsigned char i) { unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //定义0~9显示码,共阳极数码管 P1=led[i/10]; //显示i高位 P2=led[i%10]; //显示i低位 } void main() //主函数 { TMOD=0x10; //设置T1为工作方式1 TH1=(65536-50000)/256; //设置T1计数初值高8位,定时时间50ms TL1=(65536-50000)%256; //设置T1计数初值低8位 ET1=1; //开放T1中断允许 EA=1; //开放总中断允许 TR1=1; //启动T1开始计数 while(1){ disp(miao); //显示秒计数器值 } } 中断编程步骤:开放中断源允许、 开放总中断允许、 中断函数编程 四、举一反三 当50ms定时时间到,计数器溢出,此时TCON 中的溢出标志TF0或TF1转变为高电平1。 程序中可以通过查询溢出标志的状态来判断定时 时间到。 采用查询方式编程,必须对溢出标志位用程序语 句清0, 即:TF0=0; TF1=0; 采用查询方式编写秒表程序 举一反三1 16 void delay1s() { unsigned char i; for(i=0;i<20;i++) //设置20次循环次数 { TH1=(65536-50000)/256; //重新设置T1计数初值高8位,定时时间50ms TL1=(65536-50000)%256; //重新设置T1计数初值低8位 TR1=1; //启动T1 while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1 TF1=0; //50ms定时时间到,将T1溢出标志位TF1清零 } } void main() //主函数 { unsigned char miao=0; //秒计数器定义 TMOD=0x10; //设置T1为工作方式1 TH1=(65536-50000)/256; //设置T1计数初值高8位,定时时间50ms TL1=(65536-50000)%256; //设置T1计数初值低8位 TR1=1; //启动定时器开始计数 while(1){ disp(miao); //显示秒计数器值 delay1s(); //调用1s函数 miao++; //秒计数器加1 if(miao==100)miao=0;  //秒计数计满,则从0开始计数 } } 画出电路图 编写控制程序 修改硬件电路,采用两个共阴极数码管动态连接方式,P1口为八段控制口,P2.0和P2.1分别控制高位和低位的位码。要求: 举一反三2 在显示函数中将数码管的字段码修改为共阴极字段码, 并进行动态扫描P2.0和P2.1端口编程选择两个数码管显示 19 void disp(unsigned char i) { unsigned char j; unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //定义0~9显示码,共阴极数码管 P2=0xff; //关闭数码管显示 P1=led[i/10]; //i的高位显示码送到段控制口 P2=0xfe; //高位数码管位选有效 for(j=0;j<100;j++); //延时 P2=0xff; //关闭数码管显示 P1=led[i%10]; //i的低位显示码送到段控制口 P2=0xfd; //低位数码管位选有效 for(j=0;j<100;j++); //延时 } 画出电路图 编写控制程序 修改硬件电路,采用6个数码管动态连接方式,P1口为八段控制口,P2.0~P2.5分别控制6个数码管的位码。要求: 举一反三3 将miao秒计数器的计数范围设置到0~59; 增加min分钟计数器,计数范围0~59,当miao=59时min加1; 增加hour小时计数器,计数范围0~23 ,当miao=59以及min=59时hour加1; 并进行动态扫描P2.0~P2.5端口编程选择6个数码管显示 21 unsigned char miao=0,min=0,hour=0; //秒、分钟、小时计数器 void timer_1() interrupt 3 //T1定时起中断类型号为3 { TH1=(65536-50000)/256; //重新设置T1计数初值高8位 TL1=(65536-50000)%256; //重新设置T1计数初值低8位 count++; //50ms计数器加1 if(count==20) //1s时间到 { count=0; //50ms计数器清0 miao++; //秒计数器加1 if(miao==60)  //miao计数到60,则从0开始计数 { miao=0; min++; //分计数器加1 if(min==60) //min计数到60,则从0开始计数 { min=0; hour++;      //小时计数器加1 if(hour==24)hour=0; //小时计数到24,则从0开始计数 } } } } unsigned smgid[]={0,0,0,0,0,0}; //数码管显示内容函数 void smgdisplay() { smgid[0]=sec%10; smgid[1]=sec/10; smgid[2]= min%10; smgid[3]= min/10; smgid[4]= hour%10; smgid[5]= hour/10; } unsigned char i,w; while(1) { smgdisplay(); w=0xfe; //位选码初值为0xfe for(i=0;i<6;i++) { P1=0xff; //关显示,共阳极数码管0xff熄灭 P2=w; //位选码送位选端P2口 w=_crol_(w,1); //位选码左移一位,选中下一位LED P1=led[smgid [i]]; //显示字型码并送P1口 delay(100); //延时 } } 显示00~99计数,时间间隔为1s 当K1按下时,暂停计数,再次按下时,继续计数。 任何时候按下K2,则从0开始计数。 修改两位数码管秒显示硬件电路,在P3.2和P3.3引脚增加两个弹性按键K1和K2,实现跑表。要求: 举一反三4 采用外部中断处理 25 中断源 (5个) P3.2 外部中断请求0(低电平或下降沿有效) T0 定时器T0 内部定时器T0计满溢出后 P3.3 外部中断请求1(低电平或下降沿有效) T1 定时器T1 内部定时器T0计满溢出后 RX或TX 串行口 接收或发送完一帧串行数据后 51单片机的中断源 Click to edit Master text styles Second level Third level Fourth level Fifth level 中断的有关寄存器 ① 在主函数main()中的EA=1;语句前增加外部中断允许和打开外部中断语句: EX0=1; //开放外部中断0允许 IT0=1; //下降沿触发中断 EX1=1; //开放外部中断1允许 IT1=1; //下降沿触发中断 ② 编写外部中断0的中断函数如下: bit b=0; //外部位变量b,暂停/继续标志位,b=0暂停,b=1继续 void int_0() interrupt 0 //外部中断0的中断函数,中断类型号为0 { if(b==0){ TR1=0; b=1;} //暂停计数 else {b=0;TR1=1;} //继续计数 } ③ 编写外部中断1的中断函数如下: void int_1() interrupt 2 //外部中断1的中断函数,中断类型号为2 { miao=0; count=0; //清零并开始计数 TH1=(65536-50000)/256; //设置T1计数初值高8位,定时时间50ms TL1=(65536-50000)%256; //设置T1计数初值低8位 TR1=1; } 中断源 n 外部中断0 0 定时器0 1 外部中断1 2 定时器1 3 串行口 4 $$

资源预览图

任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
1
任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
2
任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
3
任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
4
任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
5
任务5-1  简易秒表设计 (课件)-《单片机技术与应用》同步教学(电子工业版)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。