利用定时和中断的汇c语言程序,定时和中断的应用.doc

外部中断的应用

问题描述:

设计流水灯,并利用外部中断(外部中断0、外部中断1自选)让接在P1口的8位流水灯闪烁十次。

图1-1 流水灯PROTEUS仿真图

程序清单:

图1-2 C语言程序

图1-3 汇编程序

仿真效果

图1-4 没有外部中断请求时

图1-5 中断响应

4.程序分析:

C语言程序中一共有4个函数:1 是延时函数delay();2 是中断和输出初始化函数init(),为外部中断工作做准备;3 是主函数,在函数里用到while( 表达式 ) 语句,并且表达式一直为真,即表达式取非0 值,构成了无限循环,在循环里执行流水灯程序,并一直检测是否用外部中断请求;4 是外部中断函数,中断函数没有返回值,没有参数,我选的是外部中断1,所以写成viod INT_timer (void ) 2,其中2是外部中断1 在C语言中的入口序号。在中断函数里 unsigend int i = 20 就是为闪烁10次的循环初值。

编写汇编程序时就可以根据C语言程序的写法一步一步往下写就可以了。在汇编程序里需要注意几个地方:1-中断的入口地址,外部中断1的是0013H,就有了ORG 0013H。2-调用函数,在汇编里可以用ACALL或LCALL调用,两者区别就在调用寻址范围,ACALL只能11位地址范内调用,而LCALL是16位寻址,函数返回要用RET。 3-中断函数,进入中断函数必须要对一些数据进行保存,防止数据出错,就要用到进栈(PUSH)和出栈(POP),对栈的操作遵循“先进后出”原则,中断函数用RETI返回。

定时器的应用1

1.题目描述:利用51单片机的定时中断(1或2)设计5MS延时,并用此延时作为流水灯间隔。

图2-1 Proteus仿真原理图

2.程序清单

图2-2 C语言程序

图2-3 汇编程序

仿真效果

图2-4仿真图

4.程序分析:

我选的是定时/计数器0的方式1,时钟频率选择12MHZ。定时/计数器实际是一个加1 计数器,每次计数时间为一个机器周期,12MHZ晶振时,每计数一次就是1us,所以计数5000次就是5MS,这样用定时器设计5MS延时就做好了。由于5MS时间太短,对于流水灯根本看不出效果,所以我用了5MS延时20次(20*5=100MS)。

三、定时器应用2

1.题目描述:利用定时计数器的计数功能设计一个电子计数器,每来一次中断记录一个数,并将数据显示在数码管上,分别利用汇编语言或C语言设计程序设计,利用PROTUSE软件画出电路仿真图,并实现功能仿真。

图3-1 Proteus仿真图

程序清单

图3-2 C语言程序图

图3-3 汇编程序

3.仿真效果

图3-4 无中断请求

图3-5 按键第一次按下

程序分析

我选择定时/计数器0的方式1,要想定时/计数器工作于计数模式,首先TMOD=0x05,在汇编中定时/计数器的入口地址为000BH。其次给TH0和TL0赋初值,我做的是按键按下一次就记一次数,所以设置初值为65535,那么TH0=0xff,TL0=0xff,最后就是开总中断,开定时器中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值