2014-11-09 20:00:59 lixiangminghate 阅读数 2413
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4004 人正在学习 去看看 朱有鹏

传统51MCU的定时器没有时钟输出功能,此处使用的是增强型51MCU,型号stc12c5a60。

寄存器功能介绍之类的就省略了,数据手册上写的足够明了。由于protues不支持stc增强型MCU,只能烧写到芯片中,再用示波器验证。这点对于个人用户而言还是挺不方便的

真心希望哪天stc能提供protues的仿真元件。

STC提供了3路时钟输出,可以运行在1T/12T(即,对系统时钟12分频)模式下,1T模式感觉都可以取代其PCA的高速输出模式。

下面罗列代码,T0工作在1T模式/T1工作在12T模式。

#include "STC/STC12C5A.H"

#define MakeByte(target, Hi,Lo) \
do{ \
	target |= (((Hi)<<4)|(Lo)); \	
}while(0); \

#define SetTH(n,val) \
do{ \
	TH##n = val; \
}while(0); \

#define SetTL(n,val)  \
do{ \
	TL##n = val; \
}while(0); \

#define StartTn(n) \
do{ \
	TR##n = 0x01; \
}while(0);	\

#define Enable1TMode(n) \
do{ \
	AUXR |= n; \	
}while(0); \

#define EnableClkOut(n) \
do{ \
	WAKE_CLKO |= n; \
}while(0); \

int main()
{
	//T1 T0工作在定时器输出时,只能工作在模式2
	MakeByte(TMOD,0x02,0x02);
	//允许T1(P3.5)脚输出溢出脉冲
	EnableClkOut(T1CLKOEN);
	//T1 12分频,输出时钟频率 = Fosc/(12*(256-TH1)*2)
	SetTL(1,0x38);
	SetTH(1,0x38);
	//开启1T模式
	Enable1TMode(T0x12);
	//允许T0(P3.4)脚输出溢出脉冲
	EnableClkOut(T0CLKOEN);
	//T0 1分频 输出时钟频率 = Fosc/((256-TH1)*2)
	SetTL(0,0xF4);
	SetTH(0,0xF4);

	StartTn(1);
	StartTn(0)
	while(1);
}
感觉时钟输出功能就是把本来应该在中断中翻转引脚的功能,拿到MCU内部由片上系统实现了,所以输出的时钟频率被减半了。(2次时钟中断正好完成一个波形周期)
鉴于示波器比较简陋,就不上图了

2011-05-25 15:58:00 lonelyboy34 阅读数 7767
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4004 人正在学习 去看看 朱有鹏

     单片机的控制器的定时功能是由时钟和定时电路完成的,它是产生CPU的操作时序。

     XTAL1是芯片内部振荡电路输入端,XTAL2为芯片内部振荡电路输出端    

   

     具体的产生有以下两种方式:

     一:内部方式

     则是利用芯片内反相器和电阻组成的振荡电路,,在XTAL1和XTAL2引脚上接定时元件,如压电晶体和电容组成的并联谐振电路,则内部可产生与外加晶体同频率的振荡时钟。一般晶体可以在1.2MHZ到12MHZ之间任意选择,电容一般选择在5pf到30pf,对时钟频率有微调作用。

    二:外部时钟方式

    如果采用外部时钟方式,此时要把XTAL1接到外部始终提供电路,XTAL2接地。这种情况一般是当整个单片机系统已经有时钟源或则在多机系统中取得时钟上的同步。

 

   注:

  1:系统时钟是CPU时钟,RCT(Real—Time—Clock)是实时时钟。

  2:系统时钟的目的是高速稳定,而实时时钟目的是低功耗精确。

   

2016-01-25 11:45:38 baidu_33836580 阅读数 5785
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4004 人正在学习 去看看 朱有鹏

//编写51单片机程序,输出方波。
//要求:晶振为12MHz,用T0做定时器,在P1的低四位输出四种频率的方波:

//    P1.3 = 1.25kHz、P1.2 = 2.5kHz、P1.1 = 5kHz、P1.0 = 10kHz

