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

上传人:scccc 文档编号:13165012 上传时间:2021-12-17 格式:DOC 页数:35 大小:904.50KB
返回 下载 相关 举报
实验:8051+Proteus定时计数器仿真.doc_第1页
第1页 / 共35页
实验:8051+Proteus定时计数器仿真.doc_第2页
第2页 / 共35页
实验:8051+Proteus定时计数器仿真.doc_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验:8051+Proteus定时计数器仿真.doc》由会员分享,可在线阅读,更多相关《实验:8051+Proteus定时计数器仿真.doc(35页珍藏版)》请在三一文库上搜索。

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

2、;/T0 中断函数void LED_Flash() interrupt 1 TH0=(8192-5000)/32; /TL0=(8192-5000)%32;恢复初值if(+T_Count=100) / 开关一次 LEDLED=LED;T_Count=0;二、 TIMER0 控制流水灯/* 名称: TIMER0 控制流水灯说明:定时器控制 P0、 P2*/#include<>#include<>#define uchar unsigned char#define uint unsigned int/ 主程序void main()uchar T_Count=0;P0=0xf

3、e;P2=0xfe;TMOD=0x01;TH0=(65536-40000)/256;TL0=(65536-40000)%256;TR0=1;while(1)if(TF0=1)口的 LED滚动显示,本例未使用中断函数。/ 定时器 0 工作方式 1/40ms 定时/ 启动定时器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 只 L

4、ED在定时器控制下滚动闪烁。*/#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 工作方式 2TH0=256-200;/200us 定时TL0=256-200;IE=0x82;TR0=1;/ 启动定时器while(1);/T0中断函数void LED_Flash_and_Scroll() int

5、errupt 1if(+k<35) 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(+j<300) return; / 每次闪烁持续一段时间 j=0;P0=0xff; / 关闭显示i+;/ 切换到下一个 LED四、 T0 控制 LED实现二进制计数/* 名称: T0 控制 LED实现二进制计数 说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用 定时或计

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

7、ED,滚动速度较慢*/#include<>#include<>#define uchar unsigned char#define uint unsigned int uchar tc0=0,tc1=0;/ 主程序void main()P0=0xfe;P2=0xfe;TMOD=0x11; / 定时器 0、定时器 1 均工作于方式 1 TH0=(65536-15000)/256;/ 定时器 0: 15msTL0=(65536-15000)%256;TH1=(65536-50000)/256;/ 定时器 1: 50msTL1=(65536-50000)%256;IE=0x8

8、a;TR0=1;/ 启动定时器TR1=1;while(1);/T0 中断函数void Time0() interrupt 1 TH0=(65536-15000)/256;/ 恢复定时器 0 初值TL0=(65536-15000)%256;tc0=0;P0=_crol_(P0,1);/T1 中断函数void Time1() interrupt 3TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(+tc1=10)tc1=0;P2=_crol_(P2,1);六、10s 的秒表/* 名称: 10s 的秒表说明:首次按键计时开始,再次按键暂停, 第三次按键清零

9、。*/#include<>#define uchar unsigned char#define uint unsigned int/ 恢复定时器 1 初值/500ms 转换状态sbit 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;t<120;t+);/ 处理按键事件void K

10、ey_Event_Handle()if(Key_State=0)Key_Flag_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()P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0;Key_State=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65

11、536-50000)%256;while(1)if(Key_State!=K1)DelayMS(10);Key_State=K1;Key_Event_Handle();/T0 中断函数void DSY_Refresh() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(+i=2)i=0;Second_Counts+;P0=DSY_CODESecondP2=DSY_CODESecond/ 按键次数(取值 0, 1,2,3)/ 按键状态/ 定时器 0 方式 1/ 定时器 0: 15ms/ 恢复定时器 0 初值/50ms*2= 转换

12、状态Counts/10;Counts%10;七、用计数器中断实现 100 以内的按键计数/* 名称:用计数器中断实现 100 以内的按键计数说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。 计数器的清零用外部中断 0 控制。*/#include<>#define uchar unsigned char#define uint unsigned int/ 段码ucharcode因此DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;uch

13、ar Count=0;/ 主程序void main()P0=0x00;/ 计数器 T0 方式 2P2=0x00;TMOD=0x06;ET0=1;/ 允许 T0 中断EX0=1;/允许INT0 中断EA=1;/允许CPU中断IP=0x02; / 设置优先级, T0 高于 INT0IT0=1;/INT0中断触发方式为下降沿触发TR0=1;/启动T0while(1)P0=DSY_CODECount/10;P2=DSY_CODECount%10;/T0 计数器中断函数void Key_Counter() interrupt 1Count=(Count+1)%100; / 因为只有两位数码管,计数控制在

