
头衔:未定义
等级:小学生
帖数:1
金钱:8
S币:0
|
|
收藏 举报 1F 资料 | 留言 | 编辑 | 引用 | 评帖 | 主页
新人求教
看书实践 写个小程序 总也搞不定
想法是用中断实现led闪烁
用中断产生50ms 想亮多久就是多少个50ms 灭也一样 但我的程序没延时 高人 前辈 老大们 能给指点一下为什么吗 程序如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define M1 45872
sbit led01=P3^4;
uchar num; //声明变量num
void T01(); //声明函数 T01 (T01是一个动作 我想让led点亮T01秒)
void delay6(); //声明函数 delay6 (delay是灭的时间 想实led灭6秒)
void init() //初始化 抄书的 我理解其意思是定义计时器工作模式 给计中断定义时间和开总中断 开定时器等
{
TMOD=0x01;
TH0=(65536-M1)/256; //TH0=0x4B/75
TL0=(65536-M1)%256; //TL0=0xFD/253 (65536-M1)Mod256
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init(); //调用初始化函数
while(1) //循环下面的两个函数
{
T01(); //执行T01函数
delay6(); //执行delay6函数
}
}
void T01() //T01点亮1秒函数主体
{
led01=0; //进入函数后 先打开led01
num++; //计时器累加 仿真到这里时 TH0=0x4C TL0=0x03
if(num==12) //如果加到12 说明0.6秒时间到 仿真时每次执行到这里直接就跳过去了 没有累加
{
num=0; //计数器清零
led01=1; //led关闭
}
}
void delay6() //延时6秒的函数体
{
led01=1;
num++; //累加 每次也是到这里就跳过去了 我老觉得是中断的数据没传过来
if(num==120) //如果加到120个 说明6秒时间到
{
num=0; //清零 这段是想让mcu等在那6秒 就是让led灭6秒
}
}
void T0_time() interrupt 1
{
TH0=(65536-M1)/256; //书上说为了保证每次都是50ms 所以要重装初值
TL0=(65536-M1)%256; //我觉得我写的这个根本就没执行到这里
num++;
}
|
----签名档 --------------------------------------------------------
眼镜蛇论坛欢迎您!
Posted:2013-06-09 11:17:15
| |
|
Powered By:Discuz! 6.0 Processed in:0.109375s,13 queries.
眼镜蛇论坛|单片机论坛| 技术支持:【QQ】1522066584