ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:20.71KB ,
资源ID:9940566      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9940566.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验8051+Proteus定时计数器仿真.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验8051+Proteus定时计数器仿真.docx

1、实验8051+Proteus定时 计数器仿真实验:8051+Proteus定时/ 计数器仿真 一、 定时器控制单只LED/* 名称:定时器控制单只LED 说明:LED在定时器的中断例程控制下不断闪烁。*/#include#define uchar unsigned char#define uint unsigned intsbit LED=P00; uchar T_Count=0;/主程序void main() TMOD=0x00; /定时器0工作方式0 TH0=(8192-5000)/32; /5ms定时 TL0=(8192-5000)%32; IE=0x82; /允许T0中断 TR0=1;

2、 while(1);/T0中断函数void LED_Flash() interrupt 1 TH0=(8192-5000)/32; /恢复初值 TL0=(8192-5000)%32; if(+T_Count=100) /0.5s开关一次LED LED=LED; T_Count=0; 二、 TIMER0控制流水灯 /* 名称:TIMER0控制流水灯 说明:定时器控制P0、P2口的LED滚动显示,本例未使用中断函数。*/#include#include#define uchar unsigned char#define uint unsigned int/主程序void main() uchar

3、T_Count=0; P0=0xfe; P2=0xfe; TMOD=0x01; /定时器0工作方式1 TH0=(65536-40000)/256; /40ms定时 TL0=(65536-40000)%256; TR0=1; /启动定时器 while(1) if(TF0=1) TF0=0; TH0=(65536-40000)/256; /恢复初值 TL0=(65536-40000)%256; if(+T_Count=5) P0=_crol_(P0,1); P2=_crol_(P2,1); T_Count=0; 三、 定时器控制4个LED滚动闪烁/* 名称:定时器控制4个LED滚动闪烁 说明:4只

4、LED在定时器控制下滚动闪烁。*/#include#define uchar unsigned char#define uint unsigned intsbit B1=P00;sbit G1=P01;sbit R1=P02;sbit Y1=P03;uint i,j,k;/主程序void main() i=j=k=0; P0=0xff; TMOD=0x02; /定时器0工作方式2 TH0=256-200; /200us定时 TL0=256-200; IE=0x82; TR0=1; /启动定时器 while(1);/T0中断函数void LED_Flash_and_Scroll() interr

5、upt 1 if(+k35) return; /定时中断若干次后执行闪烁 k=0; switch(i) case 0: B1=B1;break; case 1: G1=G1;break; case 2: R1=R1;break; case 3: Y1=Y1;break; default:i=0; if(+j300) return; /每次闪烁持续一段时间 j=0; P0=0xff; /关闭显示 i+; /切换到下一个LED四、 T0控制LED实现二进制计数/* 名称:T0控制LED实现二进制计数 说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了

6、计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增,其值通过LED以二进制形式显示*/#include/主程序void main() TMOD=0x05; /定时器0为计数器,工作方式1,最大计数值65535 TH0=0; /初值为0 TL0=0; TR0=1; /启动定时器 while(1) P1=TH0; P2=TL0; 五、 TIMER0与TIMER1控制条形LED/* 名称:TIMER0与TIMER1控制条形LED 说明:定时器T0定时控制上一组条形LED,滚动速度较快 定时器T1定时控制下一组条形LED,滚动速度较慢*/#include#include#define uc

7、har unsigned char#define uint unsigned intuchar tc0=0,tc1=0;/主程序void main() P0=0xfe; P2=0xfe; TMOD=0x11; /定时器0、定时器1均工作于方式1 TH0=(65536-15000)/256; /定时器0:15ms TL0=(65536-15000)%256; TH1=(65536-50000)/256; /定时器1:50ms TL1=(65536-50000)%256; IE=0x8a; TR0=1; /启动定时器 TR1=1; while(1);/T0中断函数void Time0() inte

8、rrupt 1 TH0=(65536-15000)/256; /恢复定时器0初值 TL0=(65536-15000)%256; if(+tc0=10) /150ms转换状态 tc0=0; P0=_crol_(P0,1); /T1中断函数void Time1() interrupt 3 TH0=(65536-50000)/256; /恢复定时器1初值 TL0=(65536-50000)%256; if(+tc1=10) /500ms转换状态 tc1=0; P2=_crol_(P2,1); 六、 10s的秒表/* 名称:10s的秒表 说明:首次按键计时开始,再次按键暂停,第三次按键清零。*/#in

