#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int 
sbit beep = P1^0;
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振24M, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x80;
     SCON = 0x50;   
     TH1 = 0xf3; //
     TL1 = 0xf3; //
     TR1 = 1;   
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
 uchar i = 0;
 uchar code Buffer[] = "Welcome To MY MCU World";  //所要发送的数据
 uchar *p;
 beep = 0;
 Com_Init();
 P2 = 0x00;
 p = Buffer;
 while(1)
 {
  
  SBUF = *p;
  while(!TI)                   //如果发送完毕,硬件会置位TI
  {
   _nop_(); 
  }
  p++;
  if(*p == '\0') break;  //在每个字符串的最后,会有一个'\0'
  TI = 0;                  //TI清零
 }
 while(1);
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int 
sbit beep = P1^0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar LED_Buffer[8] = {0};      //从串口接收的数据
/********************************************************************
* 名称 : 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++); 
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
 static uchar i = 7;    //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
 EA = 0;
 if(RI == 1)   //当硬件接收到一个数据时,RI会置位
 {
  LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  RI = 0;  
  if(i==0) i = 8 ;  
  i--;  
 }
 EA = 1;
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x80;
     SCON = 0x50;   
     TH1 = 0xF3;    //设置波特率 9600
     TL1 = 0xF3;
     TR1 = 1;  //启动定时器1
   ES = 1;  //开串口中断
   EA = 1;  //开总中断  
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
 uchar i = 0;
 beep = 0;
 Delay_1ms(100);
 Com_Init();
 P2 = 0x00;  //这里把P2口的最高为置1,进入循环后 循环左移 一位正好是P2 最低为置1
 while(1)
 {
  P0 = table[LED_Buffer[i]];
  P2 = i++;
  Delay_1ms(2);
  if(i == 8) i=0;
 }
}         
/*
用杜邦线把继电器输入端口和P1.1连接起来 按键s1吸合 s2释放继电器
*/
#include <reg52.h>
 
sbit key1=P3^2;//定义按键位置
sbit key2=P3^3;//定义按键位置
sbit RELAY = P1^1;
sbit beep = P1^0;
void delay(unsigned int cnt)
{
 while(--cnt);
}
///////////////////////////////////////////////////////
main()
{
 beep = 0;
 while(1)
      { 
      if(!key1)     //按下相应的按键
        {
  delay(5000);
        if(!key1)     //去抖后是否按下相应的按键
    {
     RELAY=1; //继电器吸合
    }
  }
   if(!key2)     //按下相应的按键
        {
  delay(5000);
        if(!key2)     //去抖后是否按下相应的按键
    {
     RELAY=0; //继电器释放
    }
  }
      }
}
/********************************************************************
* 文件名  : 矩阵键盘LCD.c
* 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后两位来显示
    当前的按键值。   
* 创建人  : 东流,2009年4月10日
* 版本号  : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
*********************************************************************/
#include<reg51.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数据/命令选择引脚
sbit beep = P1^0;
/********************************************************************
* 名称 : 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()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
 int i,j;
 for(i=0; i<=10; i++)
 for(j=0; j<=2; j++);
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
 P0 = del;
 RS = 0;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
 P0 = del;
 RS = 1;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
 enable(0x01);
 enable(0x38);
 enable(0x0c);
 enable(0x06);
 enable(0xd0);
}
/********************************************************************
* 名称 : 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;
 enable(a);
 write(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;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 enable(a);
 while(1)
 {
  if(*p == '\0') break;
  write(*p);
  p++;
 }
}
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
 uchar i,j, temp, Buffer[4] = {0x7f, 0xbf, 0xdf, 0xef};
 for(j=0; j<4; j++)
 {
  P3 = Buffer[j];
  /*以下三个_nop_();作用为让 P1 口的状态稳定*/
  _nop_();
  _nop_();
  _nop_();
  temp = 0x01;                                                                                                                                                                    
  for(i=0; i<4; i++)
  {
   if(!(P3 & temp)) 
   {
    while(!(P3&temp));
    return (i+j*4);
   }
   temp <<= 1;
  } 
 }
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar Key_Value;  //读出的键值
 beep = 0;
 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(15); //按键消抖
   if(P3 != 0xf0)
   {
    Key_Value = Keyscan();  
   }
  }
  L1602_char(2,15,Key_Value/10+48);
  L1602_char(2,16,Key_Value%10+48);  
 }
}

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

