打印

单片机学习板

[复制链接]
楼主: soso
手机看帖
扫描二维码
随时随地手机跟帖
21
68336016| | 2008-3-30 16:32 | 只看该作者 回帖奖励 |倒序浏览

搭车卖东西

我也有几块简单的板搭车卖卖
http://shop35447293.taobao.com/

使用特权

评论回复
22
hl0716| | 2008-3-30 16:43 | 只看该作者

不错

好像还行

使用特权

评论回复
23
soso|  楼主 | 2008-4-2 09:42 | 只看该作者

用51实现的方波信号发生器的C语言源程序

/************************************************************************************
*  Copyright (c) 2008,重庆优易特电子
*            All rights reserved.

* 摘 要:    方波信号发生器:10-200HZ,步长10HZ,P23口输出

* 文件名称: main.c
* CPU芯片:  STC89C51RC
* 学习板型: Easy51-B 
*  
* 当前版本: 2.0
* 作 者:     cache
* 完成日期: 2008年1月23日
*
*************************************************************************************/

#include "reg52.h"

unsigned char  code Duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
      0x6f,0X76,0X3e,0x55,0x37,0x77,0x5e,0x72};
unsigned char  Data_Buffer[4]={0,0,0,0};

unsigned char PinLV_Out=10;//范围:10-99

unsigned char th0,tl0;

sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;

sbit P23=P2^3;

sbit DOWN=P2^2; //修改频率按键
sbit UP=P2^1;  //修改频率按键

void Comute_pinlv()
{
 float t;
 unsigned int x;
 t=1000/PinLV_Out/2;//计算高低宽度时间ms为单位
 t=t*921.6;  //11.0592MHZ晶振,1ms时间常数宽度为921.6
 t=65535-t;
 x=t;
 th0=x/256;
 tl0=x%256;   
 
 Data_Buffer[0]=0;    //频率值更新显示
 Data_Buffer[1]=PinLV_Out/100; 
 Data_Buffer[2]=PinLV_Out/10%10;
 Data_Buffer[3]=PinLV_Out%10;
}

void main()
{    
    unsigned char Bit=0;
    bit x=1,y=1;

    Comute_pinlv();
       
    TMOD=0x11;
    TH0=th0;
    TL0=tl0;
     TR0=1;
    ET0=1;
     EA=1;    

    while(1)  
    {
       if(UP==1)x=1;
       else if(x==1)
       {//UP键按下
          x=0;
            PinLV_Out+=10;
            if(PinLV_Out>200)PinLV_Out=200;
            Comute_pinlv();
       }
       
       if(DOWN==1)y=1;
       else if(y==1)
       {//DN键按下
          y=0;
            if(PinLV_Out>10)
               PinLV_Out-=10;
            Comute_pinlv();
       }
      

        Bit++;//数码管扫描
         if(Bit>=4)Bit=0;
         P1|=0x0f;
         P0=Duan[Data_Buffer][Bit]];
         switch(Bit)
         {
          case 0: P10=0;break;
          case 1: P11=0;break;
          case 2: P12=0;break;
           case 3: P13=0;break;
         }
    }
}

void timer0() interrupt 1
{//定时器0用于产生方波信号,定时器时间常数是由方波频率决定
 TH0=th0;
 TL0=tl0;

 P23=!P23;//方波输出
}

使用特权

评论回复
24
qguangdong| | 2008-4-2 13:56 | 只看该作者

*

少做广告

使用特权

评论回复
25
soso|  楼主 | 2008-4-4 14:24 | 只看该作者

hehe

32楼的朋友,其实我也认为自己有点广告形式,但是现在许多东西都是需要宣传,如果不宣传,别人也根本不知道,不知道谈不上什么好坏.所以在此献丑,忘见谅!
谢谢你啊!!!

使用特权

评论回复
26
cqxwj| | 2008-4-8 20:09 | 只看该作者

top

呵呵 都贴了这么多了

使用特权

评论回复
27
soso|  楼主 | 2008-4-11 16:05 | 只看该作者

多段计数的跑表

/************************************************************************************
*  Copyright (c) 2008,重庆优易特电子
*            All rights reserved.

* 摘 要:    可多段计数的跑表
    {前三位显示秒数,后一位显示百分秒。
    按一下M键开始计时,每再按一下记下当前计数值,最多记四段;
    按一下UP键停止,再按一下UP键,第一个指示灯亮,并显示第一段计数值;
    继续按UP键,下一个指示灯亮,并显示下一段计数值;DN键清零}

* 文件名称: main.c
* CPU芯片:  STC89C51RC
* 学习板型: Easy51-B 
*  
* 当前版本: 2.0
* 作 者:     cache
* 完成日期: 2008年1月23日
*
*************************************************************************************/
#include "reg52.h"

