#include <reg51.h>
sbit a=P1^3;
sbit b=P1^4;
sbit c=P1^5;
char fla;
#define SDA_HIGH SDA=1
#define SDA_LOW SDA=0
#define SCL_LOW SCL=0 //SCL=1
#define SCL_HIGH SCL=1
uint8 C_Loop=0;
uint8 MoudleAmount=2;
void delay_ms(unsigned int ms)
{
volatile unsigned int i=0;
for(i=0;i<ms;i++);
}
/************ generation clock *********************/ void ClkProduce(void)
{
SCL_LOW; // SCL=0
delay_ms(20);
SCL_HIGH; // SCL=1
delay_ms(20);
}
/********** send 32 zero ********************/ void Send32Zero(void)
{
unsigned char i;
SDA_LOW; // SDA=0
for (i=0; i<32; i++)
{
ClkProduce();
}
}
/********* invert the grey value of the first two bits ***************/ uint8 TakeAntiCode(uint8 dat) { uint8 tmp = 0; tmp=((~dat) & 0xC0)>>6; return tmp; } /****** send gray data *********/ void DatSend(uint32 dx) { uint8 i; for (i=0; i<32; i++) { if ((dx & 0x80000000) != 0) { SDA_HIGH; // SDA=1; } else { SDA_LOW; // SDA=0; } dx <<= 1; ClkProduce(); } } /******* data processing ********************/ void DataDealWithAndSend(uint8 r, uint8 g, uint8 b) { uint32 dx = 0; dx |= (uint32)0x03 << 30; // The front of the two bits 1 is flag bits dx |= (uint32)TakeAntiCode(b) << 28;
dx |= (uint32)TakeAntiCode(g) << 26;
dx |= (uint32)TakeAntiCode(r) << 24;
dx |= (uint32)b << 16;
dx |= (uint32)g << 8;
dx |= r;
DatSend(dx);
}
void RED()
{
Send32Zero();
DataDealWithAndSend(100,0,0); // display red
// DataDealWithAndSend(1,100,0);
Send32Zero();
delay_ms(60000); // four delay_ms() about 1s delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void PINK()
{
Send32Zero();
DataDealWithAndSend(205,5,0); // display green
// DataDealWithAndSend(0,100,0);
Send32Zero();
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void YELLOW()
{
Send32Zero();
// for(j=0;j<MoudleAmount;j++)
// {
DataDealWithAndSend(255,0,30); // display blue // }
Send32Zero();
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void GREEN()
{
Send32Zero();
// // // } // // //
for(j=0;j<MoudleAmount;j++) { DataDealWithAndSend(0,0,100); // display white } Send32Zero(); delay_ms(60000); delay_ms(60000); delay_ms(60000); delay_ms(60000); void CYAN() { Send32Zero(); DataDealWithAndSend(30,160,100); // display green DataDealWithAndSend(0,100,0); Send32Zero(); delay_ms(60000); delay_ms(60000); delay_ms(60000); delay_ms(60000); } void BLUE() { Send32Zero(); DataDealWithAndSend(0,100,0); // display green DataDealWithAndSend(0,100,0); Send32Zero(); delay_ms(60000); delay_ms(60000); delay_ms(60000); delay_ms(60000); } void WHILE() { Send32Zero(); DataDealWithAndSend(255,225,255); // display green DataDealWithAndSend(0,100,0); Send32Zero(); delay_ms(60000); delay_ms(60000); delay_ms(60000); delay_ms(60000); } void COLORFUL()
{
Send32Zero();
DataDealWithAndSend(205,15,30); // display green // DataDealWithAndSend(0,100,0);
Send32Zero();
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void OFF()
{
Send32Zero();
DataDealWithAndSend(0,0,0); // display green // DataDealWithAndSend(0,100,0);
Send32Zero();
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void RGB_LED(uint8 Color_R,uint8 Color_G,uint8 Color_B) {
char i,j;
for(i=0;i<33;i++)
{
Send32Zero();
DataDealWithAndSend(Color_R,Color_B,0); //The Color_B Color_G is between 0 and 255.
DataDealWithAndSend(0,Color_B,Color_G); Send32Zero();
if(C_Loop==0)
{
Color_R+=20; if(Color_R>=(R_MAX-15))
{
C_Loop++;
Color_R=155;
} value of Color_R
} if(C_Loop==1) { Color_G+=20; if(Color_G>=(G_MAX-15)) { Color_G=155; C_Loop++; } } if(C_Loop==2) { } Color_B+=20; if(Color_B>=(B_MAX-15)) { C_Loop++; Color_B=155; } if(C_Loop==3) { C_Loop%=3; Color_R=0; Color_G=0; Color_B=0; } delay_ms(60000); delay_ms(60000); delay_ms(60000); delay_ms(60000); } Color_R=0; Color_G=0;
Color_B=0;
C_Loop=0;
Send32Zero();
for(j=0;j<MoudleAmount;j++)
{
DataDealWithAndSend(0,0,0); // display off
}
Send32Zero();
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
}
void delay(int ms)
{
char t,j,z;
while(ms--);
for(t=0;t<=120;t++);
for(j=0;j<=120;j++);
for(z=0;z<=120;z++);
}
main()
{
// unsigned char i;
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率 EA=1;
ES = 1; //允许串口中断
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
//IT0=1;
// EX0=1;
while(1)
{
if (fla==12) { RED();delay(10000);OFF(); RED();delay(10000);OFF(); RED();delay(10000);OFF(); RED();delay(500);OFF();RED();delay(500);OFF();RED();delay(500);OFF();
}
};
}
void io()interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
fla = SBUF;
switch(fla)
{
case 1: RED(); break;
case 2: PINK(); break;
case 3: GREEN(); break;
case 4: CYAN(); break;
case 5: BLUE(); break;
case 6: WHILE(); break;
case 7: COLORFUL(); break;
//case 8: break; //接受到5,第八个LED亮
default: WHILE(); break;
}
ES = 1; //允许串口中断
}
第二篇:51单片机调试过程
一、Keil运行过程
1、新建工程文件,选Atmel公司的AT89C52单片机;
2、新建文件file,new,保存(***.c)--后缀.C很重要;
3、右击“Target”选”options for target…”(下图)在OutPut中选中CreatHex;
二、Hex程序文件下载至单片机
1、 打开“驱动精灵”软件,插上单片机,安装驱动(USB2.0)。
2、 右击我的电脑—管理—设备管理器—看串口(一般是COM3或者COM5)
3、 打开下载程序软件;
4、 软件设置;
注意事项:MCU选择STC89C52,COM选择相应串口,打开文件,在单片机关闭情况下点download,提示上电时候再给单片机上电。