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

共31条 2/4 1 2 3 4 跳转至
工程师
2011-12-13 13:09:48     打赏
11楼

6.数码管显示(锁存器)
/********************************************************************
* 描述    :  该程序为数码管静态显示程序,并且通过实现锁存器的功能。
    如果按了P3.1口,P3.7口由高电平变到低电平后,锁存器锁存功能使能。再按P3.0口,数码管的值就不会有所改变。
    再按P3.1口,P3.7口电平由低变高,锁存功能失效。数码管的值又会改变。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY = P3^0;   //独立按键的S1
sbit KEY_Lock = P3^1; //这里,按了S2按键后,实现解锁和开锁。
sbit LOCK = P3^7;     //锁存功能

uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*下一行的数组可以显示数值外,还可以显示数码管的点*/
uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)   
 ;
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
 uchar i = 0;
 LOCK = 1;
 //P2=0xff;
 while(1)
 {
  P0 = table[i % 16];    //在这里取 i 的个位数,不带点显示
  //P0 = table_d[i % 16];      //带点显示
  if(KEY == 0)
  {
   Delay(1);              //软件消抖,试验为20ms
   if(KEY == 0)
   {
    i++;
   }
   Delay(50);       //延时0.5秒后进行下一次的按键检测
  }
  if(KEY_Lock == 0)
  {
   Delay(1);              //软件消抖,试验为20ms
   if(KEY_Lock == 0)
   {
    LOCK = !LOCK; 
   }
   Delay(50);       //延时0.5秒后进行下一次的按键检测 
  }                 
 }
}


工程师
2011-12-13 13:29:42     打赏
12楼