#define THCO   0xee
#define TLCO   0x0
//5ms

unsigned char  code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char  Data_Buffer[4]={0,0,0,0};

unsigned int Mill_Sec=0;
//当前秒表计数值
bit start_flag=0,brush_flag=0;
//start_flag:秒表启动标志,brush_flag:数码管更新标志

sbit P10=P1^0; //数码管位码口
sbit P11=P1^1; 
sbit P12=P1^2;
sbit P13=P1^3;

sbit LED1=P2^3; //四个指示灯
sbit LED2=P2^4;
sbit LED3=P2^5;
sbit LED4=P2^6;


sbit Mode=P2^0; //按键定义
sbit UP=P2^1;
sbit DN=P2^2;

unsigned int Time[4]={0};
//存储分段秒表数值
unsigned char D_count=0;
//当前显示段序号,0:显示当前计数值,1-4:分别显示第1-4段的时间值

//数码管更新内容子函数,x:显示内容值
void brush(unsigned int x)
{
 Data_Buffer[0]=x/1000;
 Data_Buffer[1]=x%1000/100;        
 Data_Buffer[2]=x%100/10;        
 Data_Buffer[3]=x%10;
}

void main()
{    
       TMOD=0x11;//定时器初始化,5ms定时
     TH0=THCO;
     TL0=TLCO;
     TR0=1;
     ET0=1;              
    EA=1;

    while(1) 
   {
     if(brush_flag==1)    //需要更新数码管显示
     {
       brush_flag=0;     //标志清0
       if(D_count==0)  brush(Mill_Sec);  //显示当前计数值
       else   brush(Time[D_count-1]);     //显示存储的秒值
     }   
   } 
}

void timer0() interrupt 1
{
 static unsigned char Bit=0;
 static unsigned char count=0;
 static unsigned char time_count=0;

 TH0=THCO;
 TL0=TLCO;

 Bit++;
 if(Bit>=4)Bit=0;
 P1|=0x0f;    //关位码
 if(Bit==2) //开段码
       P0=Duan[Data_Buffer][Bit]]|0x80;  //第三位数码管显示小数点
 else 
     P0=Duan[Data_Buffer][Bit]];
 switch(Bit)//开位码
 {
  case 0: P10=0;break;
  case 1: P11=0;break;
  case 2: P12=0;break;
  case 3: P13=0;break;
 }        

 if(start_flag==1)    //秒表启动
 {
     time_count++;
     if(time_count>=20) //100ms时间
     {    
         time_count=0;
        Mill_Sec++;
        if(Mill_Sec>9999) 
        {
            Mill_Sec=0;        
        }
        brush_flag=1;//更新数码管显示标志
     }
 }
 else time_count=0;

 if(Mode==0||UP==0||DN==0)    
 {
     count++;
      if(count>=30)    //消抖处理
      {
        count=0;
        if(Mode==0)    //MODE键,启动、停止功能 
            {if(start_flag==0)//秒表处于停止状态
                  {
                start_flag=1;D_count=0;    P2|=0x78;//秒表启动,实时显示当前计数值,指示灯全灭
                  }
             else        //秒表处于启动状态
               {
                Time[0]=Time[1];Time[1]=Time[2];Time[2]=Time[3];Time[3]=Mill_Sec; //存储秒表值
                LED1=!LED1;LED2=!LED2;LED3=!LED3;LED4=!LED4;  //四个指示灯反转一次,指示存储成功
               }            
            }
        else if(DN==0)    //清0
            {
                 Mill_Sec=0;
                Time[0]=0;Time[1]=0;Time[2]=0;Time[3]=0;brush_flag=1;
            }
        else if(UP==0)
            {
             if(start_flag==1)start_flag=0; //停止计数
             else
               {//显示存储的四段数值
                 D_count++;
                 if(D_count>=5)D_count=1;
                 P2|=0x78;
                 if(D_count==1)    LED1=0;
                 else if(D_count==2)LED2=0;             
                 else if(D_count==3)LED3=0;
                 else if(D_count==4)LED4=0;
                 brush_flag=1;
              }             
            }
     }
  }
  else count=0;
}

使用特权

评论回复
28
soso|  楼主 | 2008-4-19 10:13 | 只看该作者

KS0108液晶显示C语言源代码

#include "reg52.h"
#include "zimo.c"
unsigned char xdata LCD[128][8];             //设置坐标
#define set_x(x) LcdWCom(0x40+(x&127)%64)
#define set_y(y) LcdWCom(0xb8+(y&7))