9、clude#define uchar unsigned char#define uint unsigned intsbit K1=P37;uchar i,Second_Counts,Key_Flag_Idx;bit Key_State;uchar DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/延时void DelayMS(uint ms) uchar t; while(ms-) for(t=0;t120;t+);/处理按键事件void Key_Event_Handle() if(Key_State=0) Key_Flag

10、_Idx=(Key_Flag_Idx+1)%3; switch(Key_Flag_Idx) case 1: EA=1;ET0=1;TR0=1;break; case 2: EA=0;ET0=0;TR0=0;break; case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0; /主程序void main() P0=0x3f; /显示00 P2=0x3f; i=0; Second_Counts=0; Key_Flag_Idx=0; /按键次数(取值0,1,2,3) Key_State=1; /按键状态 TMOD=0x01; /定时器0方式1 TH0=(65536-

11、50000)/256; /定时器0:15ms TL0=(65536-50000)%256; while(1) if(Key_State!=K1) DelayMS(10); Key_State=K1; Key_Event_Handle(); /T0中断函数void DSY_Refresh() interrupt 1 TH0=(65536-50000)/256; /恢复定时器0初值 TL0=(65536-50000)%256; if(+i=2) /50ms*2=0.1s转换状态 i=0; Second_Counts+; P0=DSY_CODESecond_Counts/10; P2=DSY_COD

12、ESecond_Counts%10; if(Second_Counts=100) Second_Counts=0; /满100(10s)后显示00 七、 用计数器中断实现100以内的按键计数/* 名称:用计数器中断实现100以内的按键计数 说明:本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此 P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 计数器的清零用外部中断0控制。*/#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0x3f,0x06,0x5b,

13、0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;uchar Count=0;/主程序void main() P0=0x00; P2=0x00; TMOD=0x06; /计数器T0方式2 TH0=TL0=256-1; /计数值为1 ET0=1; /允许T0中断 EX0=1; /允许INT0中断 EA=1; /允许CPU中断 IP=0x02; /设置优先级,T0高于INT0 IT0=1; /INT0中断触发方式为下降沿触发 TR0=1; /启动T0 while(1) P0=DSY_CODECount/10; P2=DSY_CODECount%10; /T0计数器中断

14、函数void Key_Counter() interrupt 1 Count=(Count+1)%100; /因为只有两位数码管,计数控制在100以内(0099)/INT0中断函数void Clear_Counter() interrupt 0 Count=0;八、 100 000s以内的计时程序/* 名称:100 000s以内的计时程序 说明:在6只数码管上完成099 999.9s。*/#include#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0x3f,0x06,0x5

15、b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/6只数码管上显示的数字uchar Digits_of_6DSY=0,0,0,0,0,0;uchar Count;sbit Dot=P07;/延时void DelayMS(uint ms) uchar t; while(ms-) for(t=0;t120;t+);/主程序void main() uchar i,j; P0=0x00; P3=0xff; Count=0; TMOD=0x01; /计数器T0方式1 TH0=(65536-50000)/256; /50ms定时 TL0=(65536-50000)%256; IE

16、=0x82; TR0=1; /启动T0 while(1) j=0x7f; /显示Digits_of_6DSY5Digits_of_6DSY0的内容 /前面高位,后面低位,循环中i!=-1亦可写成i!=0xff for(i=5;i!=-1;i-) j=_crol_(j,1); P3=j; P0=DSY_CODEDigits_of_6DSYi; if(i=1) Dot=1; /加小数点 DelayMS(2); /T0中断函数void Timer0() interrupt 1 uchar i; TH0=(65536-50000)/256; /恢复初值 TL0=(65536-50000)%256; i

17、f(+Count!=2) return; Count=0; Digits_of_6DSY0+; /0.1s位累加 for(i=0;i=5;i+) /进位处理 if(Digits_of_6DSYi=10) Digits_of_6DSYi=0; if(i!=5) Digits_of_6DSYi+1+; /如果04位则分别向高一位进位 else break; /若某低位没有进位,怎循环提前结束 九、 定时器控制数码管动态显示/* 名称:定时器控制数码管动态显示 说明:8个数码管上分两组动态显示年月日与时分秒,本例的 位显示延时用定时器实现。*/#include#include#define ucha

