这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » goodboy3021 MCU DIY进程帖

共53条 3/6 1 2 3 4 5 6 跳转至
院士
2011-12-07 08:08:52     打赏
21楼
赞一个!!
没看到 我要挑好照片,经典点的,毛遂自荐了~~~帖子吧?

助工
2011-12-07 08:20:31     打赏
22楼
双色的时24 个引脚

助工
2011-12-07 08:21:45     打赏
23楼
这真的让人蛋疼

专家
2011-12-07 08:49:09     打赏
24楼
看到啦!顶楼的照片有点眼熟,拍得不好,不好意思自荐。。。

专家
2011-12-07 21:21:02     打赏
25楼

通过开发板上的4 x1 key的S3和S4来控制继电器的吸合与断开,并控开发板的LED12亮与灭:



简单程序:
#include<STC12C5A60S2.H> //头文件
sbit S3 = P3 ^2;
sbit S4 = P3 ^3;
sbit RL1 = P3 ^7;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/


/*********************************************************************************************/
void main (void){ //主程序

 while(1){
      if (S3 == 0)
      {
      DELAY_MS (300);//消抖
      RL1 = 1;
      }
      if (S4 == 0)
      {
      DELAY_MS (300);
      RL1 = 0;
      }
 } 
}
/*********************************************************************************************/


专家
2011-12-11 09:31:14     打赏
26楼

4x4键盘实验,LED 数码管显示:


原程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>

bit flag;
unsigned char leddisplay[] ={0};
sbit speaker = P1^0;
sbit led = P1^3;
#define   KEY   P3 //数据总线
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/
/**********************************************************

蜂鸣器驱动子函数

**********************************************************/
void beep(void)
{
    speaker = 1;  
 DELAY_MS(20);
 speaker = 0;
 DELAY_MS(20);
}

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

 键盘扫描子函数

**********************************************************/
keyscan()
{
unsigned char a,b,c;
   KEY = 0x0F;             
   if(KEY!= 0x0F)
   {
       DELAY_MS(125);
    if(KEY!= 0x0F)
     {
     a = KEY;    
     }
    KEY = 0xF0;    
    c =  KEY;
    a = a|c;
         switch(a){
    case  0xee: b = 0x39;beep();flag=1;break;   //C
    case  0xed: b = 0x5E;beep();flag=1;break;  //D
    case  0xeb: b = 0x79;beep();flag=1;break;  //E
    case  0xe7: b = 0x71;beep();flag=1;break;  //F
    case  0xde: b = 0x6F;beep();flag=1;break;  //9
    case  0xdd: b = 0x3F;beep();flag=1;break;  //0
    case  0xdb: b = 0x77;beep();flag=1;break;  //A
    case  0xd7: b = 0x7C;beep();flag=1;break;  //B
    case  0xbe: b = 0x6D;beep();flag=1;break;  //5
    case  0xbd: b = 0x7D;beep();flag=1;break;  //6
    case  0xbb: b = 0x07;beep();flag=1;break;  //7
    case  0xb7: b = 0x7F;beep();flag=1;break;  //8
    case  0x7e: b = 0x06;beep();flag=1;break;  //1
    case  0x7d: b = 0x5B;beep();flag=1;break;   //2
    case  0x7b: b = 0x4f;beep();flag=1;break;  //3
    case  0x77: b = 0x66;beep();flag=1;break;  //4
                        default:flag=0;break;   //
   
   }
   DELAY_MS(125); 
  }
 return(b);
}
    