//另外,上述四个频率要求用一个四选一数据选择器,再选出其中的一个输出出去。
//P1.6、P1.7的输出用来控制四选一数据选择器的选择位,它们由P3.0按键控制。
//悬赏分:10 - 解决时间:2009-12-5 10:45
//===================================================
//最佳答案:
//本题目早在一年前就回答完毕,现在增加了PROTEUS仿真图片发上博客。
//题目要求在相邻四条接口线输出的四种频率,恰有二倍的关系,这就可以利用一个定时中断来完成。
//题目还要求使用一个数据选择器,通过按键选择一个频率来输出。
//利用PROTEUS仿真的截图如下所示。
//图中在输出端接上了一个频率计和一个扬声器,进行频率检测。
//当按下按键时,输出频率可以轮番转换。
//图中把四种频率的检测结果都截图显示,可以看出,输出的频率十分理想。
//PC的扬声器也能听到声音,10kHz的频率,比较刺耳。

用51单片机做信号发生器,同时输出四种频率的方波 - 非著名博主 - 电子信息角落

//图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/03216a24c6d5082d36a80f77.html#

//以下程序已经仿真成功。
//---------------------------------------------------
#include <reg52.h>
#define uchar unsigned char
#define TL_0SET (256 - 50)   //定时时间选为50us
                             //输出的方波周期将为100us, 10kHz
sbit P3_2 = P3^2;            //用于按键
sbit P1_0 = P1^0;            //四个频率输出
sbit P1_1 = P1^1;            //
sbit P1_2 = P1^2;            //
sbit P1_3 = P1^3;            //
sbit P1_6 = P1^6;            //两个选择控制输出
sbit P1_7 = P1^7;            //

bdata uchar x = 0;
sbit p16 = x^0;
sbit p17 = x^1;

uchar i, j;
//---------------------------------------------------
void e0int() interrupt 0 //外部中断0作开关,控制四选一数据选择器
{
    while(P3_2 == 0) {;}      //等待按键释放
    x++;
    if(x == 4) x = 0;         //改变当前输出的选择
    P1_7 = p16;
    P1_6 = p17;
}
//---------------------------------------------------
void time0() interrupt 1      //T0的中断服务程序
{                             //T0工作在方式2,自动装入初始值
    i++;
    j = i % 16;               //取i的低四位
    j += x << 6;              //组合上数据选择器的控制信号
    P1 = j;                   //输出四种频率的方波以及控制信号
}
//---------------------------------------------------
void main()
{
    TMOD = 0x02;              //T0定时方式2
    TH0 = TL_0SET;            //自装入式的定时初始值
    TR0 = 1;                  //启动T0
    ET0 = 1;
    IT0 = 1;                  //外部中断0由下降沿触发
    EX0 = 1;                  //外部中断0允许
    EA = 1;
    while(1) {;}
}
//---------------------------------------------------
//回答者: 做而论道     回答时间:2009-12-2 08:46
//提问者对于答案的评价:我真的很感谢您,希望以后有机会还能得到您的指导
//原题网址:http://zhidao.baidu.com/question/127702122.html?si=1
//===================================================

2009-03-27 16:08:00 zl385753772 阅读数 1495
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4004 人正在学习 去看看 朱有鹏

 

单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行校时、定时等功能。输出设备显示器可以用液晶显示技术和数码管来显示技术。
   
本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89C51为核心元件同时采用LED数码管显示器动态显示的现代计时装置。与传统机械表相比,它具有走时精确,显示直观等特点。另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。

 

关键词:数字钟系统; 单片机; LED液晶显示器

 

 

Digital clock system


                              Abstract


SCM in multi-function digital clock in the application is already very common, people on the digital clock function and are very familiar with the work order. But very few know that its internal structure and working principles. SCM as a digital clock from the core controller, it can achieve the clock signal timing, its time data by the MCU output, use of monitors displayed. Keyboard can be carried out at the school, timing, and other functions. Output devices can be used liquid crystal display monitors and digital technology to display the technology.
     The system uses MCU with time, the school features such as the digital clock, SCM AT89C51 is also used as the core components of the LED digital display dynamic display "when" and "points" and "seconds" of the modern time device . Compared with the traditional mechanical watches, it has a precise path that intuitive, and other characteristics. In addition a school function, stopwatch function, and the timer function to achieve MCU use of the digital clock with programming flexibility to facilitate the expansion of functional advantages.

Key words: digital clock system; SCM; LED LCD Monitor

 

目录

 

设计任务书………………………………………………………………………….………I

摘要…………………………………………………………………………………….……III

ABSTRACT…………………………………………………………………………….……IV

1.       系统方案…………………………………………………………………………….…..I

            系统概述设计任务书……………………………………………………….……………I

摘要……………………………………………………………………………….…….……III

ABSTRACT…………………………………………………………………………………..IV

1.       系统方案………………………………………………………………………….………1

1.1 系统概述………………………………………………………………….…………1