14、 /INT0 中断函数void Clear_Counter() interrupt 0Count=0;八、 100 000s 以内的计时程序/* 名称: 100 000s 以内的计时程序说明:在 6 只数码管上完成 099 。*/100 以内( 0099)#include<>#include<> #define uchar unsigned char#define uint unsigned int/ 段码uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/6 只数码管上显示的数字

15、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;t<120;t+);/ 主程序void main()uchar i,j;P0=0x00;P3=0xff;Count=0;TMOD=0x01;/ 计数器 T0 方式 1TH0=(65536-50000)/256;/50ms 定时TL0=(65536-50000)%256;IE=0x82;while(1)的内容i!=0xffj=0x7f;/ 显示 Digits_of_6DSY

16、5Digits_of_6DSY0/ 前面高位,后面低位,循环中 i!=-1 亦可写成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 1uchar i;TH0=(65536-50000)/256; / 恢复初值TL0=(65536-50000)%256;if(+Count!=2) return;Count=0;Digits_of_6DSY0+;/ 位累加for(i=0;i<=5;i+)/

17、 进位处理if(Digits_of_6DSYi=10)else break;/ 若某低位没有进位,怎循环提前结束九、 定时器控制数码管动态显示/* 名称:定时器控制数码管动态 显示说明:8 个数码管上分两组动 态显示年月日与时分秒,本例的 位显示延时用定时器实现。*/#include<>#include<>#define uchar unsigned char#define uint unsigned int/ 段码,最后一位是“ - ”的段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80

18、,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()TMOD=0x00;/ 计数器 T0 方式 0TH0=(8192-4000)/32; /4ms 定时TL0=(8192-4000)%32;IE=0x82;TR0=1;/ 启动 T0while(1);/T0 中断函数控制数码管刷新显示void DSY_Show() interrupt 1TH0=(819

19、2-4000)/32; / 恢复初值TL0=(8192-4000)%32;P0=0xff; / 输出位码和段码P0=DSY_CODETable_of_Digitsij;P3=_crol_(P3,1);j=(j+1)%8; if(+t!=350) return; t=0;i=(i+1)%2;/ 数组第 i 行的下一字节索引/ 保持刷新一段时间/ 数组行 i=0 时显示年月日, i=1 时显示时分秒十、 用定时器设计的门铃/* 名称:用定时器设计的门铃 说明:按下按键时蜂鸣器发出叮咚的门铃声。*/#include<>#define uchar unsigned char#define

20、uint unsigned int sbit Key=P17; sbit DoorBell=P30; uint p=0;/ 主程序void main()DoorBell=0;TMOD=0x00;/T0 方式 0TH0=(8192-700)/32;/700us 定时TL0=(8192-700)%32;IE=0x82;while(1)if(Key=0)/ 按下按键启动定时器TR0=1;while(Key=0);/T0 中断控制点阵屏显示void Timer0() interrupt 1 DoorBell=DoorBell;p+;if(p<400)/ 若需要拖长声音,可以调整 400 和 80

21、0TH0=(8192-700)/32; /700us 定时TL0=(8192-700)%32;else if(p<800)TH0=(8192-1000)/32; /1ms 定时TL0=(8192-1000)%32;elseTR0=0;p=0;十一、 演奏音阶/* 名称:演奏音阶说明:本例使用定时器演奏一段音阶,播放由 K1 控制。*/#include<>#define uchar unsigned char#define uint unsigned intsbit K1=P10;sbit SPK=P34;uint i=0;/ 音符索引/14 个音符放在方式 2 下的定时寄存器

22、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;TH0=HI_LISTi;SPK=SPK;/ 延时void DelayMS(uint ms)uchar t;while(ms-) for(t=0;t<120;t+);/ 主程序void main()TMOD=0x0

23、0;IE=0x82;SPK=0;/T0 方式 0while(1)while(K1=1);while(K1=0);for(i=1;i<15;i+) TR0=1;/ 未按键等待/ 等待释放/ 播放一个音符DelayMS(500); / 播放延时TR0=0;DelayMS(50);十二、 按键控制定时器选播多段音乐/* 名称:按键控制定时器选播多段音乐说明:本例内置 3 段音乐, K1 可启动 停止音乐播放, K2 用于选择音乐段。*/#include<>#include<>#define uchar unsigned char#define uint unsigned

24、 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,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

25、,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;/ 三段音乐的节拍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,

26、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 0TR0=0; / 播放结束或者播放中途切换歌曲时停止播放Song_Index=(Song_Index+1)%3;/ 跳到下一首的开头Tone_Index=0;P2=DSY_CODESong_Index;/ 数码管显示当前音乐段号/ 定时器 0 中断函数void T0_INT() interrupt 1

27、TL0=LO_LISTSongSong_IndexTone_Index;TH0=HI_LISTSongSong_IndexTone_Index;SPK=SPK; / 延时 void DelayMS(uint ms)uchar t;/T0 方式 0/ 未按键等待/ 等待释放/ 开始播放/ 从第 0 个音符开始K1 可提前停止播放( K1=0)。while(ms-) for(t=0;t<120;t+);/ 主程序void main()P2=0xc0;SPK=0;TMOD=0x00;IE=0x83;IT0=1;IP=0x02;while(1)while(K1=1);while(K1=0);TR

28、0=1;Tone_Index=0;/ 播放过程中按下/ 若切换音乐段会触发外部中断,导致TR0=0,播放也会停止 while(SongSong_IndexTone_Index!=-1&&K1=1&&TR0=1)DelayMS(300*LenSong_IndexTone_Index); / 播放延时(节拍)Tone_Index+; / 当前音乐段的下一音符索引TR0=0;/ 停止播放while(K1=0);/ 若提前停止播放,按键未释放时等待十三、 定时器控制交通指示灯/* 名称:定时器控制交通指示灯说明:东西向绿灯亮 5s 后,黄灯闪烁,闪烁 5 次亮红灯,红灯

29、亮后,南北向由红灯变成绿灯, 5s 后南北向黄灯闪烁,闪烁 5 次后亮红灯,东西向绿灯亮,如此往复。*/#include<> #define uchar unsigned char#define uint unsigned intsbit RED_A=P00; / 东西向指示 灯sbit YELLOW_A=P01;sbit GREEN_A=P02;sbit RED_B=P03; / 南北向指示灯sbit YELLOW_B=P04;sbit GREEN_B=P05;/ 延时倍数,闪烁次数,操作类型变量uchar Time_Count=0,Flash_Count=0,Operation

30、_Type=1;/ 定时器 0 中断函数void T0_INT() interrupt 1 TL0=-50000/256;TH0=-50000%256;switch(Operation_Type)case 1: / 东西向绿灯与南北向红灯亮 5sRED_A=0;YELLOW_A=0;GREEN_A=1;RED_B=1;YELLOW_B=0;GREEN_B=0;if(+Time_Count!=100) return; /5s( 100*50ms)切换Time_Count=0;Operation_Type=2;break;case 2: / 东西向黄灯开始闪烁,绿灯关闭if(+Time_Count

31、!=8) return;Time_Count=0;YELLOW_A=YELLOW_A;GREEN_A=0;if(+Flash_Count!=10) return;/ 闪烁Flash_Count=0;Operation_Type=3;break;case 3: / 东西向红灯与南北向绿灯亮 5sRED_A=1;YELLOW_A=0;GREEN_A=0;RED_B=0;YELLOW_B=0;GREEN_B=1;if(+Time_Count!=100) return; /5s( 100*50ms)切换Time_Count=0;Operation_Type=4;break;case 4: / 南北向黄

32、灯开始闪烁,绿灯关闭if(+Time_Count!=8) return;Time_Count=0;YELLOW_B=YELLOW_B;GREEN_A=0;if(+Flash_Count!=10) return; / 闪烁Flash_Count=0;Operation_Type=1;break; / 主程序 void main()TMOD=0x01; /T0 方式 1 IE=0x82;TR0=1; while(1);十四、 报警与旋转灯/* 名称:报警与旋转灯 说明:定时器控制报警灯 旋转显示, 并发出仿真警报声。*/ #include<> #include<>#defi

33、ne uchar unsigned char #define uint unsigned int sbit SPK=P37;uchar FRQ=0x00;/ 延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i<120;i+);/INT0 中断函数void EX0_INT() interrupt 0LED旋转TR0=TR0; / 开启或停止两定时器,分别控制报警器的声音和TR1=TR1;if(P2=0x00)P2=0xe0; / 开 3 个旋转灯elseP2=0x00; / 关闭所有 LED/ 定时器 0 中断void T0_INT() interrupt 1 TH0=0xfe;TL0=FRQ;SPK=SPK;/ 定时器 1 中断void T1_INT() interrupt 3 TH1=-45000/256;TL1=-45000%256;P2=_crol_(P2,1); / 主程序void main()P2=0x00;SPK=0x00;TMOD=0x11;/T0 、T1 方式 1TH0=0x00;TL0=0xff;IT0=1;IE=0x8b;/ 开启 0,1,3 号中断IP=0x01;/INT0 设为最高优先TR0=0;TR1=0;/ 定时器启停由 INT0 控制,初始关闭while(1)FRQ+;DelayMS(1);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1