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

上传人:时间****91 文档编号:129253096 上传时间:2022-08-02 格式:DOC 页数:17 大小:436KB
返回 下载 相关 举报
实验:8051+Proteus定时计数器仿真_第1页
第1页 / 共17页
实验:8051+Proteus定时计数器仿真_第2页
第2页 / 共17页
实验:8051+Proteus定时计数器仿真_第3页
第3页 / 共17页
点击查看更多>>
资源描述
实验: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工作方式0TH0=(8192-5000)/32;/5ms定期TL0=(8192-5000)%32;IE=0x82;/容许T0中断TR0=1;while(1);/T0中断函数void LED_Flash() interrupt 1TH0=(8192-5000)/32;/恢复初值TL0=(8192-5000)%32;if(+T_Count=100)/0.5s开关一次LEDLED=LED;T_Count=0; 二、 TIMER0控制流水灯/*名称:TIMER0控制流水灯阐明:定期器控制P0、P2口的LED滚动显示,本例未使用中断函数。*/#include#include#define uchar unsigned char#define uint unsigned int/主程序void main()uchar T_Count=0;P0=0xfe;P2=0xfe;TMOD=0x01; /定期器0工作方式1TH0=(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只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工作方式2TH0=256-200;/200us定期TL0=256-200;IE=0x82;TR0=1;/启动定期器while(1);/T0中断函数void LED_Flash_and_Scroll() interrupt 1if(+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实现二进制计数阐明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定期或计数中断函数。而是启用了计数器,连接在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定期控制下一组条形LED,滚动速度较慢*/#include#include#define uchar unsigned char#define uint unsigned intuchar tc0=0,tc1=0;/主程序void main()P0=0xfe;P2=0xfe;TMOD=0x11;/定期器0、定期器1均工作于方式1TH0=(65536-15000)/256;/定期器0:15msTL0=(65536-15000)%256;TH1=(65536-50000)/256;/定期器1:50msTL1=(65536-50000)%256;IE=0x8a;TR0=1;/启动定期器TR1=1;while(1);/T0中断函数void Time0() interrupt 1TH0=(65536-15000)/256;/恢复定期器0初值TL0=(65536-15000)%256;if(+tc0=10)/150ms转换状态tc0=0;P0=_crol_(P0,1);/T1中断函数void Time1() interrupt 3TH0=(65536-50000)/256;/恢复定期器1初值TL0=(65536-50000)%256;if(+tc1=10)/500ms转换状态tc1=0;P2=_crol_(P2,1);六、 10s的秒表/*名称:10s的秒表阐明:初次按键计时开始,再次按键暂停,第三次按键清零。*/#include#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_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; /显示00P2=0x3f;i=0;Second_Counts=0; Key_Flag_Idx=0; /按键次数(取值0,1,2,3)Key_State=1; /按键状态TMOD=0x01;/定期器0方式1TH0=(65536-50000)/256;/定期器0:15msTL0=(65536-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;/恢复定期器0初值TL0=(65536-50000)%256;if(+i=2)/50ms*2=0.1s转换状态i=0;Second_Counts+;P0=DSY_CODESecond_Counts/10;P2=DSY_CODESecond_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,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;uchar Count=0;/主程序void main()P0=0x00; P2=0x00;TMOD=0x06;/计数器T0方式2TH0=TL0=256-1;/计数值为1ET0=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;/由于只有两位数码管,计数控制在100以内(0099)/INT0中断函数void Clear_Counter() interrupt 0Count=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,0x5b,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方式1TH0=(65536-50000)/256;/50ms定期TL0=(65536-50000)%256;IE=0x82;TR0=1;/启动T0while(1)j=0x7f;/显示Digits_of_6DSY5Digits_of_6DSY0的内容/前面高位,背面低位,循环中i!=-1亦可写成i!=0xfffor(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+;/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 uchar 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方式0TH0=(8192-4000)/32;/4ms定期TL0=(8192-4000)%32;IE=0x82;TR0=1;/启动T0while(1);/T0中断函数控制数码管刷新显示void DSY_Show() interrupt 1TH0=(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)%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方式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 1DoorBell=DoorBell;p+;if(p400)/若需要拖长声音,可以调节400和800TH0=(8192-700)/32;/700us定期TL0=(8192-700)%32;else if(p800)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下的定期寄存器(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 1TL0=LO_LISTi;TH0=HI_LISTi;SPK=SPK;/延时void DelayMS(uint ms)uchar t;while(ms-) for(t=0;t120;t+);/主程序void main()TMOD=0x00;/T0方式0IE=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段音乐,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,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;/三段音乐的音符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,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 1TL0=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 main()P2=0xc0;SPK=0;TMOD=0x00;/T0方式0IE=0x83;IT0=1;IP=0x02;while(1)while(K1=1);/未按键等待while(K1=0);/等待释放TR0=1;/开始播放Tone_Index=0;/从第0个音符开始/播放过程中按下K1可提前停止播放(K1=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次亮红灯, 红灯亮后,南北向由红灯变成绿灯,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_Type=1;/定期器0中断函数void T0_INT() interrupt 1TL0=-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!=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:/南北向黄灯开始闪烁,绿灯关闭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方式1IE=0x82;TR0=1;while(1);十四、 报警与旋转灯/*名称:报警与旋转灯阐明:定期器控制报警灯旋转显示,并发出仿真警报声。*/#include#include#define uchar unsigned char#define uint unsigned intsbit SPK=P37;uchar FRQ=0x00;/延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i120;i+);/INT0中断函数void EX0_INT() interrupt 0TR0=TR0;/启动或停止两定期器,分别控制报警器的声音和LED旋转TR1=TR1;if(P2=0x00)P2=0xe0;/开3个旋转灯elseP2=0x00;/关闭所有LED/定期器0中断void T0_INT() interrupt 1TH0=0xfe;TL0=FRQ;SPK=SPK;/定期器1中断void T1_INT() interrupt 3TH1=-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);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!