学了4天,写了个简单时钟的程序
时间:10-02
整理:3721RD
点击:
昨晚到视频学到了。冲断,定时器,888数码管的显视。学一点,做一点。记的劳,学的快,代码运用更我行我素。因为还没学到按键的操作。所以写出来的还不能改时间,是从00:00:00。0开始的。我在家学的,手头没有单片机,买也大老远。没能亲自试用。发出来给大家点明点明。 晶振:24.0MHZ 不用锁存器,直接用两个IO口控制888数码管。我也不知道AT89C58 IO 口 高电平能输出多少电流,点不亮就要加电流放大电路了。已经用Keil软件 仿真没见有什么问题。 #include <REGX52.H>
#include <intrins.h>//移位功能头文件
#define A unsigned char //全局定量
A code ab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, //建一个列表,名叫ab,{内容0-9} 用 来 数 字 显 视
0x7f,0x6f};
A code ac[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf}; //建一个列表,名叫ac};用来扫描WE1到WE7
A a,t1,t2,t3,t4,t5,t6,t7;
void main()
{
TMOD=0x01;//选择定时器为第一个。
TH0=(65536-50000)/256;//给定时器高8位给个初值。
TL0=(65536-50000)%256;//给低8位个初值。
EA=1;//开总冲断。
ET0=1;//开定时器1冲断。
TR0=1;//启动定时器。=0时,停止定时。
t1=0;
t2=0;
t3=0;
t4=0;
t5=0;
t6=0;
t7=0;
while(1)
{
if (a==40)
{
t7++; //10分1之秒
a=0;
}
if (t7==10)
{
t7=0; //个位秒
t6++;
}
if (t6==10)
{
t6=0; //十位秒
t5++;
}
if (t5==6)
{
t5=0; //个位分
t4++;
}
if (t4==10)
{
t4=0; //十位分
t3++;
}
if (t3==6)
{
t3=0; //个位时
t2++;
}
if (t1==2)
if (t2==4)
{ //十位时
t2=0;
t1=0;
}
if (t2==10)
t1++;
P1=ac[0];
P0=ab[t1];
P1=ac[1];
P0=ab[t2];
P1=ac[2];
P0=ab[t3];
P1=ac[3];
P0=ab[t4];
P1=ac[4]; //扫描数据显示
P0=ab[t5];
P1=ac[5];
P0=ab[t6];
P1=ac[6];
P0=ab[t7];
}
}
void timer0() interrupt 1 //定时器1 函数(),冲断方式1。《0为外部冲断,1为定时器冲断》冲断函数不用在前面声明。
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //2.5ms 一次。
a++;
}
//237238009
你这说晶振是24,那你定时器中的那个数值不能是50000,这个50000是针对晶振是12来说的
12MHZ 5000 是50ms 那24MHZ 5000是不是25ms了/ 看 if (a==4) 4*25ms=100ms 这里就是用在10分1秒的显示 ,仿真的时间只多0.00002s
晶振是24,50000的话晶振应该是12
算错了。24M的话。1/24000000*12*5000=2.5ms 那么,if (a==40) 才是10分之1秒。
是中断好不。