3844|13

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个简单的C51程序, [复制链接]

#include
main()
{
        TMOD=0X10;
        TH1=0XFE;
        TL1=0X0C;
        TR1=1;
        ET1=1;
        EA=1;
        while(1){;}

}
void INT0() interrupt 1;
{
        TH1=0XFE;
        TL1=0X0C;
        P1^0=~P1^0;
}

这是用定时器/计数器T1的方式1,设定1MS的定时。在P1^0引脚上产生周期为2MS的方波输出。振荡频率设为6MHz

我有几个低级问题想问下大家,
1,2MS的波形到底怎样产生的?
2,在主函数和中断函数里都有TH1=0XFE;TL1=0X0C; 是什么意识?
3,while(1)有何用?不会无限循环吗?
4,对于中断函数那格式有点不懂,interrupt 1;  这1是啥意识?
谢谢了,,
       

最新回复

1、你是定时1ms,在定时中断中每次都把P1.0口翻转一次,这不就产生了一个2ms的方波了嘛 你用的6M的晶振,这样你的时钟频率f = 6M/12 = 0.5M,就是1个NOP是2us; 你用的定时器初始值是0xFE0C,所以你的定时时间就是(0xffff - 0xfe0c + 1)* 2us = 1ms 2、0xFE0C是16位定时器的初始值,你在TMOD中设定的就是16位定时器,定时器是一个增计数器,每一个时钟周期从你设定的初始值加1,一直到0xffff,然后再加1溢出位置,定时器产生中断,进入中断服务子程序,也就是说你定时的时间是:(0xffff - 0xfe0c + 1)* 2us = 1ms 3、while(1);就是一个死循环,在单片机c语言中,死循环是经常用的一个方法,就是说让单片机一直等待在这里,知道发生中断,计入中断服务子程序,中断服务子程序处理完成后,继续进入死循环等待中断的状态; 4、interrupt是中断关键字,后面的1表示中断优先级,因为定时器1的中断优先级是1,这就相当于告诉编译器中断优先级1的中断发生时,就进入这个函数INT0来处理。后面应该还有一个关键字using,他用来表示你进入中断时需要保存哪些寄存器,这个一般很少用,不过你写要求比较高的程序时,肯定会要用到这个关键字的 建议你多看看书,最好是那些有很多程序注释的书  详情 回复 发表于 2009-4-22 16:16
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1.P1^0=~P1^0;产生方波
2.主函数是赋初值 中断函数是重新赋值
3.要的就是无限循环
4.1代表是定时器/计数器0的中断
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那程序在运行时,到底是先运行主函数还是先中断函数??
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
主函数是不停的在运行,当定时器时间到了就会产生硬件中断,单片机就去运行中断函数,当中断程序运行完了再回去接着运行主函数
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
哦,谢了,
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
我觉得你这些问题应该找本51系列的书看看就会很容易明白的。象第二问书上就有相关解答。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
书是看了,可第一遍看难免有的地方不会注意到,
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
首先看书,然后多看看别人的程序,掌握算法
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

9
 
恩,现在正在看下书,,可惜,看的不够快,抽不出很多时间
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
看书在加上自己多实践就会提高的更快。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
这个我们刚学呢!
还看得懂些。书上好像都有的,只不过我们都给忽略了!
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
就是这样,,
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

13
 
这是最基础的了
看书吧
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
1、你是定时1ms,在定时中断中每次都把P1.0口翻转一次,这不就产生了一个2ms的方波了嘛
你用的6M的晶振,这样你的时钟频率f = 6M/12 = 0.5M,就是1个NOP是2us;
你用的定时器初始值是0xFE0C,所以你的定时时间就是(0xffff - 0xfe0c + 1)* 2us = 1ms

2、0xFE0C是16位定时器的初始值,你在TMOD中设定的就是16位定时器,定时器是一个增计数器,每一个时钟周期从你设定的初始值加1,一直到0xffff,然后再加1溢出位置,定时器产生中断,进入中断服务子程序,也就是说你定时的时间是:(0xffff - 0xfe0c + 1)* 2us = 1ms

3、while(1);就是一个死循环,在单片机c语言中,死循环是经常用的一个方法,就是说让单片机一直等待在这里,知道发生中断,计入中断服务子程序,中断服务子程序处理完成后,继续进入死循环等待中断的状态;

4、interrupt是中断关键字,后面的1表示中断优先级,因为定时器1的中断优先级是1,这就相当于告诉编译器中断优先级1的中断发生时,就进入这个函数INT0来处理。后面应该还有一个关键字using,他用来表示你进入中断时需要保存哪些寄存器,这个一般很少用,不过你写要求比较高的程序时,肯定会要用到这个关键字的

建议你多看看书,最好是那些有很多程序注释的书
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表