单片机定时/计数器T1定时100ms,在P1.0引脚上产生周期为100ms的方波信号,晶振频率为12MHZ,请编写程序。

LOVEMENYU520 2011-01-02 04:17:42
单片机定时/计数器T1定时100ms,在P1.0引脚上产生周期为100ms的方波信号,晶振频率为12MHZ,请编写程序。 大家帮个忙。谢谢、
...全文
10846 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anjal2010 2011-03-11
  • 打赏
  • 举报
回复
可以用多个短的定时周期累加!你可以把100ms分为两个50ms来定时!
Barry-当下 2011-03-07
  • 打赏
  • 举报
回复
注意是周期!!!
okliujieko 2011-03-06
  • 打赏
  • 举报
回复
楼主若要周期为100ms的方波信号,定时50ms取反即可:
50ms / (1秒 / (12MHz / 12分频)) == 5 0000<65535
若要定时100ms,楼上说的是真理。
不知楼主是否误解了。
100ms定时取反是产生200ms周期方波。
lbing7 2011-01-26
  • 打赏
  • 举报
回复
定时是定在100ms。这个倒底能不能做到。

那就算一下。定时100ms需要多少个时钟周期。

100ms / (1秒 / (12MHz / 12分频)) == 10 0000(这个明显超出了65535这个16位定时器的长度)

如果不多次累积,咱的小51是做不到的。


pang123hui 2011-01-25
  • 打赏
  • 举报
回复
main()
{
IE = 0x88;
TMOD = 0x10;
TR1 = 1;
while (1) ;
}


void timer0() interrupt 1
{
// 定时50ms,要知道51单片机最长只能定时65.536ms
TL1 = (65536-50000)%256; // 得到定时器寄存器低位
TH1 = (65536-50000)/256; // 得到定时器寄存器高位
count++;
if(count == 2) //两次即100ms
{
count = 0;
P 10 = !P10;
}

}
pang123hui 2011-01-25
  • 打赏
  • 举报
回复
你这个题目无解的,先不说100ms定时,产生100ms方波,不现实

还有,51单片机貌似一般的最小系统12Mhz的晶振最多出65.536ms的延时
jnwsh 2011-01-12
  • 打赏
  • 举报
回复
100ms定时器能产生200ms方波这个不假?产生100ms方波表示怀疑。
doushi87 2011-01-12
  • 打赏
  • 举报
回复
51单片机是12分频的,12M的晶振则说明一个机器周期是12/12,即1us。所以定时从65536-50000到65536总共花了50000个机器周期,即50000us = 50ms。这样应该明白了吧!
doushi87 2011-01-12
  • 打赏
  • 举报
回复
void timer0() interrupt 1
{
// 定时50ms,要知道51单片机最长只能定时65.536ms
TL1 = (65536-50000)%256; // 得到定时器寄存器低位
TH1 = (65536-50000)/256; // 得到定时器寄存器高位
count++;
if(count == 2) //两次即100ms
{
count = 0;
P10 = !P10;
}

}
我觉得这样写中断函数更加容易理解!
mycrazycracy 2011-01-06
  • 打赏
  • 举报
回复
用的是51?那不是很简单,看书上都有写啊。
至于为什么要设那个计数初值,有两种办法:一个是上网下一个单片机小精灵,直接给程序,想都不用想。另一个是通过晶振自己算
tengchao998 2011-01-06
  • 打赏
  • 举报
回复
用带有比较匹配功能的单片机吧,如:c8051f310,配置好就行了,连中断都不用进
Great_Bug 2011-01-03
  • 打赏
  • 举报
回复
假定是标准的80C51,12MHz的时钟,一个周期是1uS,50毫秒要50000个周期。至于右移8位,是因为要把高8位送给寄存器
上面程序是用T0,如果用T1,可以像这样

sbit P1_0 = P1^0;

main()
{
IE = 0x88;
TMOD = 0x10;
TR1 = 1;
while (1) ;
}

void t1_isr() interrupt 3
{
P1_0 = !P1_0;
TR1 = 0; /* 改常数的时候其实应当把它停下来。。。于是就不会很准 */
TL1 = 65536-50000;
TH1 = (65536-50000) >> 8;
TR1 = 1;
}
LOVEMENYU520 2011-01-03
  • 打赏
  • 举报
回复
还不是很明白。。请指点
czk111111 2011-01-03
  • 打赏
  • 举报
回复
先算出时间周期
65536减去要定的时间就是定时器应该设定的时间
LOVEMENYU520 2011-01-03
  • 打赏
  • 举报
回复
P1_0 = !P1_0;
TL0 = 65536-50000;
TH0 = (65536-50000) >> 8;
这里的50000是怎么计算出来了呢?
还有为什么要 >> 8;
谢谢
LOVEMENYU520 2011-01-03
  • 打赏
  • 举报
回复
你QQ多少
zhm39913884 2011-01-03
  • 打赏
  • 举报
回复
交流交流,学习学习!
加我为好友吧!
Great_Bug 2011-01-02
  • 打赏
  • 举报
回复

sbit P1_0 = P1^0;

main()
{
IE = 0x82;
TMOD = 1;
TR0 = 1;
while (1) ;
}

void t0_isr() interrupt 1
{
P1_0 = !P1_0;
TL0 = 65536-50000;
TH0 = (65536-50000) >> 8;
}

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