7.数码管动态显示
/********************************************************************
* 描述    :  8位数码管分别显示0,1,2,3,4,5,6,7
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 while(1)
 {
  P0 = table[1];   // i 值的 个位数
  P2 = LED_W[6];   //点亮第一位数码管
  Delay(3);
  P0 = table[2];   // i 值的 个位数
  P2 = LED_W[7];   //点亮第一位数码管
  Delay(3);
 }
}


工程师
2011-12-13 13:30:31     打赏
13楼

8.数码管滚动显示
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
uint Time_temp = 0, LED_temp = 0;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,50ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
 TMOD = 0x01;
 IE   = 0x82;
 TH0  = 0x4c;
 TL0  = 0x00; 
 TR0 = 1;  
}

/********************************************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
 TH0 = 0x4c;
 TL0 = 0x00;
 Time_temp++;
 if(Time_temp == 4)   //定时器溢出时间50毫秒,隔0.2秒,数码管的数据改变一次
 {
  LED_temp++;
  Time_temp = 0;
 }    
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar i = 0,j = 0;
 Time0_Init();
 while(1)
 {
  P0 = table[(i + LED_temp) % 8];     //数码管段值
  P2 = LED_W[j];                  //点亮某一位数码管
  Delay(2);
  j++;
  i++;
  if(j == 8)                   //每个数码管都点亮了一次。
  {
   j = 0;
   i = 0;
  }
 }
}


视频地址:http://player.youku.com/player.php/sid/XMzMxOTc1MzI0/v.swf


工程师
2011-12-13 13:31:08     打赏
14楼

9.数码管字符显示
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

//uchar code table[8] = {0x00,0x00,0x00,0x00,0x73,0x77,0x6d,0x6d};  //显示PASS编码
uchar code table[8] = {0x00,0x00,0x00,0x76,0x79,0x38,0x38,0x3f};  //显示HELL0编码
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar i = 0,j = 0;
 while(1)
 {
  P0 = table[i];         //数码管段值
  P2 = LED_W[j];                  //点亮某一位数码管
  Delay(2);
  j++;
  i++;
  if(j == 8)                   //每个数码管都点亮了一次。
  {
   j = 0;
   i = 0;
  }
 }
}


工程师
2011-12-13 13:31:50     打赏
15楼

10.独立按键
/********************************************************************
* 描述    :  该程序实现独立按键去控制 LED灯 的亮灭,并讲诉了对按键的处理方法。
    独立按键相应的IO口平时为高电平,一旦按键按下,单片机便检测到低电平。
    按下P3.0,P1.0口对应的LED亮灭交替变化。
    按下P3.1,P1.1口对应的LED亮灭交替变化。
    按下P3.2,P1.2口对应的LED亮灭交替变化。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^0;   
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;

sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)  
 ;
}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,当按键按下时,相应的LED亮灭交替
* 输入 : 无
* 输出 : 无
***********************************************************************/
void KEY()
{
 if(KEY1==0 || KEY2==0 || KEY3==0) 
 {
  Delay(2);     //20毫秒软件防抖
  if(KEY1 == 0)
  {
   LED1 = !LED1;  //LED显示取反
  }
  else if(KEY2 == 0)
  {   
   LED2 = !LED2;
  }
  else
  {   
   LED3 = !LED3;
  }
  Delay(50);   //延时0.5秒再进行下次按键的检测
 } 
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的亮灭
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 while(1)
 {
   KEY();
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMxOTc1NDU2/v.swf


助工
2011-12-13 13:39:53     打赏
16楼
我在网上买了原件,今天才买齐,真郁闷

工程师
2011-12-13 13:45:07     打赏
17楼
呵呵,我蛮早就焊好了,元器件在电子城买的,焊好之后下载程序有问题,之后就没管了,今天用别人的板子下载,然后放到自己的板子上运行。今天正好就上传了。呵呵!

工程师
2011-12-13 14:31:43     打赏
18楼

11.矩阵键盘(数码管)
/********************************************************************
* 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
    当前的按键值。  
*********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}
 

/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
 uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};   //让矩阵键盘的每行分别为低电平
 for(j=0; j<4; j++)
 {
  P3 = Buffer[j];
  temp = 0x10;                                                                                                                                                                   
  for(i=0; i<4; i++)
  {
   if(!(P3 & temp))   //判断P3口高4位某一行为低电平
   {
    return (i+j*4);  //返回键码
   }
   temp <<= 1;
  } 
 }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar Key_Value;  //读出的键值
 while(1)
 {
  P3 = 0xf0;    
  if(P3 != 0xf0)   //判断有无按键按下
  {
   Delay_1ms(20);  //按键消抖
   if(P3 != 0xf0)  //第二次判断有无按键按下
   {
    Delay_1ms(20);  //按键消抖
    if(P3 != 0xf0) //第三次判断有无按键按下
    {
     Key_Value = Keyscan();  
    }
   }
  }
  P0 = table[Key_Value];
  P2 = 0x07; 
 }
}


视频地址:http://player.youku.com/player.php/sid/XMzMyMDM5MzQ0/v.swf



12.矩阵键盘(LCD)
/********************************************************************
* 描述    :  该文件实现了 4 * 4 键盘的试验。通过1602液晶来显示当前的按键值。  
*********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

//这三个引脚参考资料
sbit E=P2^6;  //1602使能引脚
sbit RW=P2^5;  //1602读写引脚 
sbit RS=P2^4;  //1602数据/命令选择引脚


/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay()
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{
 bit busy_flag = 0;
 RS = 0;
 RW = 1;
 E = 1;
 delay();
 busy_flag = (bit)(P0 & 0x80);
 E = 0;
 return busy_flag;
}
/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{
 while(Busy());
 RS = 0;
 RW = 0;
 E = 0;
 delay();
 P0 = del;
 delay();
 E = 1;
 delay();
 E = 0;
}

/********************************************************************
* 名称 : wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void wdata(uchar del)
{
 while(Busy());
 RS = 1;
 RW = 0;
 E = 0;
 delay();
 P0 = del;
    delay();
 E = 1;
 delay();
 E = 0;
}

/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
 wcmd(0x38);
 wcmd(0x0c);
 wcmd(0x06);
 wcmd(0x01);
}

/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
   L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 wcmd(a);
 wdata(sign);
}

/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
 uchar a,b=0;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 while(1)
 {
  wcmd(a++);
  b++;
  if((*p == '\0')||(b==16)) break;
  wdata(*p);
  p++;
 }
}

/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
 uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
 for(j=0; j<4; j++)
 {
  P3 = Buffer[j];
  temp = 0x10;                                                                                                                                                                   
  for(i=0; i<4; i++)
  {
   if(!(P3 & temp))
   {
    return (i+j*4);
   }
   temp <<= 1;
  } 
 }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar Key_Value;  //读出的键值
 L1602_init();
 L1602_string(1,1,"  4*4 KeyBoard  ");
 L1602_string(2,1,"You Press The    ");
 while(1)
 {
  P3 = 0xf0;
  if(P3 != 0xf0)
  {
   Delay_1ms(20); //按键消抖
   if(P3 != 0xf0)
   {
    Delay_1ms(20); //按键消抖
    if(P3 != 0xf0)
    {
     Key_Value = Keyscan();  
    }
   }
  }
  L1602_char(2,15,Key_Value / 10 + 48);
  L1602_char(2,16,Key_Value % 10 + 48);  
 }
}


视频地址:http://player.youku.com/player.php/sid/XMzMyMDM5MjA4/v.swf


工程师
2011-12-13 14:37:15     打赏
19楼

13.定时器的使用(方式1)
/********************************************************************
* 描述    :  用定时器的方式1来实现定时。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar Count = 0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,50ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
 TMOD = 0x01; 
 TH0  = 0x4c;
 TL0  = 0x00;
 IE   = 0x82; 
 TR0 = 1;  
}
          
/********************************************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
 TH0 = 0x4c;
 TL0 = 0x00;
 Count++;   //长度加1
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
 uchar i = 0;
 Time0_Init();
 while(1)
 {
  P0 = table[i % 10];   //取 i 的个位
  while(1)
  {
   if(Count == 20)   //当Count为 20 时,i 自加一次,20 * 50MS = 1S
   {
    Count = 0;
    i++;
    break;
   }
  }
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMyMDQwMzE2/v.swf


工程师
2011-12-13 14:41:17     打赏
20楼

14.定时器的使用(方式2)
/********************************************************************
* 描述    :  用定时器方式2的程序代码。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uint Count = 0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,0.1ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
 TMOD = 0x02; 
 TH0  = 0xa3;
 TL0  = 0xa3;
 IE   = 0x82; 
 TR0 = 1;  
}
          
/********************************************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
 Count++;   //长度加1
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
 uchar i = 0;
 Time0_Init();
 while(1)
 {
  P0 = table[i % 10];   //取 i 的个位
  while(1)
  {
   if(Count == 10000)   //当Count为 10000 时,i 自加一次,10000 * 0.1MS = 1S
   {
    Count = 0;
    i++;
    break;
   }
  }
 }
}


视频地址:http://player.youku.com/player.php/sid/XMzMyMDQwNDAw/v.swf


共31条 2/4 1 2 3 4 跳转至

回复

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