STC12C5A60S2制作呼吸灯C语言程序怎么写

STC12C5A60S2制作呼吸灯C语言程序怎么写,第1张

呼吸灯的程序

/**************************************************************************** 

       功能:LED灯慢慢变暗,再慢慢变亮。

                  用定时器模拟的PWM调制。

单片机:AT89S52                                                   

******************************************************************************/ 

#include <reg52.h> 

#define V_TH0  0XFF              //设定定时器0,高8位的初值              

#define V_TL0  0XF6              //设定定时器0,低8位的初值            

#define V_TMOD 0X01              //设定定时器0的工作方式为:方式1(计数位数是16位                                  //,由TL0作为低8位、TH0作为高8位)

#define uchar unsigned char 

#define uint unsigned int                

void init_sys()                         //系统初始化函数

void delay(uint)                        //延时函数

unsigned char ZKB                       //占空比

void main (void) 

   init_sys()                            //初始化

   while(1)

   {  

      for(ZKB=5ZKB<40ZKB=ZKB+2)         //每调节一次占空比,就延时大概8ms左右,这使得LED现象更明显

           {

                    delay(8) 

            }

      for(ZKB=40ZKB>5ZKB=ZKB-2)

           {

                delay(8) 

           }

    

   } 

}

void delay(uint z)

{

 uint x,y

 for(x=zx>0x--)

  for(y=100y>0y--) 

}

void init_sys()            /*系统初始化函数*/ 

  /*定时器初始化*/ 

  TMOD=V_TMOD         

  TH0=V_TH0 

  TL0=V_TL0 

  TR0=1 

  ET0=1 

  EA=1 

}

void timer0(void) interrupt 1 using 2              

 static uchar click=0    //中断次数计数器变量

 TH0=V_TH0               //重新恢复定时器初始值

 TL0=V_TL0 

 ++click                       //每计数10次,产生一个中断,并且click增加一个

 if (click>=100)

         click=0              //计满一百次,这重新计数。

                                         /*因为计一次数的时间是1us,10次产生一个中断,也就是一个中断10us。100个中断为1ms。

                                    则,可以在这100个数中随便取值,用于表示占空比的多少,占空比的范围为(1~100)*/

 

 if (click<=ZKB)          //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整 

   P1=0x00                      //P1口接的是LED灯

 else 

   P1=0xff

}

 

此程序的总中断时间为100ms,即频率为:100KHZ,占空比从5 变为40(即5%~25%)。

///////////spi.h/////////////////////////////

#ifndef

SPI_H

#define

SPI_H

#include

<stc12le5a60s2.h>

#include

<spi.h>

//sfr

P4

=

0xe8

//STC12LE5A60S2单片机自带SPI控制器连接

//sbit

VCC1

=

P2^0//

VCC1

NO

USE

//sbit

SON

=

P1^6

//

MISO

//sbit

SIN

=

P1^5

//

MOSI

//sbit

SCKN

=

P1^7

//

SCK

sbit

CSN

=

P1^4

//

28J60

--

CS

//sbit

RSTN

=

P3^5

//RST,

no

use

//sbit

INTN

=

P3^3

//

INT,

no

use

void

init_spi(void)

void

WriteByte(u8_t

temp)

u8_t

ReadByte(void)

#endif

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

///////////////////////////spi.c/////////////////////////////

#include<spi.h>

//STC12LE5A60S2单片机自带SPI控制器连接

void

init_spi(void)

{

//SSIG

=

1

//忽略SS脚

//SPEN

=

1

//允许SPI工作

//DORD

=

0

//先传高位MSB

//MSTR

=

1

//设置单片机为主机

SPCTL

=

0xD0

//SPI

Control

Register

SSIG

SPEN

DORD

MSTR

CPOL

CPHA

SPR1

SPR0

0000,0100

SPSTAT

=

0xC0

//

//IE2

|=

0x02

//允许SPI中断控制位

}

void

WriteByte(u8_t

temp)

{

SPDAT

=

temp

while(!(SPSTAT

&

0x80))

SPSTAT

=

0xC0

}

u8_t

ReadByte(void)

{

idata

u8_t

temp

//SPSTAT

=

0xC0

SPDAT

=

0x00

while(!(SPSTAT

&

0x80))

temp

=

SPDAT

SPSTAT

=

0xC0

return

temp

}

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

STC12C5A60S2与AT89S52的程序是否可以通用,取决于你用了哪些外设,如果是两者公用的外设,几乎不加修改程序就可以通用。你给的程序不可能转换成AT89S52的,因为后者没有ADC这个外设。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10999957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存