完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本实验使用使用c语言在Keil uVision 4软件编程,使用Proteus软件模拟单片机运行,掌握单片机使用定时器、计数器和外部中断的方法。51单片机设置晶振频率为11.0592MHz。将keil生成的.hex程序导入到Proteus的单片机中便可以仿真运行。
实验目的 掌握8051单片机内部定时器/计数器、外部中断的使用方法。 实验内容 1、定时器 任务 按电路原理图接线,P1.1接一个LED灯(输出0时灯亮,输出1时灯灭),用51单片机内部定时器T0定时,使LED灯亮1秒钟,灭1秒钟,重复循环; 在Proteus软件中进行连接。 编写程序如下 #include char i=100; ***it a=P1^1; //以a替代P1.1口 void main() { TMOD=0x01; //设置工作方式,开启定时器 TH0=0xdc; TL0=0x00; //TH0和TL0用于确定时长,此处设置为10ms a=0; EA=1; //允许中断 ET0=1;//T0中断 TR0=1;//启动T0 while(1); } void timer0() interrupt 1 //中断函数,定时器运行到TH0时中断,开始运行此部分程序 { TH0=0xdc;//初始化定时器 TL0=0x00; i--;//10毫秒重复100次为1秒。 if(i<=0) //重复100次后,改变灯状态,重置i,继续计时 { a=~a; i=100; } } 该程序最终不会准确的为1秒。因为程序运行的时间会使计时有误差。 2、计数器 任务 按电路原理图接线,设置8051单片机内部计数器1工作于计数模式,按方式2工作,对T1引脚手动输入的单脉冲进行计数,并将计数值从P1口输出在LED灯上显示出来。要求计数器初值为0,即TL1=0x00。 在Proteus软件中绘制如图所示 问题 方式二计数中断必须在计满后才能中断,因此TL需为0xff。实验要求无法满足。 因此我使用了两种不同的方法完成该实验,都使用了计数器,但不都使用中断方法。两种方法分别满足使用中断和TL1=0x00的要求。 方法1 方法使用了中断的方法,但是以方式二计数中断必须在计满后才能中断,因此TL需为0xff。 程序如下 #include unsigned char A; void main() { TMOD=0x60; //开启计数器,设置T1方式2 TH1=0xff; TL1=0xff;//按下即可中断 EA=1;//允许中断 ET1=1;//T1中断 TR1=1;//T1启动 P1=0x00; A=0x00; while(1); } void T1_int(void) interrupt 3 { A=A++; //A用于计数 P1=~A; } #include void main() { TMOD=0x60; //T1方式2 TH1=0x00; TL1=0x00; TR1=1; P1=0x00; while(1) { P1=~TL1;//输出与计数器计数一致 }; } 外部中断 任务 按电路原理图接线,通过手动向8051单片机的管脚输入单脉冲, 申请中断。每中断一次,P1口依次输出0x55、0xaa、0x55、0xaa……,P1口接8个LED灯,显示结果; 绘制模拟电路图如下 程序如下 #include void main() { EA=1;//开启中断 EX0=1;//开启外部中断 IT0=1;//启动外部中断 P1=0x55;//设置输出 while(1); } void int0() interrupt 0 using 0 { EX0=0; P1=~P1; EX0=1; } 这就是本实验的全部内容了 |
|
|
|
只有小组成员才能发言,加入小组>>
2519 浏览 0 评论
1100浏览 2评论
711浏览 1评论
463浏览 0评论
204浏览 0评论
348浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 03:56 , Processed in 1.254187 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号