首先声明下我只是个菜鸟, 只会1点C语言,汇编什么的~对我而言是天书,看不懂 开发板也周日下午到的手, “十天学会单片机和C语言编程”也才看完 Lesson3,讲到 T0 中断。 试着做教程里的 课后练习,第1题, 题目是:第一个发光管以间隔200ms闪烁
题目说了200ms,我的强迫症啊,发作了,就想让他很精确的间隔200ms 看了其它的例子, 比如:http://www.51hei.com/bbs/dpj-13914-1.html 都没有很精确~
然后就试着自己写1个, 用我目前学会的办法,写了1段代码, 用Keil的软件模拟,看间隔时间, 结果是闪烁1次慢1微秒,折换到1小时就是慢 18ms 也就是只能做到 “第一个发光管以间隔199.999ms闪烁” 再精确~我目前是无能为力了 =_=!
下面是我写的程序代码[数码管的干扰什么的请无视] 另外,代码我只是刚在公司写完,还没在开法板上测试过 ^=^
//第一个发光管以间隔200ms闪烁 //计时器 T0 中断的使用 //使用 12MHz 晶振,方便计时
#include <reg52.h> //52单片机头文件 unsigned char T50ms=0; sbit leds=P1^4; //灯总开关 sbit led1=P0^0; //第1个灯开关 void main() { leds=0; //开灯 TMOD=0x01; //T0工作方式为 定时+16位定时 TH0=(65536-50000)/256; //定时器高8位初始时值 TL0=(65536-50000)%256; //定时器低8位初始时值 //50ms 计时 EA=1; //中断总开关 ET0=1; //中断小开关-T0计时开关 TR0=1; //开始计时 while(1) { if(T50ms==4) {led1=!led1; //灯闪烁 T50ms=0;} //重新计次 } } void delay50ms() interrupt 1 { //中断程序耗时_跳进中断堆栈操用5个机器周期= 5 μs T50ms++; //中断程序耗时_++运算用1个机器周= 1 μs TH0=(65536-50000)/256; //定时器高8位初始时值 //中断程序耗时_一次赋值用2个机器周= 2 μs TL0=(65536-50000)%256+8; //定时器低8位初始时值 /* 在 TL0 中 +8 后灯每次变化慢 1μs 每即 200ms 慢 1μs 1小时慢 18ms 在 led1=!led1; 处设断点,用Keil软件模拟,查看 sec 的值, #1=0.20045900 #2=0.40045800 #3=0.60045700 #4=0.80045600 #5=1.00045500 */ }
[此贴子已经被作者于2012-8-30 14:36:25编辑过]
|