/**********************************************************

LED驱动子函数

**********************************************************/
void led_display(void)
{
unsigned char i;
 for(i=0;i<8;i++)
 { 
 P0 = leddisplay[i];
 P2 = i;
 DELAY_MS(2); 
   }
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   

int main (void)
{
    unsigned char b,i,l=0;
 speaker = 0;
 P0 = 0x00;
    while(1)
 {
     b = keyscan();
  if(flag)
     {
  
     leddisplay[l] = b;
   l=l+1;
   if(l>8)
     {
      leddisplay[8] = b;
      for(i=0;i<8;i++)
        {
        leddisplay[i]= leddisplay[i+1];
     }
      }
      flag=0;

       }
  led_display();    
 }
}


助工
2011-12-11 10:45:05     打赏
27楼
加油哦

专家
2011-12-11 15:09:21     打赏
28楼
感谢楼上的鼓励!愿意与你共同学习!

专家
2011-12-11 15:11:50     打赏
29楼

AT24C02实验程序是参考STC官网的原程序,视频演示的内容为:
1、按S13键,并通过4x3键盘输入8位数(可以是数字,也可以是字母,但最右边四个键为功能键,限制输入,如果在输入过程中有误,需重新输入,则可按S16清除,然后重新输入。);
2、按S15键,将输入的8位数据存入AT24C02中;
3、按S14键,并通过4x3键盘输入8位数;
4、按S15键,如果第3步输入的数字与第1步输入的数字完全一样,则LED数码管显示“good”,并点亮开发板上的LED5,如果不完全一样,则LED数码管显示“Err”,并熄灭开发板上的LED5,可重新步骤3。


参考程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>
#include <INTRINS.H>
bit flag;
typedef unsigned char BYTE;
typedef unsigned short WORD;

sbit SCL = P1^1;                //AT24C04的时钟
sbit SDA = P1^2;                //AT24C04的数据

BYTE BUF[8];                   //数据缓存区

BYTE code WriteDATA[] ={0};
BYTE code  ReadDATA[] ={0};
unsigned char  leddisplay[8] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char gooddisplay[8] ={0x6F,0x5C,0x5C,0x5E,0x00,0x00,0x00,0x00};
unsigned char  errdisplay[8] ={0x79,0x50,0x50,0x00,0x00,0x00,0x00,0x00};
void Delay5us();
void Delay5ms();
void AT24C04_Start();
void AT24C04_Stop();
void AT24C04_SendACK(bit ack);
bit AT24C04_RecvACK();
void AT24C04_SendByte(BYTE dat);
BYTE AT24C04_RecvByte();
void AT24C04_ReadPage();
void AT24C04_WritePage();

sbit speaker = P1^0;
sbit led = P1^3;
#define   KEY   P3 //数据总线
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/
/**********************************************************

LED驱动子函数

**********************************************************/
void led_display(void)
{
unsigned char i;
 for(i=0;i<8;i++)
 { 
 P0 = leddisplay[i];
 P2 = i;
 DELAY_MS(2); 
   }
}
/**********************************************************

蜂鸣器驱动子函数

**********************************************************/
void beep(void)
{
    speaker = 1;  
 DELAY_MS(20);
 speaker = 0;
 DELAY_MS(20);
}

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

 键盘扫描子函数

**********************************************************/
keyscan()
{
unsigned char a,b,c;
   KEY = 0x0F;             
   if(KEY!= 0x0F)
   {
       DELAY_MS(125);
    if(KEY!= 0x0F)
     {
     a = KEY;    
     }
    KEY = 0xF0;    
    c =  KEY;
    a = a|c;
         switch(a){
    case  0xee: b = 0x39;beep();flag=1;break;   //C
    case  0xed: b = 0x5E;beep();flag=1;break;  //D
    case  0xeb: b = 0x79;beep();flag=1;break;  //E
    case  0xe7: b = 0x71;beep();flag=1;break;  //F
    case  0xde: b = 0x6F;beep();flag=1;break;  //9
    case  0xdd: b = 0x3F;beep();flag=1;break;  //0
    case  0xdb: b = 0x77;beep();flag=1;break;  //A
    case  0xd7: b = 0x7C;beep();flag=1;break;  //B
    case  0xbe: b = 0x6D;beep();flag=1;break;  //5
    case  0xbd: b = 0x7D;beep();flag=1;break;  //6
    case  0xbb: b = 0x07;beep();flag=1;break;  //7
    case  0xb7: b = 0x7F;beep();flag=1;break;  //8
    case  0x7e: b = 0x06;beep();flag=1;break;  //1
    case  0x7d: b = 0x5B;beep();flag=1;break;   //2
    case  0x7b: b = 0x4f;beep();flag=1;break;  //3
    case  0x77: b = 0x66;beep();flag=1;break;  //4
                        default:flag=0;break;   //
   
   }
   DELAY_MS(125); 
  }
 return(b);
}
    
/**********************************************************/

/**************************************
向AT24C04写1页(16字节)数据
将TESTDATA开始的16个测试数据写如设备的00~0F地址中
**************************************/
void AT24C04_WritePage()
{
    BYTE i;

    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
    AT24C04_SendByte(0x00);     //发送存储单元地址
    for (i=0; i<8; i++)
    {
        AT24C04_SendByte(leddisplay[i]);
    }
    AT24C04_Stop();             //停止信号
}

/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
void AT24C04_ReadPage()
{
    BYTE i;

    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
    AT24C04_SendByte(0x00);     //发送存储单元地址
    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa1);     //发送设备地址+读信号
    for (i=0; i<8; i++)
    {
        BUF[i] = AT24C04_RecvByte();
        if (i == 8)
        {
            AT24C04_SendACK(1); //最后一个数据需要会NAK
        }
        else
        {
            AT24C04_SendACK(0); //回应ACK
        }
    }
    AT24C04_Stop();             //停止信号
}