sbit LCD_DI =P1^0;          
sbit LCD_RW =P1^1; 
sbit LCD_E = P1^2; 
sbit LCD_Blight=P2^7; //背光控制
sbit LCD_CS2 = P3^6;                    // 液晶选择控制位
sbit LCD_CS1 = P3^5;
/*
sbit LCD_DI  = P1^2;                    // 液晶选择控制位
sbit LCD_RW  = P1^3;                    // 液晶读写控制位
sbit LCD_E   = P1^4;                    // 液晶 CLK
sbit LCD_RST = P2^4;
sbit LCD_Blight=P2^6;                    // 背光控制
sbit LCD_CS2 = P2^3;                    // 液晶选择控制位
sbit LCD_CS1 = P3^7; */

#define DATA_PORT P0
#define SELECT_CS1       LCD_CS1 = 1;    LCD_CS2 = 0;
#define SELECT_CS2       LCD_CS1 = 0;    LCD_CS2 = 1;
#define NOP()    _nop_();_nop_();_nop_();

//////////////////延时程序
void delay(unsigned int j)
{unsigned int i;
do{ 
    for(i=0;i<10;i++);
 }while(j--); 
}

 //////////////////////////////////////////////////////////////写命令
void LcdWCom(unsigned char dd)
{
    delay(1);
    LCD_E=0;
    LCD_RW = 0;
    LCD_DI =0;
    LCD_CS1 = 1;
    LCD_CS2 = 1;
    DATA_PORT = dd;
    LCD_E =0;
    LCD_E =1;
    LCD_E =0;
}
///////////////////////////////////////写数据
void LcdWDat(unsigned char x, y, dd)
{
    LCD[x][y]=dd;
    LCD_DI = 1;
    if(x<64)    
        {
    SELECT_CS1;
        }
            else{
    SELECT_CS2;
        }DATA_PORT = dd;
        LCD_E = 0;
    LCD_E = 1;
     LCD_E = 0;
   }
//////////////////////////////////////////////////////////清屏
void ClearDisp(void)
{
    unsigned char x,y;

    for(y=0; y<8; y++)
        {
        set_x(x);
        set_y(y);
        for(x=0; x<128; x++)
            {
            LcdWDat(x,y,0);
            }
        }
}

///////////////////////////////////////////////////读数据
unsigned char LcdRDat(unsigned char x, y)
{  
    return LCD[x][y];
}

///////////////////////////////////////////////////写一个字节数据
void LcdDrawByte(unsigned char x, y, value)
{
    unsigned char tmp,i;
    tmp = (63-(y&0x3f));
    i = tmp%8;
    y = tmp/8;
    set_x(x);
    set_y(y);
    tmp = LcdRDat(x,y);
    tmp = ((0xff>>(8-i))&tmp)| (value<<i);
    LcdWDat(x,y,tmp);
    if(i && (++y)<8)
        {
        set_x(x);
        set_y(y);
        tmp = LcdRDat(x,y);
        tmp = ((0xff<<i)&tmp) | (value>>(8-i));
        LcdWDat(x,y,tmp);
        }
}
///////////////////////////////////////////////////写一个字节数据 //反显
/*void LcdDrawByte00(unsigned char x, y, value)
{
    unsigned char tmp,i;
    value=~value;
    tmp = (63-(y&0x3f));
    i = tmp%8;
    y = tmp/8;

    set_x(x);
    set_y(y);
    
    tmp = LcdRDat(x,y);
    tmp = ((0xff>>(8-i))&tmp)| (value<<i);
   
    LcdWDat(x,y,tmp);
    
    if(i && (++y)<8)
        {
        set_x(x);
        set_y(y);
        tmp = LcdRDat(x,y);
        tmp = ((0xff<<i)&tmp) | (value>>(8-i));
        LcdWDat(x,y,tmp);
        }
}      */
//////////////////////////////////////////////////////////写数据显示
void LcdDispWord(unsigned char x, y, unsigned char code *p,unsigned char line, length)
{
    unsigned char i,j;
        
    for (i=0; i<line; i++)
        {
        for (j=0; j<length; j++)
            {
            LcdDrawByte(x+j,y-i*8, *p++);
            }
        }
}

