⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanshu.c

📁 学习过程中积累的一些程序,有比较好的用处
💻 C
字号:
/*_________________________
流水灯——————————*/
#include<reg51.h>
#include<intrns.h>

void delayms(unsigned char ms)  //延时程序
{
     unsigned char i;
     while(ms--)
       {
         for(i=0;i<120;i++);
       }
}

main()
{
   unsigned char LED;
    LED = 0XFE;
    P0  = LED;
 
    while(1)
    {
       delayms(250);
       LED = _crol_(LED,1);
       P0  = LED;
     }
}


/*__________________________
报警声音—————————*/
#include<reg51.h>
#include<intrins.h>

sbit  SPK = P3^7;

unsigned char frq;

void delayms(unsigned char ms);

mian()
{
    TMOD = 0X01;
    frq = 0x00;
    TH0 = 0X00;
    TL0 = 0xff;
    TR0 = 1;
    IE  = 0X82;

    while(1)
     {
         frq++;
         delayms(1);
      }
}

void timer0() interrupt 1 using 1
{
      TH0 = 0xfe;
      TL0 = frq;
      SPK = ~SPK;
}

/*______________________________
消防车报警
_______________________________*/

#include<reg51.h>
#include<intrins.h>

sbit  SPK = P3^7;

unsigned char frq;
unsigned int  flag;
void delayms(unsigned char ms);
void main()
{
   TMOD = 0X01;
   frq  = 0x00;
   TH0  = 0X00;
   TL0  = 0XFF;
   TR0  = 1;
   IE   = 0X82;
   flag =0;
   while(1)
      {
          switch(flag)
             {
                  case 0: frq++;break;        //flag标志置0时,frq递增
                  case 1: frq--;break;        //flag标志置1时,frq递减
              }
          if (!(frq^0xff)) flag=1;       //当frq增加到FFH时,flag置1,准备frq递减	
          if (!(frq^0x00)) flag=0;       //当frq递减到00H时,flag置0,准备frq递增
          delayms(15);
       }
}

void timer0() interrupt 1 using 1
{ 
       TH0 = 0xfe;
       TL0 = frq;
       SPK = ~SPK;
}	


/*______________________________
2002年的第一场雪
______________________________*/
#include<reg51.h>

sbit SPK = P3^7;

void delayms(unsigned chat ms);
unsigned int data j;
unsigned char code song[636]={
             0xFF,0xFF,4,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xfd,0x08,2,//21
	     0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,2,0xff,0xff,2,0xFc,0x0B,2,//21
	     0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,//21	
	     0xFB,0x8F,2,0xFC,0x0B,2,0xFC,0x0B,4,0xff,0xff,8,//12
	     0xff,0xff,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,4,0xFD,0x08,2,0xFD,0x08,2,//21
	     0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,4,0xFD,0x08,6,//12
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,//24
	     0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
	     0xFF,0xFF,4,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,//21	
	     0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,4,0xFD,0x08,6,//12,183
	     0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,//24
	     0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
	     0xFF,0xFF,4,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xfd,0x08,2,//21
             0xFD,0x5B,4,0xFD,0x08,2,0xFD,0x5B,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
	     0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFB,0x8F,4,0xFB,0x8F,2,0xFB,0x03,2,//21
	     0xFC,0x0B,4,0xFB,0x8F,2,0xFC,0x0B,2,0xFB,0x03,2,0xfa,0x14,2,0xfa,0x14,4,//18
	     0xFF,0xFF,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,  //24
	     0xFD,0x5B,4,0xFD,0x08,2,0xFD,0x5B,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,	//18
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,  //24
	     0xfc,0xab,4,0xfc,0xab,2,0xfc,0xab,2,0xfb,0x8f,2,0xfc,0x0b,2,0xFC,0x0B,4,		//18,204
	     0xFF,0xFF,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,4,0xFd,0x08,2,	            //21
	     0xfd,0x5b,4,0xfd,0x08,2,0xfc,0xab,4,0xfc,0x0b,6,		//12
	     0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,	//24	
	     0xFC,0x0B,4,0xFB,0x8F,2,0xFC,0x0B,2,0xFB,0x03,2,0xfa,0x14,2,0xfa,0x14,4,		//18	
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,  //24
	     0xfb,0x03,2,0xfb,0x03,2,0xfb,0x03,2,0xfa,0x14,2,0xfa,0x14,1,0xf9,0x5b,1,0xf8,0x2a,2,0xf8,0x2a,4,  //24
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,  //24
	     0xfb,0x8f,2,0xfc,0x08,2,0xfc,0x08,2,0xfc,0x08,10,			//12
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,  //24
	     0xfb,0x03,2,0xfb,0x03,2,0xfb,0x03,2,0xfa,0x14,2,0xfa,0x14,1,0xf9,0x5b,1,0xf8,0x2a,2,0xf8,0x2a,4,  //24,207				
	     0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
	     0xfc,0xab,2,0xfd,0x08,2,0xfd,0x08,2,0xfd,0x08,2,0xff,0xff,4,0xff,0xff,4           };	    //18,42,636	

