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

上传人:日度 文档编号:147634815 上传时间:2020-10-11 格式:DOC 页数:17 大小:451KB
返回 下载 相关 举报
实验:8051+Proteus定时--计数器仿真_第1页
第1页 / 共17页
实验:8051+Proteus定时--计数器仿真_第2页
第2页 / 共17页
实验:8051+Proteus定时--计数器仿真_第3页
第3页 / 共17页
实验:8051+Proteus定时--计数器仿真_第4页
第4页 / 共17页
实验:8051+Proteus定时--计数器仿真_第5页
第5页 / 共17页
点击查看更多>>
资源描述

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

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; /定时器0工作方式0TH0=(8192-5000)/32;/5ms定时TL0=(8192-5000)%32;IE=0x82;/允许T0中断TR0=1;while(1);/T0中断函数void LED_Flash()

2、 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工作

3、方式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

4、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

5、=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为计数器,工作

6、方式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、

7、定时器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()

8、 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,0x

9、06,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

10、=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-

11、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中断,实现计数值累

12、加。 计数器的清零用外部中断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;/因为只有两位数码管,计数控制

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号