//////////////////////////////////////////////////////////写数据显示    //反显
/*void LcdDispWord00(unsigned char x, y, unsigned char code *p,unsigned char line, length)
{
    unsigned char i,j;
        
    for (i=0; i<line; i++)
        {
        for (j=0; j<length; j++)
            {
            LcdDrawByte00(x+j,y-i*8, *p++);
            }
        }
}               */
//////////////////////////////////////画点
/*void  LcdDrawDot(unsigned char x, y, flag)
{
    unsigned char tmp,i;

    i = 7-(y%8);
    y = (63-(y&0x3f))/8;
    set_x(x);
    set_y(y);

    tmp = LcdRDat(x,y);
    if(flag)
        tmp |= (1<<i);
    else
        tmp &=~ (1<<i);
    LcdWDat(x,y,tmp);
}

////////////////////画线
/*unsigned char LcdDrawLine(unsigned char x1, y1, x2, y2, flag)
{
    unsigned char tmp;
    if(x1==x2)//X坐标相同 画直线 |
        {
        if(y1>y2)
            {
            tmp=y1;
            y1=y2;
            y2=tmp;
            }
        for(; y1<=y2; y1++)
            {
            LcdDrawDot(x1,y1,flag);    
            }
        }
    else if(y1==y2)
        {
        if(x1>x2)
            {
            tmp=x1;
            x1=x2;
            x2=tmp;
            }
            for(; x1<=x2; x1++)
                {
                LcdDrawDot(x1,y1,flag);    
                }
        }
    else    return 1;
}
///////////////////////////////画矩形
/*void  LcdDrawRect(unsigned char x1,y1,x2,y2,flag)
{
    LcdDrawLine(x1,y1,x2,y1,flag);
    LcdDrawLine(x1,y1,x1,y2,flag);

    LcdDrawLine(x2,y1,x2,y2,flag);
    LcdDrawLine(x1,y2,x2,y2,flag);

}  */

void DispWord1(void)    //显示函数 
{    
    unsigned char i;
    
    for (i=0; i<8; i++)
        LcdDispWord(8+8*i,63,Zimo1,2,8);
    for (i=0; i<3; i++)
        LcdDispWord(64+16*i,63,Zimo2,2,16);
    for (i=0; i<7; i++)
        LcdDispWord(8+16*i,31,Zimo0,2,16);     
    for    (i=0; i<18; i++)
        LcdDispWord(0+7*i,15,Zimo3,2,8);    
    // for    (i=0; i<15; i++)
    //    LcdDispWord(0+8*i,15,Zimo5,2,8);
}


void InitLcd(void)               //液晶初使化函数                            
{    unsigned int  j;
//    LCD_RST = 0;                        // 复位驱动芯片
    for(j=0; j<500; j++) ;
//    LCD_RST = 1;    
    LcdWCom(0x3f);        // 打开显示
    delay(1000);
    LcdWCom(0x3f);        // 打开显示
       ClearDisp();
}

main()
{
  ClearDisp();
  InitLcd();
  LCD_Blight=0;
  delay(10000);
  DispWord1();
 // DispWord2();

  while(1) 
  {}
 
}

使用特权

评论回复
29
evilive| | 2008-5-12 12:36 | 只看该作者

顶一下!

使用特权

评论回复
30
soso|  楼主 | 2008-5-14 11:13 | 只看该作者

呵呵

 STM32学习

好久都没来这了,最近在做STM单片机,我们现在推出STM32学习板,价格便宜,功能强大,如果搞开发的朋友需要STM32方面的芯片可以联系我们,价格从优,并提供技术支持.
    我认为学习单片机入门还是通过51来学习,尽量选个资料齐全的,能有人即使辅导,那样基础能学好.学其他的就容易了.

使用特权

评论回复
31
wxj1952| | 2008-5-14 19:05 | 只看该作者

网站不通了?地震原因?

想购2套。留下个信箱,行吗?cmy19831@126.com

使用特权

评论回复
32
wrainp| | 2008-5-14 19:47 | 只看该作者

ding~~

使用特权

评论回复
33
soso|  楼主 | 2008-5-15 20:59 | 只看该作者

好啊

请问需要哪种?
本人邮箱在下:xingweijun123@126.com

使用特权

评论回复
34
qca2369| | 2008-5-23 09:52 | 只看该作者

在这里做广告是不太合适,不过有几个例程看还是不错的!

在这里做广告是不太合适,不过有几个例程看还是不错的!

使用特权

评论回复
35
soso|  楼主 | 2008-5-24 11:42 | 只看该作者

呵呵

楼上的朋友说的也对,但是如果有朋友需要,我认为提供也无妨,大家有什么问题 也可以在这交流,共同进步,还有我们提供STM32学习板,推出时间不是很久,价格很低,仅成本价格,目的是想把这种单片机推广,有 感兴趣的朋友,可以到我们网站上看看,提供技术支持。

使用特权