void main()
{
      TMOD = 0X01;
      IE   = 0X82;
        while(1)
         {
             j=0;
             while(j<636)
               {       TR0 = 1;
                       if ((song[j]==0xff)&&(song[j+1]==0xff)) TR0=0;  
                                //休止符用0xff,0xff表示,出现休止符时CT0禁止,不发声
                       delayms(song[j+2]);  //每一音符长多长
                       j=j+3;
                }
          }
}

void timer0() intrrupt 1  using 1     //每一音符唱多高
{
    TH0 = song[j];
    TL0 = song[j+1];
    SPK = !SPK;
}
void delayms(unsigned char ms)      //基本延时子程序 16分之1拍的时间
{
    unsigned int i;
    while(ms--)
      {
         for(i =0;i<20300;i++);
      }
     TR0=0;
}



/*_________________________________________
数码管显示
_________________________________________*/

#include<reg51.h>
#include<intrns.h>

unsigned char data dis_digit;
unsinged char code dis_code[11]={
0xc0,0xf9,0xa4,0xb0,   //0,1,2,3
0x99,0x92,0x82,0xf8,0x80,0x90,0xff  //4,5,6,7,8,9,off
};

unsigned char data dis_buf[8];
unsigned char data dis_index;

void main()
{
     P0 = 0xff;
     P2 = 0xff;
     TOMD = 0X01;
     TH0  = 0XFC;
     TL0  = 0X17;
     IE   = 0X82;

     dis_buf[0] = dis_code[0x1];
     dis_buf[1] = dis_code[0x2];
     dis_buf[2] = dis_code[0x3];
     dis_buf[3] = dis_code[0x4];
     dis_buf[4] = dis_code[0x5];
     dis_buf[5] = dis_code[0x6];
     dis_buf[6] = dis_code[0x7];
     dis_buf[7] = dis_code[0x8];

     dis_digit = 0xfe;
     dis_index = 0;

     TR0 = 1;
     while(1);
}


// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
//				选通P2.0口数码管
// dis_buf   --- 显于缓冲区基地址	

void timer0() interrupt 1
{
       TH0 = 0xFC;
       TL0 = 0X17;

       P2 = 0XFF;                     // 先关闭所有数码管
       P0 = dis_buff[dis_index];      // 显示代码传送到P0口
       P2 = dis_digit;

       dis_digit = _crol_(dis_digit,1);  // 位选通值左移, 下次中断时选通下一位数码管
       dis_index++;
 
       dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}


/*______________________________________________
 按键扫描程序  
_______________________________________________*/
#include<teg51.h>
#include <intins.h>

unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);

sbit  K1 = P1^4;
sbit  K2 = p1^5;

main()
{
    unsigned char key_s,key_v;
    key_v = 0x03;
    P0 = 0xfe;
    while(1)
      {
        key_s = scan_key();
        if(key_s != key_v)
         {
              key_v = key_s;
              proc_key(key_v);
          }
      }
}

unsigned chat scan_key()
{
       unsigned char key_s;
       key_s = 0x00;
       key_s |= K2;
       key_s <<=1;
       key_s = K1;
       return key_s;
}

void proc_key(unsigned char key_v)
{
    if((key_v & 0x01) == 0)
     {
          P0 = _cror_(P0,1);
      }
     esle if((key_v & 0x02) == 0)
        {
           P0 = _crol_(P0,1);
         }
}
       



/*______________________________________________________________-
E2PROM AT93C46读写演示程序
______________________________________________________________*/

#include <reg51.h>
#include <intrins.h>