18、r unsigned char#define uint unsigned int/段码,最后一位是“-”的段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf;/待显示的数据:09-12-25与23-59-58(分两组显示)uchar code Table_of_Digits8=0,9,10,1,2,10,2,5,2,3,10,5,9,10,5,8;uchar i,j=0;uint t=0;/主程序void main() P3=0x80; /位码初值 TMOD=0x00; /计数器T0方式0 T

19、H0=(8192-4000)/32; /4ms定时 TL0=(8192-4000)%32; IE=0x82; TR0=1; /启动T0 while(1);/T0中断函数控制数码管刷新显示void DSY_Show() interrupt 1 TH0=(8192-4000)/32; /恢复初值 TL0=(8192-4000)%32; P0=0xff; /输出位码和段码 P0=DSY_CODETable_of_Digitsij; P3=_crol_(P3,1); j=(j+1)%8; /数组第i行的下一字节索引 if(+t!=350) return; /保持刷新一段时间 t=0; i=(i+1)%

20、2; /数组行i=0时显示年月日,i=1时显示时分秒十、 用定时器设计的门铃/* 名称:用定时器设计的门铃 说明:按下按键时蜂鸣器发出叮咚的门铃声。*/#include#define uchar unsigned char#define uint unsigned intsbit Key=P17;sbit DoorBell=P30;uint p=0;/主程序void main() DoorBell=0; TMOD=0x00; /T0方式0 TH0=(8192-700)/32; /700us定时 TL0=(8192-700)%32; IE=0x82; while(1) if(Key=0) /按下

21、按键启动定时器 TR0=1; while(Key=0); /T0中断控制点阵屏显示void Timer0() interrupt 1 DoorBell=DoorBell; p+; if(p400) /若需要拖长声音,可以调整400和800 TH0=(8192-700)/32; /700us定时 TL0=(8192-700)%32; else if(p800) TH0=(8192-1000)/32; /1ms定时 TL0=(8192-1000)%32; else TR0=0; p=0; 十一、 演奏音阶/* 名称:演奏音阶 说明:本例使用定时器演奏一段音阶,播放由K1控制。*/#include#

22、define uchar unsigned char#define uint unsigned intsbit K1=P10;sbit SPK=P34;uint i=0; /音符索引/14个音符放在方式2下的定时寄存器(TH0,TL0)uchar code HI_LIST=0,226,229,232,233,236,238,240,241,242,244,245,246,247,248;uchar code LO_LIST=0,4,13,10,20,3,8,6,2,23,5,26,1,4,3;/定时器0中断函数void T0_INT() interrupt 1 TL0=LO_LISTi; TH

23、0=HI_LISTi; SPK=SPK;/延时void DelayMS(uint ms) uchar t; while(ms-) for(t=0;t120;t+);/主程序void main() TMOD=0x00; /T0方式0 IE=0x82; SPK=0; while(1) while(K1=1); /未按键等待 while(K1=0); /等待释放 for(i=1;i15;i+) TR0=1; /播放一个音符 DelayMS(500); /播放延时 TR0=0; DelayMS(50); 十二、 按键控制定时器选播多段音乐/* 名称:按键控制定时器选播多段音乐 说明:本例内置3段音乐,

24、K1可启动停止音乐播放,K2用于选择音乐段。*/#include#include#define uchar unsigned char#define uint unsigned intsbit K1=P10; /播放和停止键sbit SPK=P37; /蜂鸣器uchar Song_Index=0,Tone_Index=0; /当前音乐段索引,音符索引/数码管段码表uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/标准音符频率对应的延时表uchar code HI_LIST=0,226,229,232,2

25、33,236,238,240,241,242,244,245,246,247,248;uchar code LO_LIST=0,4,13,10,20,3,8,6,2,23,5,26,1,4,3;/三段音乐的音符uchar code Song50= 1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1, 3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1, 3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1;

26、/三段音乐的节拍uchar code Len50= 1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1, 1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1, 1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1;/外部中断0void EX0_INT() interrupt 0 TR0=0; /播放结束或者播放中途切换歌曲时停止播放 Song_Index=(Song_Index+1)%3; /跳到下一首的开头 Tone_Index=0; P2=DSY_CODESong_Index; /数码管显示当前音乐段号/定时器0中断函数void T0_INT() interrupt 1 TL0=LO_LISTSongSong_IndexTone_Index; TH0=HI_LISTSongSong_IndexTone_Index; SPK=SPK;/延时void DelayMS(uint ms) uchar t; while(ms-) for(t=0;t120;t+);/主程序void mai

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1