评论回复
36
razu_521| | 2008-5-24 12:15 | 只看该作者

谢谢楼主啦!

哈哈,谢谢你啦,好东西太多啦!这样我又学到不少的东西啦!哈哈

使用特权

评论回复
37
soso|  楼主 | 2008-6-4 12:06 | 只看该作者

播放音乐:两只老虎

/************************************************************************************
*  Copyright (c) 2008,重庆优易特电子
*            All rights reserved.

* 摘 要:   播放音乐:两只老虎

* 文件名称: main.c
* CPU芯片:  STC89C51RC
* 学习板型: Easy51-B 
*  
* 当前版本: 2.0
* 作 者:     cache
* 完成日期: 2008年1月23日
*
*************************************************************************************/
            #include <reg52.h>
            #include <intrins.h>

            #define  FREQ 11059200
        
            unsigned char code music_tab[]={    //两只老虎,高4位为音乐节拍,低4位为音符
            0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,
            0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x14,0x33,0x31,
            0x31,0x35,0x41,0x31,0x35,0x41,
            0
            };
            unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//节拍延时单位       
            unsigned char code music_freq_tab[16]={           
                0xff,0xea,                                      //0 休止符
                255-FREQ/24/1049/256,        //1 do 高字节 //255-FREQ/24/x/256
                255-FREQ/24/1049%256,        //1 do 低字节 //256-FREQ/24/x%256
                255-FREQ/24/1178/256,256-FREQ/24/1178%256,        //2 re
                255-FREQ/24/1322/256,256-FREQ/24/1322%256,        //3 mi
                255-FREQ/24/1400/256,256-FREQ/24/1400%256,        //4 fa
                255-FREQ/24/1572/256,256-FREQ/24/1572%256,        //5 suo
                255-FREQ/24/1665/256,256-FREQ/24/1665%256,        //6 la
                255-FREQ/24/1869/256,256-FREQ/24/1869%256,        //7 xi               
            };

            unsigned char temp_TH1;
            unsigned char temp_TL1;

            sbit PIN_MSC=P1^4;                   //  音乐输出端口  //
            
            void music_delay(unsigned char x);   //音乐节拍延时
            void music_play(unsigned char *msc); //播放音乐子程序
            
            //---------------------------------------------------------------------------//
            void music_int_t1 (void) interrupt 3 using 1    //定时中断1//
                {
                PIN_MSC=~PIN_MSC;
                TH1=temp_TH1;
                TL1=temp_TL1;
            }
            //---------------------------------------------------------------------------//
            void music_delay(unsigned char n)     //延时 125*n 毫秒
                {
                unsigned char i=125,j;
                do {
                    do {
                        for (j=0; j<230; j++) _nop_(); 
                    }while(--i);
                }while(--n);
            }
            //---------------------------------------------------------------------------//
            void music_play(unsigned char *msc)   //音乐
                {
                unsigned char music_long;         //节拍
                unsigned char music_data=0;       //音符数据
                temp_TH1=0xff;
                temp_TL1=0xea;                    //关输出(输出超声波)   
                TH1=temp_TH1;
                TL1=temp_TL1;
                TR1=1;                            //开T1定时器中断
                
            //---------------------------------------------------------
                while (*msc != 0x00)
                    {
                    music_data=*msc & 0x07;
                    music_long=*msc>>4;
                    //---------------------------------------------------------
                    if (music_long != 0)          //是音符
                        {
                           temp_TH1=music_freq_tab[music_data*2];                        
                           temp_TL1=music_freq_tab[music_data*2+1];
                        music_delay(music_l_tab[music_long&0x07]); 
                         }          
                    msc++;
                }
                TR1=0;                           //播放结束
                PIN_MSC=1;                       //关输出
            }
            //---------------------------------------------------------------------------//
            void main(void)                      //示例
            {
                TMOD   =  0x11;         // TMOD: 定时器1:模式1:16位;定时器2:模式1:16位   
                   TR1=0;
                ET1=1;
                EA=1;
                while(1)
                {                  
                  music_delay(10);    //延时
                  music_play(music_tab);//播放音乐
                }
            }
            //---------------------------------------------------------------------------// 

使用特权

评论回复
38
xwj| | 2008-6-4 12:52 | 只看该作者

MD,抄我的程序,还去掉了全部相关信息

却连注释都没改过...

使用特权

评论回复
39
xwj| | 2008-6-4 12:59 | 只看该作者

我以前的程序,大家自己看!



LZ太不道德了!!!


相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=3450&page=3

使用特权

评论回复
40
computer00| | 2008-6-4 13:17 | 只看该作者

嘿嘿,正常现象拉~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则