//define OP code
#define OP_EWEN_H 0x00          // 00 写入使能指令的高8位
#define OP_EWEN_L 0x60         // 11X XXXX 写入全能指令的低8位
#define OP_EWDS_H 0x00         // 00 写入禁止指令的高8位
#define OP_EWDS_L 0x00         // 00X XXXX 写入禁止指令的低8位
#define OP_ERAL_H 0x00         // 00 整片擦除指令高8位
#define OP_ERAL_L 0x40         // 10X XXXX 整片探险指令低8位
#define OP_WRAL_H 0x00         // 00 整片写入指令的高8位
#define OP_WRAL_L 0x20        // 01X XXXX 整片写入指令的低8位

#define OP_WRITE_H 0x40        // 01 A6-A0 写入指令的高位
#define OP_READ_H 0x80         // 10 A6-A0 读取指令的高位

#define OP_ERASE_H 0xc0         // 11 A6-A0 删除指令的高位

//define pin
sbit CS = P3^4;             //片选
sbit SK = P3^3;            //时钟
sbit DI = P3^5;            //数据输入
sbit DO = P3^6;          //数据输出

unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};

//void start();             //
void ewen();                  //写入使能函数
void ewds();                //写入禁止函数
void erase();               //整片擦除函数
void write(unsigned char addr, unsigned char indata);         //在指定地址写入数据函数
unsigned char read(unsigned char addr);                      //读取指定地址函数
void inop(unsigned char op_h, unsigned char op_l);           //写入指令函数
void shin(unsigned char indata);                              //写入数据函数
unsigned char shout();                                       //读出数据函数
void delayms(unsigned char ms);                            //延时函数

main()
{
     unsigned char i;
     CS = 0;                //初始化端口
     SK = 0;
     DI = 1;
     DO = 1;

     ewen(); // 使能写入操作
     erase(); // 擦除全部内容

     for(i = 0 ; i < 8; i++) //写入显示代码到AT93C46
     {
     write(i, dis_code[i]);
     }

     ewds(); // 禁止写入操作 

     i = 0;
     while(1)
       {
          P0 = read(i); // 循环读取AT93C46内容,并输出到P0口
          i++;
          i &= 0x07; // 循环读取地址为0x00~0x07
          delayms(250); 
        }
}


void write(unsigned char addr, unsigned char indata)       // 写入数据indata到addr
{
     inop(OP_WRITE_H, addr); //写入指令和地址
     shin(indata);          //写入数据
     CS = 0;
     delayms(10);           // Twp
}


unsigned char read(unsigned char addr)      // 读取addr处的数据
{
     unsigned char out_data;
     inop(OP_READ_H, addr);      //写入指令和地址
     out_data = shout();         //读出数据
     CS = 0; 
     return out_data;
}

void ewen()     //写入使能
{
     inop(OP_EWEN_H, OP_EWEN_L);
     CS= 0;
}

void ewds()      //写入禁止
{
     inop(OP_EWDS_H, OP_EWDS_L);
     CS= 0; 
}


void erase()  //整片擦除
{
     inop(OP_ERAL_H, OP_ERAL_L);
     delayms(30);
     CS = 0;
}


void inop(unsigned char op_h, unsigned char op_l)
//移入op_h的高两位和op_l的低7位
//op_h为指令码的高两位
//op_l为指令码的低7位或7位地址
{ 

     unsigned char i;

     SK = 0; // 开始位
     DI = 1;
     CS = 1;
     _nop_();
     _nop_(); 
     SK = 1;
     _nop_();
     _nop_();
     SK = 0; // 开始位结束

     DI = (bit)(op_h & 0x80); // 先移入指令码高位
     SK = 1;
     op_h <<= 1;
     SK = 0; 

     DI = (bit)(op_h & 0x80); // 移入指令码次高位
     SK = 1;
     _nop_();
     _nop_(); 
     SK = 0;

// 移入余下的指令码或地址数据
     op_l <<= 1; 
     for(i = 0; i < 7; i++) 
       {
          DI = (bit)(op_l & 0x80); // 先移入高位
          SK = 1;
          op_l <<= 1;
          SK = 0; 
       }
     DI = 1; 
}


void shin(unsigned char indata) 
//移入数据
{
     unsigned char i;
     for(i = 0; i < 8; i++)
     {
          DI = (bit)(indata & 0x80); // 先移入高位
          SK = 1;
          indata <<= 1;
          SK = 0; 
     }
     DI = 1;
}

unsigned char shout(void) 
// 移出数据
{
     unsigned char i, out_data;
     for(i = 0; i < 8; i++)
     {
          SK = 1;
          out_data <<= 1;
          SK = 0;
          out_data |= (unsigned char)DO;
     }
     return(out_data);
}

































                     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -