微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 学了4天,写了个简单时钟的程序

学了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秒。

是中断好不。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top