标题:
这个单片机程序有些看不懂
[打印本页]
作者:
小可爱i
时间:
2018-1-6 22:55
标题:
这个单片机程序有些看不懂
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char //数据类型宏定义
#define uint unsigned int
#define out P0 //IO端口定义
/*******共阳数码管 0 , 1 ,2 ,3 , 4 ,5 ,6 , 7, 8 ,9 ******/
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
uint i = 0; //全局变量
uint cnt=0;
/***********主函数*******************************************************/
void main(void)
{
int j;
TMOD=0x15; // 定时器0工作于计数方式,工作方式1,16位计数
// 定时器1工作于定时方式,工作方式1,16位定时
TH0=0; // 清零计数器
TL0=0;
TH1=0x4C; // 12M晶振工作下,定时50ms
TL1=0x00;
TR0=1; // 启动定时器0
TR1=1; // 启动定时器1
IE=0x88; // 打开定时中断1和总中断
while(1)
{
P2=0x00; // 输出百位
out = seg[cnt/100];
P2 = 0x01;
for(j=0;j<100;j++);
P2=0x00;
out = seg[cnt%100/10]; // 输出十位
P2 = 0x02;
for(j=0;j<100;j++);
P2=0x00;
out = seg[cnt%10]; // 输出个位
P2 = 0x04;
for(j=0;j<100;j++);
}
}
/***********计数器T0中断处理函数******************************************/
void Timer1_ISR() interrupt 3
{
static char j = 0;
i++;
TH1=0x4C; // 重设定时器值,50ms @ 12MHz XTAL
TL1=0x00;
if(++j == 20) // 50ms * 20 = 1S
{
j = 0;
i = (TH0 << 8) | TL0; // 1S内的计数值
cnt=i;
i=0;
TH0 = 0; // 清零计数
TL0 = 0;
}
}
复制代码
作者:
zl2168
时间:
2018-1-7 20:44
先学理论,打基础,否则,问题多多,事倍功半。
作者:
candura
时间:
2018-1-9 08:39
具体是哪些地方看不懂呢?简单浏览了一下代码,这就是个在数码管上显示计数器的计数次数的程序啊。
开始配置计时器为50ms产生一次中断,然后在中断中判断是否已经到了1s(即进入中断20次),如果已经到了1s就把定时器0的数值赋给cnt变量, 从而在主程序中通过数码管将定时器0的计数显示出来。
作者:
ahshmj
时间:
2018-1-9 10:26
你的程序里面,就没有TL0增加的语句,所以TH0、TL0会一直不变。
你需要在你认为合适的地方增加一句“TL0++;” (不知道你程序的意图,所以也不知道这一句加在哪儿合适)。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1