|
基于51单片机的8通道舞台电脑灯控台硬件进行研究。系统采用AT89C51单片机作为控制器,
用ADC0809作为主要芯片设计A/D转换电路,并利用差分收发芯片75176BP进行通信口设计。
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#define CYCLE 0x1000L //定义PWM周期(最大值为32767)
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR (*(unsigned char volatile xdata *)0xff54)
sfr P_SW2 = 0xba;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr PWMCFG = 0xf1;
sfr PWMCR = 0xf5;
sfr PWMIF = 0xf6;
sfr PWMFDCR = 0xf7;
sbit PWM2 = P3^7;
sbit PWM3 = P2^1;
sbit PWM4 = P2^2;
sbit PWM5 = P2^3;
sbit PWM6 = P0^7;
sbit PWM7 = P0^6;
void PWM_config(void);
void PWM2_SetPwmWide(unsigned short Wide);
void PWM3_SetPwmWide(unsigned short Wide);
void PWM4_SetPwmWide(unsigned short Wide);
void PWM5_SetPwmWide(unsigned short Wide);
void PWM6_SetPwmWide(unsigned short Wide);
void PWM7_SetPwmWide(unsigned short Wide);
void main()
{
PWM_config();
PWM2_SetPwmWide(0); //输出全低电平
PWM3_SetPwmWide(1); //输出1/2550高电平
PWM4_SetPwmWide(CYCLE); //输出全高电平
PWM5_SetPwmWide(CYCLE-1); //输出2549/2550低电平
PWM6_SetPwmWide(CYCLE/2); //输出1/2高电平
PWM7_SetPwmWide(CYCLE/3); //输出1/3高电平
while (1);
}
void PWM_config(void)
{
P0M0 &= ~0xc0;
P0M1 &= ~0xc0;
P0 &= ~0xc0; //设置P0.6/.P0.7电平
P2M0 &= ~0x0e;
P2M1 &= ~0x0e;
P2 &= ~0x0e; //设置P2.1/P2.2/P2.3电平
P3M0 &= ~0x80;
P3M1 &= ~0x80;
P3 &= ~0x80; //设置P3.7电平
P_SW2 |= 0x80;
PWMCKS = 0x00;
PWMC = CYCLE; //设置PWM周期
PWM2T1 = 1;
PWM2T2 = 0;
PWM2CR = 0x00; //PWM2输出到P3.7
PWM3T1 = 1;
PWM3T2 = 0;
PWM3CR = 0x00; //PWM3输出到P2.1
PWM4T1 = 1;
PWM4T2 = 0;
PWM4CR = 0x00; //PWM4输出到P2.2
PWM5T1 = 1;
PWM5T2 = 0;
PWM5CR = 0x00; //PWM5输出到P2.3
PWM6T1 = 1;
PWM6T2 = 0;
PWM6CR = 0x08; //PWM6输出到P0.7
PWM7T1 = 1;
PWM7T2 = 0;
PWM7CR = 0x08; //PWM7输出到P0.6
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR = 0x3f; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
P_SW2 &= ~0x80;
}
void PWM2_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x01;
PWM2 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x01;
PWM2 = 1;
}
else
{
P_SW2 |= 0x80;
PWM2T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x01;
}
}
void PWM3_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x02;
PWM3 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x02;
PWM3 = 1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x02;
}
}
void PWM4_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x04;
PWM4 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x04;
PWM4 = 1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x04;
}
}
void PWM5_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x08;
PWM5 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x08;
PWM5 = 1;
}
else
{
P_SW2 |= 0x80;
PWM5T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x08;
}
}
void PWM6_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x10;
PWM6 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x10;
PWM6 = 1;
}
else
{
P_SW2 |= 0x80;
PWM6T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x10;
}
}
void PWM7_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x20;
PWM7 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x20;
PWM7 = 1;
}
else
{
P_SW2 |= 0x80;
PWM7T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x20;
}
}
|
评分
-
查看全部评分
|