【51单片机学习过程记录】9 中断之定时计数器0的使用2

来源:互联网 发布:威海手机数据恢复公司 编辑:程序博客网 时间:2024/05/14 08:47

程序说明:使用定时计数器0定时,每秒在数码管显示0到9的变化

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit duan=P2^6;
sbit wei=P2^7;
uchar code num[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};
uchar code guwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar p,q;

//延时函数
void delay(uint x)
{
uint i,y;
for(i=x;i>0;i--)
for(y=210;y>0;y--);
}


void main()
{
EA=1;
ET0=1;
TMOD=0x01;
TR0=0;
TH0=(65536-50000)/256;  //设为50ms
TL0=(65536-50000)%256;
P1=0x0;
p=0;                                                //用来计算一秒
q=0;                                                // 其变化用于数码管显示
TR0=1;
while(1);
}

//数码管显示每秒数字变化

void display(uchar n)
{
P0=guwei[0];
wei=1;
wei=0;
P0=num[n];
duan=1;
duan=0;
}

//定时计数器0中断函数

void time0() interrupt 1
{
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256;
p++;
if(p==20)
{
p=0;
display(q);
q++;
if(q==10)
q=0;
}

}


程序小结:

每一篇学习实践的记录都是在前面的学习和实践中延伸出来的,如果有新的知识点,会详述之,否则,在前文都有提及。

这个程序只是在定时计数器的基础上加上了数码管显示不同数字的功能,需要注意的应该是,如何把每次中断一秒,以不同的数字显示出来,也就是说数码管显示的数字是变化的,程序中我使用变量q作为数码管变化显示的根据,在中断函数中令q从0到9变化,然后把q的值传给显示函数display()。


过程插曲:


相信有不少人都遇到 

error 65:access violation at C:0x0000 :no ‘execute/read’ permission

这个问题,百度问,也会发现很多这样的问题,大部分是汇编程序,大概是程序制定的起始地址不正确,但我写的是c程序,然后继续找答案。

结果是 让老师晕在厕所 的出错,是的,正如问题出现的原因是程序执行的初始地址出错,应该在程序入口处找问题,

很菜的出错,就是我把void main() 写成 void mian()  打错了单词。

以后要注意。

0 0