单片机显示代码_51单片机串口通信电脑发代码单片机显示 - CSDN
  • 51单片机led显示代码

    2020-07-29 14:18:17
    利用C语言实现led控制。
  • 本实验回顾:是关于字符型LCD的显示原理的学习以及掌握字符型LCD显示字符的用法。1.使用LCD显示两行字符,第一行显示“hello + 英文名字”,第二行显示时间(正确的年月日)!注意,这里使用1602是无法显示汉字的,...

    本实验回顾:是关于字符型LCD的显示原理的学习以及掌握字符型LCD显示字符的用法。

    1.使用LCD显示两行字符,第一行显示“hello + 英文名字”,第二行显示时间(正确的年月日)

    !注意,这里使用1602是无法显示汉字的,只能显示大小写和阿拉伯数字。

    (万年历实验之后有空再更新)

    -------------------------------------------------------------------------分割线


    原理图附上:


    这里有几个主要注意:

    1.如果D0-D7要接在P0口的话,必须接上拉电阻,否则仿真时会出现灰色的电平,然而直接接P2口便不需要上拉电阻。51芯片一直要注意这个问题。

    2.本实验用到的LM016L虽然只有14个引脚,而实物是16个,但是这没什么关系,就少了个背光电池的引脚,其他功能一样,也就是仿真用LM016L就是1602。

    3.芯片上E(使能端)直接接P3.4,RS接P3.5,RW可以直接接地,因为是读写控制端,然而本实验不需要从液晶屏读取什么,所以直接低电平即可。VDD接电源,VSS接地,D0-D7接P2。


    效果图如下:


    代码如下:

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int 
    uchar code table[]="HELLO HONORWH";
    uchar code table1[]="2018 5 6";
    sbit dula=P2^6;
    sbit wela=P2^7;
    sbit lcden=P3^4;
    sbit lcdrs=P3^5;
    sbit rw=P3^6;
    uchar num;
    void delayms(uint z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=0;y<110;y++);
    }
    void write_com(uchar com)
    {
    lcdrs=0;
    P2=com;
    delayms(5);
    lcden=1;
    delayms(5);
    lcden=0;
    }
    void write_data(uchar date)
    {
    lcdrs=1;
    P2=date;
    delayms(5);
    lcden=1;
    delayms(5);
    lcden=0;
    }
    void init()
    {
    dula=0;
    wela=0;
    lcden=0;
    rw=0;
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
    }
    void main()
    {
    init();
    write_com(0x80);
    for(num=0;num<13;num++)
    {
    write_data(table[num]);
    delayms(5);
    }
    write_com(0x80+0x40);
    for(num=0;num<8;num++)
    {
    write_data(table1[num]);
    delayms(5);
    }
    while(1);

    }

    ---------------------------------------------------------分割线

    博主当做简单复习,不喜勿喷。

    学习内容根据《51单片机C语言编程》。

    展开全文
  • C51单片机数码管的显示代码

    千次阅读 2015-03-19 10:51:57
    利用单片机数码管的数字显示: #include unsigned char CS[]={0x7f,0xbf,0xdf,0xef}; unsigned char DM[]={0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f}; void Delay500ms() //@11.0592MHz { unsigned ...

    利用单片机数码管的数字显示:

    #include<stc15f2k60s2.h>
    
    unsigned char CS[]={0x7f,0xbf,0xdf,0xef};
    unsigned char DM[]={0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f};
    
    void Delay500ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	i = 22;
    	j = 3;
    	k = 227;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void Delay100us()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	i = 2;
    	j = 15;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void Delay100ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	i = 5;
    	j = 52;
    	k = 195;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    
    int main()
    {
    	int i,j;
    	P1M1 &= ~0xff;  //P1推挽输出
       P1M0 |=  0xff;
    	P0=0xff;
    	j=0;
    	while(1)
    	{
    		for(i=0;i<4;i++)
    		{
    			P0=CS[i];
    			
    			P1=DM[j];
    			Delay500ms();
    			
    		}
    		j++;
    		if(j>9)
    		{
    			j=0;
    		}
    	}
    	return 0;
    }
    


    展开全文
  • 使用51单片机驱动oled显示屏,提供字符串显示和浮点数显示函数,提供主函数供参考调用方法。
  • 单片机显示方案-OLED

    万次阅读 2017-12-11 11:00:07
    显示方案在单片机项目中往往能够使整个项目锦上添花,仿佛打开了单片机“心灵”的窗户,此次给大家介绍OLED显示方案。OLED的特点: 就我而言对OLED感觉现在能买到便宜的OLED显示屏,0.96寸或者0.91寸的128×64,128...

    显示方案在单片机项目中往往能够使整个项目锦上添花,仿佛打开了单片机“心灵”的窗户,此次给大家介绍OLED显示方案。

    OLED的特点:

    就我而言对OLED感觉现在能买到便宜的OLED显示屏,0.96寸或者0.91寸的128×64,128×32,无论白色还是蓝色最大特点就是自发光炫酷显示高分辨率低温工作环境

    上图:非常炫酷

    这里写图片描述
    这里写图片描述

    OLED显示方案:

            市面上OLED有好几种接口:
            1.并口
            2.SPI串口
            3.I2C串口
            但是显示驱动芯片大部分都是:**SSD1306** 
            因此控制方式大同小异。
            先从OLED 128×64开始吧!!!
    

    OLED 128×64显示方案

    这里写图片描述
    取模方式:
    这里写图片描述

    程序代码:

    详细的就不贴代码了,直接源代码自行下载。

        **OLED128_64.c 底层驱动文件**
        硬件SPI,如果需要模拟自行找软件SPI函数替换即可  
        6_8_8_16acs.h 字库文件
        ACSII  为ACSII码6×8和8×16显示函数
        OLED128_64 为底层显示文件
    

    这里写图片描述

    连接在这里:https://pan.baidu.com/s/1eSMtT6q OLED128_64

    以上是OLED128×64的显示方案程序。

    OLED128×32显示方案

    这里写图片描述
    IIC接口的0.91寸OLED显示和其他都不同,其通信为4位数据,数据需要进行转换,以下是具体代码大家可以直接使用。
    6_8_8_16acs.h 字库文件
    ACSII 为ACSII码6×8和8×16显示函数
    oled 为底层显示文件
    这里写图片描述

    连接在这里:https://pan.baidu.com/s/1sk95Rtj 0.91寸OLED

    这里写图片描述

    展开全文
  • 51单片机 LCD12864程序显示文字或者图片的代码51单片机 LCD12864程序显示文字或者图片的代码51单片机 LCD12864程序显示文字或者图片的代码51单片机 LCD12864程序显示文字或者图片的代码希望可以给到大家帮助
  • 单片机音乐盒完整代码

    千次阅读 多人点赞 2020-03-15 09:55:39
    单片机音乐盒完整代码 该设计是使用C51单片机制作的音乐盒制作的一个音乐盒,可以实现进行歌曲的切换,暂停/播放。此外还增加了随机点歌,获取大气温湿度等功能。使用LCD1602显示器进行歌曲名称和大气温湿度的显示...

    单片机音乐盒完整代码

    该设计是使用C51单片机制作的音乐盒制作的一个音乐盒,可以实现进行歌曲的切换,暂停/播放。此外还增加了随机点歌,获取大气温湿度等功能。使用LCD1602显示器进行歌曲名称和大气温湿度的显示。将完整代码帖在下面,有需要的可以自己获取。完整代码可以在我的博客下面,我的资源下面进行下载使用。

    由于我上传的资源需要积分,所以我重新更新了代码,现在以将完整代码贴出,有需要的可以自己看一下,如果遇到有什么问题的可以问一下我。如果觉得还行的请帮我点个赞,谢谢大家。

    如果下面贴出的代码,大家不能看懂的,或者使用有麻烦的可以给我私信。

    下面是一些实物图片

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    部分代码如下

    main.c

    #include "main.h"
    #include "delay.h"
    #include "beep.h"
    
    uchar RH,RL,TH,TL;//定义变量用来存储温湿度变量的值
    
    extern uchar timer1h, timer1l,time,K_Value,Singin_interface,Start,Stop;
    extern char Number;
    
    
    
    extern uchar code Player_Number1[9];
    
    
    uchar KEY;//定义变量保存键值信息
    
    
    //自定义1602显示心形字符
    uchar code table1[]=
    {   0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
        0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
        0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00,//心图案
    };
    
    //定义流水灯断码
    uchar code LED1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40};
    	
    
    
    //定时器初始化函数
    void  timer_init()
    {
        TMOD=0x11;//定时器0和1都工作再方式一
    	  TH0=(65536-30000)/256;
    	  TL0=(65536-30000)%256;
    	  EA=1;//开总中断
    	  //开定时器中断
    	  ET0=1;
        ET1=1;
        TR1=0;//首先关闭定时器T1
    	  TR0=1;//开启定时器T0
    	  PT1=1;
        PT0=0;
    
    }
    
    
    void  main()
    {
        uchar i;
    	  uchar flag1=0;
    	  Player=1;
        Last_Song=1;
        Next_Song=1;
    	  Choose_Song=1;//点歌按钮
        Confirmation=1;//确定按钮
       
    	  P0=0xff;
        timer_init();
        lcd_init ();
        delay (50);
        
    	
    	  //向1602写入自定义字符
        Write_CGRAM(0x40,table1);
    	
    	  //再1602上显示自定义字符
    	  //显示字符的前四位
        lcd_pos (0x0c);
        for(i=0; i<4; i++)
        {
            lcd_wdat(i);
        }
    		//显示自定义字符的后四位
        lcd_pos (0x4c);
        for(i=4; i<8; i++)
        {
            lcd_wdat(i);
        }
    		
    		//在1602上显示自定义布局
    		lcd_pos(0x00);
    		lcd_word("T:");
    		//温度
    		lcd_pos(0x04);
    		lcd_wdat(0xdF);
    		lcd_wdat('C');
    		//湿度
    		lcd_pos(0x07);
    		lcd_word("H:");
    		lcd_pos(0x0b);
    		lcd_wdat('%');
    		
    		
        lcd_pos (0x40);
        lcd_word("Sg:");
    
        lcd_word(Player_Number1);
        while(1)
        {	
    					  Song(Number);  
    
    		}			
            
    }
    
    
    
    void t0int() interrupt 1
    {
    	
    	 static uchar Num0=0,Num1=0,i=0;
    	
    	 TH0=(65536-30000)/256;
    	 TL0=(65536-30000)%256;
    	 Num1++;	 
    	//表示没有处于点个界面中,则进行数据刷新
    	 if(Singin_interface==0)
    	 {
    	 Num0++;
    	 if(Num0==90)//控制定时2.7秒钟,用来刷新数据
    	 {		
    	   receive();		 
    		 //显示温湿度
         lcd_pos(0x02);
         lcd_wdat(TH/10+0x30);
    		 lcd_wdat(TL%10+0X30);
    		 
    		 //显示湿度
    		 lcd_pos(0x09);
         lcd_wdat(RH/10+0X30);
    		 lcd_wdat(RL%10+0X30);
    		 
    		 Num0=0;
    		
    	 }
     }
    	 
     
     //表示处于点歌界面中
     else if(Singin_interface==1)
     {
    	     if(Start==1&&Stop==0)
    			 {
            Number=rand_init();
            lcd_pos(0x48);
    	      lcd_wdat(Number+0x30);
    			 }
     
     }
    	
     if(Num1==5)
    	 {
    	    P0=LED1[i];
    	    i++;
    		  if(i==7)
    			{
    			   i=0;
    			}
    			Num1=0;
    	 }
     
     
    }
    
    void t1_int() interrupt 3     //T0中断程序,控制发音的音调         
     {                              
           TR1 = 0;                      //先关闭T0          s
           spaker =!spaker;           //输出方波, 发音                   
           TH1 = timer1h;               //下次的中断时间, 这个时间, 控制音调高低         
           TL1 = timer1l;          
           TR1 = 1;                     //启动T0        
     }  
    
    

    main.h

    #ifndef _main_h
    #define _main_h
    
    #include <reg52.h>
    #include <intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    	
    typedef bit BOOL;
    
    
    
    
    sbit spaker=P1^0;//定义音频输出管脚
    
    sbit Player=P3^2;//播放按钮
    sbit Last_Song=P3^3;//上一首按钮
    sbit Next_Song=P3^5;//下一首
    
    sbit Choose_Song=P3^6;//点歌按钮
    sbit Confirmation=P3^7;//确定按钮
    
    
    //1602相关函数
    void lcd_wcmd (uchar cmd);
    void lcd_pos (uchar pos);
    void lcd_wdat (uchar dat);
    void lcd_init ();
    void lcd_word(uchar *word);
    void delay (int m);
    void Write_CGRAM(uchar *adder,uchar *p);
    
    
    //DHT11相关函数
    void start1();
    uchar receive_byte();
    void receive();
    
    
    //音乐发声相关函数
    void song();
    void key_scan();
    void Song(uchar j); 
    	
    
    #endif
    

    1602.c

    /*
    该文件用来编写LCD1602方面的程序
    
    */
    #include "main.h"
    #include "delay.h"
    
    
    #define Dat_1602  P2//1602数据口
    sbit rs=P1^7;
    sbit rw=P1^6;
    sbit ep=P1^5;
    
    
    void delay (int m)
    {
     unsigned char i,j;
     for (i=0;i<m;i++)
     for (j=0;j<253;j++);
    }
    
    //判断LCD1602是否处于忙碌状态
    BOOL lcd_bz()
    {
      BOOL result;
      rs=0;           // 读忙信号
      rw=1;
      ep=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      result = (BOOL)(Dat_1602&0x80);
      ep=0;
      return result;
    }
    
    
    
    
    //向LCD62写命令
    void lcd_wcmd (uchar cmd)
    {
      while (lcd_bz());
      rs=0;
      rw=0;
      ep=0;
      _nop_();
      _nop_();
      Dat_1602=cmd ;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      ep=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      ep=0;
    }
    
    
    //指定当前LCD1602要显示字符的位置
    void lcd_pos (uchar pos)
    {
      lcd_wcmd (pos|0x80);
    }
    
    void lcd_wdat (uchar dat)
    {
       while (lcd_bz());
      rs=1;
      rw=0;
      ep=0;
      _nop_();
      _nop_();
      Dat_1602=dat ;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      ep=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      ep=0;
    }
    
    
    //LCD1602初始化
    void lcd_init ()
    {
      lcd_wcmd (0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
      delay (1);
      lcd_wcmd (0x0c); //显示模式设置:光标右移,字符不移  
      delay (1);
      lcd_wcmd (0x06); //显示模式设置:光标右移,字符不移  
      delay (1);
      lcd_wcmd (0x01); //清屏幕指令,将以前的显示内容清除 
      delay (1);
    
    
    }
    //向LCD1602发送字符串
    void lcd_word(uchar *word)
    {
       uchar i=0;
    	 while(word[i]!='\0')
    	 { 
    	   lcd_wdat(word[i]);
    		 i++;
    	 }
    
    }
    
    
    //LCD1602自定义字符函数
    void Write_CGRAM(uchar *adder,uchar*p)
    {
    
        //uchar LOL=0x40;//操作CGRAM的命令码
        uchar i,j,V=0;
    	  for(j=0;j<8;j++)
    	{
    	  for(i=0;i<8;i++)
    	  {
    	     lcd_wcmd(adder+i);
    			 lcd_wdat(p[V]); 
           V++;			
    	  }
    		adder+=8;
    	}
    
    }
    
    
    

    delay.h

    #include "main.h"
    #include "math.h"
    #include "stdio.h"
    
    
    
    
    
    void delay1(uchar t)
    {
     uchar t1;
    unsigned long t2;
    for(t1=0;t1<t;t1++)
    {
    for(t2=0;t2<8000;t2++)
    {
       ;
    }
    }
    TR0=0;
    }
    
    
    
    
    
    void delay8us()//一个FOR循环大概需要8个机器周期,一个机器周期大约是1us也就是说12MHZ的晶振对此函数的延时
    //是8US多 所以此延时函数更精确
    {
        unsigned char i;
        for(i = 0; i < 1; i++);
    
    }
    
    
    //定义延时函数
    void delay_WO(unsigned char ms)
    {
        unsigned char i;
        while(ms--)
            for(i = 0; i < 100; i++);
    
    }
    
    
    void delay_player(unsigned char t)    //延时子函数,控制发音的时间长度
    {   uchar t1;
        unsigned long t2;
        for(t1 = 0; t1 < t; t1++)          //嵌套循环, 共延时t个半拍
        for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音   8
        TR1 = 0;                        //关闭T0, 停止发音
    
    }
    
    
    void Delay5ms()		//@12.000MHz
    {
    	unsigned char i, j;
    
    	i = 59;
    	j = 90;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    
    void Delay100ms()		//@12.000MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	_nop_();
    	i = 5;
    	j = 144;
    	k = 71;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    
    
    //随机数产生函数
    unsigned char rand_init()
    {
        uchar i;
        i=rand()%8;
        return i;
    }
    
    

    dht11.c

    #include "main.h"
    #include "delay.h"
    
    //DHT11的数据管脚
    sbit io=P1^4;
    
    uchar data_byte;
    
    extern uchar RH,RL,TH,TL;
    
    
    
    
    //单片机发送开始信号
    void start1()
    {
       io=1;
       delay8us();
       io=0;
       delay_WO(25);
       io=1;
       delay8us();
       delay8us();
       delay8us();
    
    
    
    }
    
    uchar receive_byte()
    {
      unsigned char i,temp;
      for(i=0;i<8;i++)
      {
        while(!io);
    	delay8us();
    	delay8us();
    	delay8us();
    	temp=0;
    	if(io==1)
    	temp=1;
    	while(io);
    	data_byte<<=1;
    	data_byte|=temp;
      }
      return data_byte;
    }
    
    void receive()
    {
      uchar T_H,T_L,R_H,R_L,check,num_check,i;
    	start1();
    	io=1;
    	if(!io)
    	{
    	   while(!io);
    	   while(io);
    	   R_H=receive_byte();
    	   R_L=receive_byte();
    	   T_H=receive_byte();
    	   T_L=receive_byte();
    	   check=receive_byte();
    	   io=0;
    	   for(i=0;i<7;i++)
    	   delay8us();
    	   io=1;		
    	   num_check=R_H+R_L+T_H+T_L;
    	   if(num_check==check)
    	   {
    	   	RH=R_H;
    		  RL=R_L;
    		  TH=T_H;
    		  TL=T_L;
    		  check=num_check;	   	   
    	   }
    	
    	}
    
    }
    
    

    beep.c

    #include "main.h"
    #include "delay.h"
    #include "beep.h"
    
    
    // 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据
    uchar code FREQH[] = {     0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
                               0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
                               0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
                               0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF
                         };   //超高音 1234567
    // 频率-半周期数据表 低八位
    uchar code  FREQL[] = {    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
                               0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
                               0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
                               0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16
                          };   //超高音 1234567              //----------------------------------------------------------------------------------------------
    // 要想演奏不同的乐曲, 只需要修改这个数据表
    uchar code music[8][500] = {
    
        //乡间小路数据表
        {
            3,1,2, 3,1,1, 3,1,1, 6,0,1, 6,0,1, 1,1,2, 6,0,1, 5,0,1, 6,0,4, 6,0,2, 6,0,1 ,6,0,1, 6,0,2, 6,0,1,
            1,1,1, 2,1,2, 2,1,1, 3,1,1, 2,1,4, 3,1,1, 3,1,1, 3,1,1, 2,1,1, 4,1,2, 4,1,2, 3,1,2, 2,1,1, 1,1,1,
            2,1,4, 7,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 5,0,1, 6,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 6,0,4, 6,1,2,
            3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 5,1,1, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1,
            3,1,1, 2,1,2, 1,1,1, 2,1,1, 3,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1, 6,1,1,
            5,1,1, 5,1,2, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1, 5,1,1, 6,1,1, 4,1,1, 3,1,1, 2,1,2,
            2,1,2, 5,1,4, 0,0,0
        },
    
        // 送别数据表
        {   5,1,2, 3,1,3, 5,1,1, 1,2,3, 6,1,2, 1,2,2, 5,1,4,
            5,1,2, 1,1,1, 2,1,1, 3,1,2, 2,1,1, 1,1,1, 2,1,4,
            5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2,
            1,2,2, 5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,1,
            1,1,4, 6,1,2, 1,2,2, 1,2,4, 7,1,2, 6,1,1, 7,1,1,
            1,2,4, 6,1,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 5,1,1,
            3,1,1, 1,1,1, 2,1,8, 5,1,2, 3,1,1, 5,1,1, 1,2,2,
            7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 3,1,1,
            4,1,2, 7,0,2, 1,1,4, 0,0,0
        },
    
        //一辈子的孤单数据表
        {   5,0,1, 5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 3,1,1, 2,1,1, 2,1,4,
            5,0,1, 5,0,1, 3,1,1, 2,1,1, 2,1,1, 2,1,1, 1,1,1,
            2,1,1, 3,1,1, 3,1,4, 5,0,1, 5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 3,1,1, 2,1,1, 2,1,4, 2,1,1, 1,1,1,
            -3,1,1, 2,1,1,
            1,1,1, 2,1,1, 1,1,1, 1,1,8, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 1,1,1, 2,1,1, 2,1,6, 3,1,1, 2,1,2, 1,1,1, 1,1,1,
            -5,0,1, 6,0,1,
            5,0,1, 5,0,6, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 1,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,2, 1,1,1, 2,1,2, 3,1,1,
            -3,1,4,
            5,0,1, 3,1,1, 5,1,2, 6,1,1, 3,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,2, 1,1,1, 2,1,2, 3,1,1, 3,1,4,
            5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 2,1,4, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 1,1,1, 2,1,1, 1,1,1,
            -1,1,1, 1,1,6,
            3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,1, 3,1,6,
            5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 3,1,1, 2,1,1, 2,1,6, 5,0,1, 3,1,1, 2,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,1,
            -3,1,6,0,0,0
        },
    
    
        //世上只有妈妈好数据表
        {   6,2,3,      5,2,1,      3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
            6,2,4,      3,2,2,      5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
            6,1,1,      5,2,1,      3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
            5,2,1,      6,2,1,      3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
            2,2,1,      1,2,1,      6,1,1, 1,2,1, 5,1,6, 0,0,0
    
        },
    
    
        {   5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
            5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
            5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
            4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4
        },
    
        //发如雪
        {
            5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1,
            3,2,1, 6,2,1, 5,2,1, 3,2,1, 5,2,3, 5,2,1, 6,2,1, 1,3,2, 6,2,1, 5,2,1,
            3,2,1, 5,2,1, 3,2,2, 1,2,1, 2,2,1, 3,2,1, 1,2,1, 6,1,1, 3,2,1, 2,2,1,
            5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1,
            3,2,1, 6,2,1, 5,2,3, 5,2,1, 6,2,1, 1,3,2, 6,2,1,
            5,2,1, 3,2,1, 5,2,1, 3,2,2, 1,2,1, 6,1,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1,
            1,2,1, 2,2,1, 2,2,1, 1,2,4, 0,0,0
        },
    
        //当你孤单会想起谁
        {
            3,2,2, 3,2,1, 4,2,1, 3,2,2, 2,2,1, 1,2,1,  2,2,2, 5,2,2, 2,2,2, 2,2,3,
            1,2,2, 1,2,1, 2,2,1, 1,2,2, 7,1,1, 6,1,1, 7,1,2, 3,2,2, 7,1,2, 7,1,3,
            6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 5,1,2, 2,2,1, 3,2,1, 2,2,1,
            1,2,1, 6,1,2, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 7,1,1, 1,2,6, 0,0,0
        },
    		
    		//简单爱
        {
         5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 
             4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 
             5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 
             3,2,1, 3,2,1, 1,2,1, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 7,1,1, 1,2,1, 1,2,1, 6,1,1, 
             2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1, 
             5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2,  
             5,1,1, 1,2,1, 2,1,2, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 
             4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 
             5,2,1, 5,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 
             3,2,1, 3,2,1, 1,2,2, 5,2,1, 1,2,1, 5,2,1, 5,2,1, 7,1,1, 1,2,1, 0,0,0 }
    };
    
    
    //定义歌曲名字
    uchar code Player_Number1[10]="1.CyRoad ";
    uchar code Player_Number2[10]="2.FeWell ";
    uchar code Player_Number3[10]="3.LCover ";
    uchar code Player_Number4[10]="4.Mother ";
    uchar code Player_Number5[10]="5.Birhday";
    uchar code Player_Number6[10]="6.SnHair ";
    uchar code Player_Number7[10]="7.Althink";
    uchar code Player_Number8[10]="8.SimLove";
    
    
    //定义9各空格来进行下一首歌曲名字的显示
    uchar code Tab[9]="         ";
    
    //定义变量Singin_interface来判断是否处于点歌界面当变量等于一时表示处于点个界面中
    //定义变量Start,Stop来判断点歌的开始与停止等于一时有效
    uchar Singin_interface=0,Start=0,Stop=0;
    
    
    
    /*定义变量timer1h, timer1l来存储定时器的初值,TIME用来控制延时时间,
    K_Value用来存储键值Num用来记录
    音乐播放到那一首*/
    
    
    uchar timer1h, timer1l,time,K_Value;
    char Number=0;
    
    
    //发声控制函数
    void song()
    {
        TH1 = timer1h;               //控制音调
        TL1 = timer1l;
        TR1 = 1;                     //启动T0, 由T0输出方波去发音
        delay_player(time);                 //控制时间长度
    }
    
    
    void key_scan()
    {
    
        //判断是否按下了播放按键
        if(Player==0)
        {
            Delay5ms();
            if(Player==0)
            {
                while(Player==0);
                K_Value=1;
            }
    
    
        }
    
    
        //判断是否按下了下一首按键
        else if(Next_Song==0)
        {
            Delay5ms();
            if(Next_Song==0)
            {
                while(Next_Song==0);
                K_Value=2;
            }
    
        }
        //判断是否按下了上一首的按键
        else if(Last_Song==0)
        {
            Delay5ms();
            if(Last_Song==0)
            {
                while(Last_Song==0);
                K_Value=3;
            }
        }
    
        //判断是否按下了点歌按钮
        else if(Choose_Song==0)
        {
            Delay5ms();
            if(Choose_Song==0)
            {
                while(Choose_Song==0);
                K_Value=4;
            }
    
        }
        //判断是否按下了确定按钮
        else if(Confirmation==0)
        {
            Delay5ms();
            if(Confirmation==0)
            {
                while(Confirmation==0);
                K_Value=5;
            }
    
        }
    }
    
    //音乐播放控制函数
    void Song(uchar j) 	//j表示第n+1首曲   9
    {
        uchar k, i,flag_play=0;
        uchar LCD_i=0;//用来显示从点歌界面切换回来时的自定义字符
        static char flag_next_song=0,K=0;//flag_next_song用来记录切换到了那一首歌曲,i用来记录按键5按下的次数
        i = 0;
        time = 1;
        while(time)
        {
            key_scan();
           if(Singin_interface==0)
    			 {
            //说明播放按钮按下了,执行相应的操作
            if(K_Value==1)
            {
                TR1=0;
                ET1=0;
                flag_play++;
                K_Value=0;
                if( flag_play==2)
                {
                    flag_play=0;
                    TR1=1;
                    ET1=1;
                }
            }
    
            //切换到下一首歌曲
            else if(K_Value==2)
            {
    
                K_Value=0;
                //开启定时器
                TR1=0;
                ET1=0;
                flag_next_song++;
    
                if(flag_next_song>7)//当到最后一首歌时循环到第一首
                {
    
                    flag_next_song=0;
                }
                Number=flag_next_song;
    
                //在1602上显示歌曲名字
                switch(Number)
                {
                case 0:
                    lcd_pos (0x43);
                    lcd_word(Player_Number1);
                    break;
                case 1:
                    lcd_pos (0x43);
                    lcd_word(Player_Number2);
                    break;
                case 2:
                    lcd_pos (0x43);
                    lcd_word(Player_Number3);
                    break;
                case 3:
                    lcd_pos (0x43);
                    lcd_word(Player_Number4);
                    break;
                case 4:
                    lcd_pos (0x43);
                    lcd_word(Player_Number5);
                    break;
                case 5:
                    lcd_pos (0x43);
                    lcd_word(Player_Number6);
                    break;
                case 6:
                    lcd_pos (0x43);
                    lcd_word(Player_Number7);
                    break;
    						case 7:
    							  lcd_pos (0x43);
                    lcd_word(Player_Number8);
    						    break;
                default:
                    break;
                }
    
                TR1=1;
                ET1=1;
    
                break;
            }
    
            //切换到上一首歌
            else if(K_Value==3)
            {
    
                K_Value=0;
                //开启定时器
                TR1=0;
                ET1=0;
                flag_next_song--;
                if(flag_next_song<0)//当到最后一首歌时循环到第一首
                {
                    flag_next_song=7;
                }
                Number=flag_next_song;
    
                //在1602上显示歌曲名字
                switch(Number)
                {
                case 0:
                    lcd_pos (0x43);
                    lcd_word(Player_Number1);
                    break;
                case 1:
                    lcd_pos (0x43);
                    lcd_word(Player_Number2);
                    break;
                case 2:
                    lcd_pos (0x43);
                    lcd_word(Player_Number3);
                    break;
                case 3:
                    lcd_pos (0x43);
                    lcd_word(Player_Number4);
                    break;
                case 4:
                    lcd_pos (0x43);
                    lcd_word(Player_Number5);
                    break;
                case 5:
                    lcd_pos (0x43);
                    lcd_word(Player_Number6);
                    break;
                case 6:
                    lcd_pos (0x43);
                    lcd_word(Player_Number7);
                    break;
    						case 7:
    							  lcd_pos (0x43);
                    lcd_word(Player_Number8);
    						    break;
                default:
                    break;
                }
                TR1=1;
                ET1=1;
                break;
            }
    
            //表示按下了点歌按键
            else if(K_Value==4)
            {
    
                Singin_interface=1;//将标志为置为一表示处于点歌界面中
                TR1=0;
                ET1=0;
                K_Value=0;
                lcd_wcmd (0x01);//刷新屏幕
                lcd_pos(0x00);
                lcd_word("Hello!  Welcome!");
                lcd_pos(0x41);
                lcd_word("Start      Stop");
    
            }
    			}
            else if(Singin_interface==1)//表示在点歌界面中
            {
                //选择点歌的开始按钮
                if(K_Value==5)
                {
    
                    K_Value=0;
                    K++;
                    if(K==1)
                    {
                        ET1=0;
                        TR1=0;
                        Start=1;
                        Stop=0;
                        lcd_pos(0x40);
                        lcd_wdat('*');
                        lcd_pos(0x4b);
                        lcd_wdat(' ');
                    }
                    else if(K==2)
                    {
                        Start=0;
                        Stop=1;
                        lcd_pos(0x40);
                        lcd_wdat(' ');
                        lcd_pos(0x4b);
                        lcd_wdat('*');
                        K=0;
                        Delay100ms();//100MS开始播放选中的歌曲
                        ET1=1;
                        TR1=1;
                        Song(Number);
                    }
                }
    
                else if(K_Value==1)//当处于点个界面时按下上一首按键时退出点歌界面
                {
    							
    							  K_Value=0;
                    Singin_interface=0;//点歌界面标志位清零
                    Start=0;
                    Stop=0;
                    Number=0;
    							  flag_next_song=0;
                    //先关闭定时器
                    ET1=0;
                    TR1=0;
                    //Number=0;
                    //进行主界面显示
                    lcd_wcmd(0x01);
    							  Delay100ms();
                    //再1602上显示自定义字符							
                    //显示字符的前四位
                    lcd_pos (0x0c);
                    for( LCD_i=0; LCD_i<4; LCD_i++)
                    {
                        lcd_wdat(LCD_i);
                    }
    								 
                    //显示自定义字符的后四位
                    lcd_pos (0x4c);
                    for( LCD_i=4;  LCD_i<8;  LCD_i++)
                    {
                        lcd_wdat( LCD_i);
                    }
    
                    //在1602上显示自定义布局
                    lcd_pos(0x00);
                    lcd_word("T:");
                    //温度
                    lcd_pos(0x04);
                    lcd_wdat(0xdF);
                    lcd_wdat('C');
                    //湿度
                    lcd_pos(0x07);
                    lcd_word("H:");
                    lcd_pos(0x0b);
                    lcd_wdat('%');
    
    
                    lcd_pos (0x40);
                    lcd_word("Sg:");
                    lcd_word(Player_Number1);
                    ET1=1;
                    TR1=1;
    								Song(Number);
                }
            }
    
            k = music[j][i] + 7 * music[j][i + 1] - 1;                            //第i个是音符, 第i+1个是第几个八度
            timer1h = FREQH[k];      //从数据表中读出频率数值
            timer1l = FREQL[k];      //实际上, 是定时的时间长度
            time = music[j][i + 2];   //读出时间长度数值
            i += 3;
            song();                  //发出一个音符
        }
    }
    
    

    Proteus电路仿真图

    在这里插入图片描述

    展开全文
  • C51单片机数码管动态显示

    万次阅读 多人点赞 2018-08-27 21:55:34
    数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示: ...
  • 【51单片机代码实例

    千次阅读 2019-12-17 11:54:53
    LED灯 —依次点亮 #include<reg51.h> #include<math.h> void delay(unsigned int n) { int i; for(i=0;i<n;i++); } void LED_left_to_right()//从左到右依次点亮 ... unsign...
  • 51单片机显示时间日期

    千次阅读 2016-12-25 22:01:22
    #include #include #include sbit p10=P1^0; bit flag=0; //调整控制标记 bit flagh=1; //时间日期切换标记 ...uchar curtime1[8],curtime2[8]; //调整后的时间显示模式 uchar tab1[]={30,40,11,31,8,2,14}
  • 51单片机 数码管的静态显示和动态显示

    万次阅读 多人点赞 2015-09-05 16:36:44
    51单片机 数码管的静态显示和动态显示 附有代码示例
  • 关于单片机代码的风格

    千次阅读 2016-05-08 15:07:50
    良好的编程风格和正确的习惯还有助于保持思维清晰,写出正确无误的代码。特别是一个开发团队共同工作时,保持一致的编程风格尤其重要。目前单片机开发人员对编程风格问题重视度还不够。事实上,每个初学者在项目初期...
  • 51单片机 显示学号

    2020-06-10 16:55:06
    数码管显示学号 ,直接上代码了,把学号改了就可以了 ORG 0000H AJMP START ORG 30H START: MOV 60H,#1 MOV 61H,#7 MOV 62H,#8 //在这里自己该学号,其他地方应该不用动 MOV 63H,#2 MOV 64H,#8 MOV 65H,#6 MOV 66...
  • 51单片机-1602液晶显示的时钟代码

    千次阅读 2017-08-08 21:27:42
    单片机小白,初学单片机,利用51单片机简单的编写了基于1602显示的时钟程序,技术不好,可能会有许多不好的地方,希望大神指正 基本功能:时钟显示,利用按键调时,分#include #define uint unsigned int #define ...
  • 单片机秒表小白代码

    千次阅读 2020-03-26 00:05:58
    单片机小白的秒表代码 作为一个单片机小白,这是我学习单片机的两周来打的第一个秒表程序。 这个程序是在看过另外一个大佬的明白后,才打出来, 我写出来主要是留下个记录,万一以后变动厉害了,也回忆一下, 在这...
  • 51单片机之数码管静态显示

    万次阅读 多人点赞 2018-10-14 14:17:59
     在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示, 我们就拿带小数点的...
  • 51单片机之静态数码管显示

    千次阅读 2019-05-16 21:50:24
    数码管的物理实物图: ...数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产...
  • 51单片机之动态数码管显示

    万次阅读 2019-05-17 19:34:33
    首先来看一下开发板上的电路原理图: 本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。...
  • 单片机中断代码练习

    千次阅读 2011-10-29 20:35:51
    外部中断1的练习 #include #include #define uchar unsigned char #define uint unsigned int sbit P3_3 = P3^3 ; sbit P3_4 = P3^4 ; sbit P1_7 = P1^7 ;... //初始化函数,进行相应的中断寄存器的设置
  • 独立代码文件创建,可以很方便复用。 有关部分修改,待后续更新。 上述代码假如显示多位有缺失的话,把消隐语句的注释去掉即可,延时可调整为char的255,或改为如下。 以上修改源于群提问,静态不能显示...
1 2 3 4 5 ... 20
收藏数 20,717
精华内容 8,286
关键字:

单片机显示代码