菜鸟刚学单片机,看别人的代码看不明白,请高手讲解一下。
是51单片机的C语言的代码。
有几处菜鸟都不明白是啥意思,就标上了//这里是啥意思呢??请高手帮我写一下注释,呵呵,谢谢了。
#include
#include
unsigned char data dis_digit;
unsigned char data dis_buf[8];
unsigned char data dis_index;
void main()
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x50;//这里是啥意思呢??
TH0 = 0x50;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
IE = 0x82;//这里是啥意思呢??
dis_buf[0] = 0xf9;
dis_buf[1] = 0x80;
dis_buf[2] = 0xf8;
dis_buf[3] = 0x82;
dis_buf[4] = 0x92;
dis_buf[5] = 0x99;
dis_buf[6] = 0xb0;
dis_buf[7] = 0xa4;
dis_digit = 0xfe;
dis_index = 0;
TR0 = 1;
while(1);
}
void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xf0;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
P2 = 0xff
P0 = dis_buf[dis_index];
P2 = dis_digit;
dis_digit = _cror_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
上面是对定时器的操作 ,TMOD = 0x50;//这里是啥意思呢??
TH0 = 0x50;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
分别是模式,和定时器初值的高位、低位,IE是使能中断,这个在任何单片机的书上都能看到,建议先看书。
TH0 = 0xf0;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
表面上:他们是制定时期的初值
语义上:它重装定时器的值
sfr TMOD = 0x89;
/*
TMOD寄存器
+----+---+---+---+----+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+----+---+---+---+----+---+---+---+
|GATE|C/T|M1 |M0 |GATE|C/T|M1 |M0 |
+----+---+---+---+----+---+---+---+
|<---计时器1---->|<---计时器0---->|
GATE:Timer0或Timer1必须在INT0或INT1高电平才初始化
C/T:1表示外部引脚T0或T1输入的脉冲计数
+----+----+----------+-------------------------------------+
| M1 | M0 | 工作模式 | 说明 |
+----+----+----------+-------------------------------------+
| 0 | 0 | 0 | 13位计时/计数器 |
+----+----+----------+-------------------------------------+
| 0 | 1 | 1 | 16位计时/计数器 |
+----+----+----------+-------------------------------------+
| 1 | 0 | 2 | 8位计时/计数器,可自动重新载入计数值|
+----+----+----------+-------------------------------------+
| 1 | 1 | 3 | 两组独立8位计时器 |
+----+----+----------+-------------------------------------+
工作模式0:使用THx的8位和TLx的低5位。可从0数到8191,之后益出产生中断自动清0。
工作模式1:可从0数到65535,之后益出产生中断自动清0。
工作模式2:只使用TLx可从0数到255,之后益出产生中断,同时自动载入TLx。
sfr IE = 0xA8;
/*
中断寄存器 IE
+---+---+---+---+---+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+
|EA | - |ET2|ES |ET1|EX1|ET0|EX0|
+---+---+---+---+---+---+---+---+
EA:整体中断使能
ET2:Timer2中断使能//只有52系列才有
ES:Uart中断使能
ET1:Timer1中断使能
EX1:INT1中断使能
ET0:Timer0中断使能
EX0:INT0中断使能
*/
找本单片机的书看看。大概看一遍,然后用到哪块,具体去查那一块的原理和应用例子。没有给我发个邮件,我发个电子版给你
看看定时器部分吧!
对于每个寄存器的每个位都有详细介绍
51的基本知识并不复杂,把《中断》、《定时器/计数器》、《串口》和《并口》四大块稍微整理一下做个笔记,就什么都明白了。
TMOD = 0x50;//这里是啥意思呢??
TH0 = 0x50;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
IE = 0x82;//这里是啥意思呢??
这是都是寄存器赋值,在头文件里应该能看到他们的初始化地址,跟硬件有关.
TMOD = 0x50;//这里是啥意思呢??
0101 0000
第一个1是C/T(counter ,timer)选项: 表示这里作为计数器用 如果等于0则是做定时器用
第二个1和前面紧挨的那个0合用,01表示工作在模式1下,即为16位计数
TH0 = 0x50;//这里是啥意思呢??
TL0 = 0xf0;//这里是啥意思呢??
TH0,TL0这里是给定时器(这里作计数)重装初值,具体有公式可以计算出计数的最大值
IE = 0x82;//这里是啥意思呢??
1000 0010
这里是中断允许控制,
第一个1表示允许中断(相当于几个不同终端的总开关,后面是控制各个不同中断的小开关)
第二个1表示允许定时器0中断,即,前面的定时器计数到最大值要重装的时候产生一个中断
单片机里面那些参数和控制实在太多了,所以你用到哪里,就要亲自动手查一查,看看相关说明就知道了。旁边放本书,或者电子资料,随时查找。
这一版块,太没人气了,是不是大家都成大侠了
如果成大侠了,也常回家看看嘛,家里太冷清了
据说努力顶帖也是一种美德,但我只想大家常回家看看
毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来