欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机内部定时器/计数器实验

发布时间:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 51单片机内部定时器/计数器实验 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

51单片机内部定时器/计数器实验

一、实验内容
使用MCS-51内部定时/计数器,定时1秒钟,CPU运用定时中断方式,实现每1秒钟输出状态发生一次反转,即发光管每隔1秒钟亮一次(P1.7接LED)。
根据实验内容编写一个程序,并在实验仪器上调试和验证。
二、仿真图

三、代码
C语言实现:

# include <reg52.h> # include <intrins.h> # define uint unsigned int # define uchar unsigned char sbit LED=P1^0; uchar t,temp; void init();void main() { t=0;init();while(1){if(t>=20){ t=0;LED=~LED ;}}} void init() { // 定时器1TMOD=0x10;//设置定时器1 的工作方式TH1=(65536-50000)/256;TL1=(65536-50000)%256; EA=1;//开总中断ET1=1;//开定时器1 的中断TR1=1;//启动定时器1; } void timr1() interrupt 3 {TH1=(65536-50000)/256;TL1=(65536-50000)%256; t++; }

汇编实现:

TICK EQU 10000 ; 10000 X 100US = 1ST100US EQU 156 ; 100US时间常数(6M)C100US EQU 30H ; 100US记数单元LEDBUF BIT 20HORG 0000HLJMP STARTORG 000BHLJMP T0INTORG 0030HSTART: MOV SP, #60HMOV TMOD, #02H ; 定时器0,方式2 MOV TH0, #T100USMOV TL0, #T100USMOV IE, #10000010B ; EA=1, IT0 = 1SETB TR0 ; 开始定时CLR LEDBUFCLR P1.0MOV C100US, #27H ;#HIGH(TICK)MOV C100US+1, #10H ;#LOW(TICK) LOOP: MOV C, LEDBUFMOV P1.0, CSJMP LOOPT0INT: PUSH PSWMOV A, C100US+1JNZ GOONDEC C100US GOON: DEC C100US+1MOV A, C100USORL A, C100US+1JNZ EXIT ; 100US 记数器不为0, 返回MOV C100US, #27H ; #HIGH(TICK)MOV C100US+1, #10H ; #LOW(TICK)CPL LEDBUF ; 100US 记数器为0, 重置记数器,取反LED EXIT: POP PSWRETIEND

总结

以上是生活随笔为你收集整理的51单片机内部定时器/计数器实验的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。