/**************************************
延时5微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5us()
{
    BYTE n = 4;

    while (n--)
    {
        _nop_();
        _nop_();
    }
}

/**************************************
延时5毫秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5ms()
{
    WORD n = 2500;

    while (n--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}

/**************************************
停止信号
**************************************/
void AT24C04_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
bit AT24C04_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void AT24C04_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    AT24C04_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE AT24C04_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能内部上拉,准备读取数据
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }

    return dat;
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   

int main (void)
{
    unsigned char a=1,b,i,j,m,k=1,l=0;
 speaker = 0;
 P0 = 0x00;
    while(1)
 {
     b = keyscan();
  if(flag)
     {
   if(b==0x39)
   {
     for(i=0;i<8;i++)
      {
      leddisplay[i]= 0x08;
   }
     flag=0;
     do{
         b = keyscan();
       if(flag && b!=0x39 && b!=0x5e && b!=0x79 && b!=0x71)
        {
        leddisplay[l] = b;
        l=l+1;
      if(l>8)
        {
         leddisplay[8] = b;
         for(i=0;i<8;i++)
           {
           leddisplay[i]= leddisplay[i+1];
        }
         }
         flag=0;
          }
      if(b==0x71)
      {
         for(i=0;i<8;i++){
                 leddisplay[i]= 0x08;}
       l=0;
       flag=0;
      }

           led_display();
    }while( b!=0x79);
   AT24C04_WritePage();
   P0 = 0x00;
   flag=0;
    }
  if(b==0x5e)
   { 
    for(i=0;i<8;i++)
      {
      leddisplay[i]= 0x08;
   }
     flag=0;
           l=0;
     do{
         b = keyscan();
       if(flag && b!=0x39 && b!=0x5e && b!=0x79 && b!=0x71)
        {
        leddisplay[l] = b;
        l=l+1;
      if(l>8)
        {
         leddisplay[8] = b;
         for(i=0;i<8;i++)
           {
           leddisplay[i]= leddisplay[i+1];
        }
         }
         flag=0;
          }
      if(b==0x71)
      {
         for(i=0;i<8;i++){
                 leddisplay[i]= 0x08;}
       l=0;
       flag=0;
      }
         led_display();
    }while( b!=0x79);

   flag=0;
   k=0;
      AT24C04_ReadPage();
            for(m=0;m<8;m++)
    {
      if(BUF[m]==leddisplay[m])
      {
        k++;
      }
    }
    if(k==8)
     {led=0;
      for(i=0;i<8;i++){
                leddisplay[i] = gooddisplay[i];}
     }
    if(k!=8)
     {
         led=1;
      for(j=0;j<8;j++){
                leddisplay[j] = errdisplay[j];}
     }

           do{
        b=keyscan();
        led_display();
    }while(b!=0x5e);
   flag=0;
   P0=0x00;
      }
       }      
 }
}


专家
2011-12-11 17:16:16     打赏
30楼
真的很好。
加油!

共53条 3/6 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]