/****************************************************************************
功能: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这个外设。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)