1.2 方案论证…………………………………………………………………………….1

1.3 扩展功能…………………………………………………………………………….2

 

2.       设计过程………………………………………………………………………………….2

2.1 设计原理………………………………………………………………………… …2

2.2 所需元器件……………………………………………………………………….…2

 

3. 电路与程序………………………………………………………………………….…….2

3.1 电路设计……………………………………………………………………………2

3.2 程序设计……………………………………………………………………………3

3.2.1 程序流程图………………………………………………………………….3

3.2.2 主要程序分析……………………………………………………………….7

         参考文献……………………………………………………………………………6

 

4. 总结体会…………………………………………………………………………………..16

 

 

 

              

 

 

 

 

 

 

 

 

 

 

 

 

1、系统方案

1.1 系统概述

本系统可模拟电子时钟,实现时钟,秒表,倒计时定时器功能,主从CPU数据处理、键盘控制与数据显示。主控系统能响应按键,并对其进行相应的处理,再把其对应的结果数据在数码管LED上显示。

具体设计基本任务是:

1.用LED数码管显示时间,且能显示时、分、秒的24小时制的数字钟。

2.具有校时功能,具体方法:设置三个按钮,其中两个按钮分别对“时”、“分”进行校时,另一个按钮则实现对“秒”位清零

 

系统结构框图如图1.1所示:

 

CPU主机

键盘控制数码管显示

数码管显示

开关控制数码管显示形式

                             1.1数字钟系统结构框图

1.2 方案论证

方案一

1.计数部分采用异步2-5-10进制计数器7490,显示部分参考实验七。

1.计时用的“秒”脉冲信号可用实验板中提供的800Hz分频产生。800Hz信号同时作为动态扫描显示电路的时钟信号。

2.时、分校时控制,当校时按钮按下时,可对时、分计数器CP端输入秒脉冲来加速计数速度来达到校时目的。

 

方案二

    1.用单片机定时器中断原理实现数码管动态10ms循环扫描,同时完成计数功能,并经过多次中断产生“秒”信号。

    2.可控制按键实现时,分,秒加一,减一功能。

 

    考虑到设计硬件简单原则,利用单片机实现的数字时钟具有编程灵活,便于功能的

扩充等优点,故本设计采用方案二。

 

1.3扩展功能

1.实现秒表功能。

   2.可以用于倒计时定时。

   3.可以时分秒清零。

2.设计过程

1.原理

   本设计主要应用了单片机原理,利用单片机的I/O口,由键盘控制I/O口,进行单片机相应的程序处理,再用I/O口控制数码管的显示。利用开关来控制开启,暂停计时,并切换时钟,秒表,倒计时定时器功能。

2.所需元器件

    六位一体数码管,89C51单片机,7407芯片,12M晶振,按键若干,开关若干,电阻若干,电容若干,导线

3.电路与程序设计

3.1 电路设计:

3.1总体电路图

 

本系统的设计电路如图3.1所示,左边按键控制时分秒加一减一操作,右边开关切换数码管显示时钟,秒表,倒计时定时器等功能。单片机下方按键有复位功能:当在时钟方式时,此按键有清零作用;当在倒计时定时器方式时,此按键按下,时分秒均付为最大值。右上角是六位一体的数码管LED,用于显示。数码管左边的上拉电阻具有自动拉高P0I/O口的功能。数码管下方的7407芯片有限流作用,用于防止数码管电流过大而烧毁。

3.2 程序设计

3.2.1 程序流程图

3-2-1为主程序流程图,图3-2-2为定时器0程序流程图,图3-2-3为定时器1程序流程图。

是否有按键

拆分,即吧两位数放到数码管上

跳到按键子程序

While

死循环

初始化程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3-2-1主程序流程图

 

 

此为主程序流程图,初始化后,就一直在while里循环,并把秒,分,时分别拆成各位和十位两个数,放到相应的数码管上显示,并检测是否有按键按下,和定时器T0T1溢出,来执行相应的键盘子程序和定时器01的中断程序。

 

重新初始化T0

t++t0++

秒分时计算,ss=60,则ss=0mm++。分,时同理计算

t0是否为2

t0=0

数码管循环显示一位

显示相应数码管的数值

第三个开关是否按下

j=10

j=610

t是否为j

t=0

开关2是否按下

秒加一

开关一是否按下

开定时器1,关定时器0

开定时器0,关定时器1

进入主程序

 

                   图3-2-2定时器0程序流程图

 

此为定时器0流程图,在主程序检测到T0溢出时执行该子程序,该中断主要执行数码管循环显示数字,并检测到一秒后秒加一的功能。

 

 

重新初始化T1

t++t0++

秒分时计算,ss= -1,则ss=59mm减一。分,时同理计算

t0是否为2

t0=0

数码管循环显示一位

显示相应数码管的数值

t是否为j

t=0

开关2是否按下

秒减一

开关一是否按下

开定时器1,关定时器0

开定时器0,关定时器1

进入主程序

j=610

 

图3-2-3定时器1程序流程图

 

此为定时器1流程图,在主程序检测到T1溢出时执行该子程序,该中断程序主要执行数码管循环显示数字,并检测到一秒后秒减一的功能。

 

 

 

 

 

 

参考文献

[1] 康华光,邹寿彬,秦臻. 电子技术基础——数字部分. 北京——高等教育出版社,2006. 1

 

[2] 张毅刚,彭喜元,董继成. 单片机原理及应用. 高等教育出版社,2003.12

 

[3] 刘鲲,刘春亮,黄焱. 单片机C语言入门. 人民邮电出版社,20084月第1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2.2源程序

1. 开始函数的定义:

#include<reg51.h>

#define uchar unsigned char     //宏定义

#define uint unsigned int       //宏定义

#include <intrins.h>            //循环左移函数库

void jian_pan();                //键盘子函数

 

char code duan_ma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};   //时钟显示数组

 

int ss,mm,hh,s_shi,s_ge,m_shi,m_ge,h_shi,h_ge,t,t0,zy,j,ds;          //zy 为左移的意思

 

sbit p32=P3^2;

sbit p31=P3^1;

sbit p30=P3^0;

sbit p37=P3^7;

 

2.主程序

 

void main()

{       ds=1;       //定时器初始化

        P2=0xfe;                       //数码管位初始化

        P0=0x3f;                       //如果时时钟,断码初始置0

        P1=0xff;                       //键盘初始

        t=0;                           //1S时,t=700

        t0=0;                          //数码管动态显示一次,t0=210ms左右

    TH0=(65536-10001)/256;

    TL0=(65536-10001)%256;

        TH1=(65536-10001)/256;

    TL1=(65536-10001)%256;

        EA=1;

        ET1=0;                         //开定时器0

        TR1=0;                         //定时器开始工作

        ET0=1;

        TR0=1;

        while(1)

        {

            if (P1!=0xff)      //判断是否有键,有键就执行jian_pan子程序

                  jian_pan();

              s_shi=ss/10;     //拆分

              s_ge=ss%10;

              m_shi=mm/10;

              m_ge=mm%10;

              h_shi=hh/10;

              h_ge=hh%10;

        }

}

3.定时器0中断程序:

void timer0() interrupt 1

{

         if(p32==1)

                 j=610;

         else

                 j=10;

 

    TH0=(65536-10001)/256;       //重新初始化T0

    TL0=(65536-10001)%256;

    t++;

        t0++;

        if(P2==0xdf)                 //如果数码管显示到第6个下一个显示第1个数码管      1101 1111 -> 0111 1111 -> 1111 1110

               P2=0x7f;

//秒分时计算

        if(ss==60)                   //ss60ss=0,同时mm+1

             {

               ss=00;

               mm++;

             }

        if(mm==60)                   //mm60mm=0,同时hh+1

             {

               mm=00;

               hh++;

             }

        if(hh==24)                   //hh24hh=0

               hh=00;

//数码管动态显示,t=0~2时左移一位,并显示那一位相应的值

        if(t0==2)

               {

                   t0=0;

                  //P2循环左移一位

                   zy=P2;

                   zy=_crol_(zy,1);

                   P2=zy;

                  //相应数码管显示相应的数值

                   if(P2==0xfe)

                       P0=duan_ma[s_ge];

                   if(P2==0xfd)

                       P0=duan_ma[s_shi];

                  if(P2==0xfb)

                       P0=duan_ma[m_ge+10];

                   if(P2==0xf7)

                       P0=duan_ma[m_shi];

                   if(P2==0xef)

                       P0=duan_ma[h_ge+10];

                   if(P2==0xdf)

                       P0=duan_ma[h_shi];

              }

                    if (t==j)

                     {

                       t=0;

                       if (p31==1)

                            ss++;

                     }

                    if(t>611)

                        t=0;

        if(p30==0)             //转到timer1上去

               {

                ET0=0;

                TR0=0;

                ET1=1;

                TR1=1;

                t=0;

                }

}

4.定时器1中断程序:

 void timer1() interrupt 3

{       j=610;

                    if(ds==1)

                    mm=59;

                    if(ds==0)

                        ds=0;

                    else

                        ds--;

        TH1=(65536-10001)/256;       //重新初始化T1

    TL1=(65536-10001)%256;

    t++;

        t0++;

        if(P2==0xdf)                 //如果数码管显示到第6个下一个显示第1个数码管      1101 1111 -> 0111 1111 -> 1111 1110

               P2=0x7f;

//秒分时计算

        if(ss==-1)                   //ss60ss=0,同时mm+1

             {

               ss=59;

               mm--;

             }

        if(mm==-1)                   //mm60mm=0,同时hh+1

             {

               mm=59;

               hh--;

             }

//数码管动态显示,t=0~2时左移一位,并显示那一位相应的值

        if(t0==2)

               {

                   t0=0;

                  //P2循环左移一位

                   zy=P2;

                   zy=_crol_(zy,1);

                   P2=zy;

                  //相应数码管显示相应的数值

                   if(P2==0xfe)

                       P0=duan_ma[s_ge];

                   if(P2==0xfd)

                       P0=duan_ma[s_shi];

                   if(P2==0xfb)

                       P0=duan_ma[m_ge+10];

                   if(P2==0xf7)

                       P0=duan_ma[m_shi];

                   if(P2==0xef)

                       P0=duan_ma[h_ge+10];

                   if(P2==0xdf)

                       P0=duan_ma[h_shi];

              }

                    if (t==j)

                     {

                       t=0;

                       if (p31==1)

                        {

                            if((ss||hh||mm)!=0)

                                     ss--;

                        }

                     }

                    if(t>611)

                        t=0;

               if(p30==1)             //转到timer1上去

               {

                ET1=0;

                TR1=0;

                ET0=1;

                TR0=1;

                t=0;

                }

}

5.键盘子程序:

void jian_pan()

{

        uint temp;

        temp=P1;

        switch(temp)

        {

                 case 0xfe:                   //秒个位加1

                  {

                      while(P1!=0xff)

                        {

                        }

                      if(ss==59)

                          ss=00;

                      else

                          ss++;

                  }

                 break;

                 case 0xfd:                   //秒个位减1

                  {

                      while(P1!=0xff)

                       {

                       }

                       if(ss==00)

                           ss=59;

                        else

                           ss--;

                  }

                 break;

                 case 0xfb:                   //分个位加1

                  {

                      while(P1!=0xff)

                        {

                        }

                      if(mm==59)

                          mm=00;

                      else

                          mm++;

                  }

                 break;

                 case 0xf7:                   //分个位减1

                  {

                      while(P1!=0xff)

                       {

                       }

                       if(mm==00)

                           mm=59;

                        else

                           mm--;

                  }

                 break;

                 case 0xef:                   //时个位加1

                  {

                      while(P1!=0xff)

                        {

                        }

                      if(hh==23)

                          hh=00;

                      else

                          hh++;

                  }

                 break;

                 case 0xdf:                   //时个位减1

                  {

                      while(P1!=0xff)

                       {

                       }

                      if(hh==00)

                          hh=23;

                      else

                          hh--;

                  }

                  break;

                  case 0xbf:

                  {

                      ss=0;

                  }

                  break;

                  case 0x7f:

                  {

                      while(P1!=0xff)

                       {

                       }

                      if(p30==1)

                      {hh=0;mm=0;ss=0;}

                      else

                      {hh=23;mm=59;ss=59;}

                  }

                  break;

        }

}

时钟
2019-11-16 00:31:30 Joker_clown123 阅读数 5
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4004 人正在学习 去看看 朱有鹏

(第2次书写,不对请指正,谢谢)
HSE:
高速外部振荡器,晶体/阻谐振器、负载电容器(其值根据HSE调整)尽可能靠近振荡器引脚 置“1”时释放
外部时钟源(HSE旁路) 时钟控制寄存器 信号-SOC-IN OSC-OUT悬空
HSI:
8MHz RC产生 做系统时钟或2分频后PLL输入
相对HSE优点为启动时间短 置“1”,输出时钟释放
系统复位1 HSIAL[7:0]位复位“1”
若HSE失效,HSI作为备用时钟源
PLL:
PLL: 锁相回路或锁相环 统一整合时钟信号 实现稳定且高频的时钟信号

STM8 时钟源切换

阅读数 3074

单片机引脚

阅读数 18

没有更多推荐了,返回首页