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

📄 text8.c

📁 单片机开发的程序
💻 C
字号:
#include <reg51.h>			    	// 引用标准库的头文件
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define uchar unsigned char 
#define uint unsigned int 

sbit DIN = P1^3;					// 串行数据输入
sbit CLK = P1^1;					// 串行时钟
sbit LOAD = P1^2;					// 显示数据锁存控制

sbit DE_RE =P3^5;

#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器
#define DecodeMode 0x09     		// 译码模式寄存器
#define Intensity 0x0a     			// 亮度寄存器
#define ScanLimit 0x0b      		// 扫描位数寄存器
#define ShutDown 0x0c       		// 低功耗模式寄存器
#define DisplayTest 0x0f    		// 显示测试寄存器

#define ShutdownMode 0x00      		// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式

#define ScanDigit 0x03        		// 扫描位数设置,显示8位数码管
#define DecodeDigit 0xff       		// 译码设置,8位均为BCD码
#define IntensityGrade 0x0a    		// 亮度级别设置
#define TestMode 0x01          		// 显示测试模式
#define TextEnd 0x00           		// 显示测试结束,恢复正常工作模式
void putbyte(char c);	//发送一个字节
//char rand();
uchar instruction_buf[9] = {0xff,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f } ; // 就收缓存区
uchar dis_buf[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } ;//显示缓存区
uchar device_id;
/* 延时t毫秒 */
void delay(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}

/* 向MAX7219写入字节(8位)*/
void SendChar (uchar ch)
{
	uchar i,temp;
    _nop_();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	DIN=1;
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;
        	CLK=0;
        	CLK=1;
        }
    }
}

/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;				// 锁存进相应寄存器
}

/* MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
	TMOD |= 0x20;
	TL1 = 0xfd;	TH1 = 0xfd;
	//SCON = 0x7a;
    SCON = 0x50;
	TR1 = 1;
	//TI = 0;
	ES = 1;                                                                                                                                                                                                                             
	EA = 1;
	DE_RE=0;
	device_id = (P1&0xf0)>>4;
            WriteWord (Digit0,0x0a);
            WriteWord (Digit1,0x0a);
            WriteWord (Digit2,0x0a);
            WriteWord (Digit3,0x0a);
  // instruction_buf[9] = {0xff,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f } ;
}


/* 主函数 */
void main(void)
{    uint i,delay_time;
     uchar j;
	 uchar th,hun,ten,one;
	 uint rand_mize,data_1,data_2;
	 uchar th_1,hun_1,ten_1,one_1,tttt,ttt,tt,t;
	 
   	InitDisplay ();							// MAX7219初始化 
   // serial_init();
	
   	while(1)
   	{//if(instruction_buf[0]==0x00 && instruction_buf[1]==0x00 && instruction_buf[2]==0x00}
	   // {InitDisplay ();continue;}
	  if(instruction_buf[8]==0xff)
	    {	instruction_buf[8] = 0x0f;
             if(instruction_buf[0]==device_id)		//接收到新指令								 
		     { //for(i=0;i<7;i++) putbyte(instruction_buf[i]);
			    //delay(10);
                dis_buf[0]= instruction_buf[0];
				dis_buf[1]= instruction_buf[1];
				dis_buf[2]= instruction_buf[2];
				dis_buf[3]= instruction_buf[3];
                dis_buf[4]= instruction_buf[4];
                dis_buf[5]= instruction_buf[5];
                dis_buf[6]= instruction_buf[6];
				dis_buf[7]= instruction_buf[7];
				j=0;
                 for(i=0;i<7;i++) j=j+dis_buf[i];
				 if(j==dis_buf[7]){putbyte(instruction_buf[0]);
				                   putbyte(0x67);putbyte(0x67);
								   putbyte(0x67);putbyte(0x67);
								   putbyte(0x67);putbyte(0x67);
								   putbyte(0x67);putbyte(0x67);}
				       else { putbyte(instruction_buf[0]);
					            putbyte(0x69);putbyte(0x69);
								putbyte(0x69);putbyte(0x69);
								putbyte(0x69);putbyte(0x69);
								putbyte(0x69);putbyte(0x69);}

                instruction_buf[0]=0x01;
                   
                while(instruction_buf[0]!=device_id)
                {
				   //WriteWord (Digit0,dis_buf[3]);
                   //WriteWord (Digit1,dis_buf[2]);
                   //WriteWord (Digit2,dis_buf[1]);
                   //WriteWord (Digit3,dis_buf[0]);
                      //delay(500);

				   if((dis_buf[1]==0x0a)||(dis_buf[1]==0x0f)) th=0;else th=dis_buf[1]&0x0f;
				   if((dis_buf[2]==0x0a)||(dis_buf[2]==0x0f)) hun=0;else hun=dis_buf[2]&0x0f;
				   if((dis_buf[3]==0x0a)||(dis_buf[3]==0x0f)) ten=0;else ten=dis_buf[3]&0x0f;
				   if((dis_buf[4]==0x0a)||(dis_buf[4]==0x0f)) one=0;else one=dis_buf[4]&0x0f;
				   data_1=th*1000+hun*100+ten*10+one;
                   //if(dis_buf[0]==0x0a)tttt=0x0a;else tttt=(dis_buf[0]&0xf0)+th_1;
				  // ttt=(dis_buf[1]&0xf0)+hun_1;
				    //tt=(dis_buf[2]&0xf0)+ten_1;
				    // t=(dis_buf[3]&0xf0)+one_1;
					       
                      
				 //data_1=dis_buf[1]*1000+dis_buf[1]*100+dis_buf[2]*10+dis_buf[3];
                      
                      rand_mize=data_1*dis_buf[5]/100;
                       if(rand_mize==0){data_2=data_1;}
                       else data_2=data_1+rand()%rand_mize-data_1*dis_buf[5]/200;

   if((dis_buf[1]==0x0a && data_2>999)||
      (dis_buf[1]==0x0f && data_2>999)||
       (data_2>9999)||
	   (dis_buf[1]==0x0f && dis_buf[2]==0x0a && data_2>99)||
	   (dis_buf[1]==0x0f && dis_buf[2]==0x0f && data_2>99)||
	   (dis_buf[2]==0x0f && dis_buf[1]==0x0f && dis_buf[3]==0x0f && data_2>9)||
	   (dis_buf[2]==0x0f && dis_buf[1]==0x0f && dis_buf[3]==0x0a && data_2>9))
              data_2=data_1;
                     // if(dis_buf[0]==0x0a){th_1=0x0a;
					   //                    hun_1=data_2/100;
				         //                  ten_1=(data_2-hun_1*100)/10;
                           //                one_1=data_2-hun_1*100-ten_1*10;}
					  //if(dis_buf[0]==0x0f && dis_buf[1]==0x0a)
					    //                  {th_1=0x0f;
					      //                 hun_1=0x0a;
				            //               ten_1=data_2/10;
                              //             one_1=data_2-ten_1*10;}
				      
					        th_1=data_2/1000;
				            hun_1=(data_2-th_1*1000)/100;
				            ten_1=(data_2-th_1*1000-hun_1*100)/10;
                            one_1=data_2-th_1*1000-hun_1*100-ten_1*10;
                         if(dis_buf[1]==0x0a || dis_buf[1]==0x0f)  { th_1=dis_buf[1];}
                          if(dis_buf[2]==0x0a || dis_buf[2]==0x0f)  { hun_1=dis_buf[2];}
						   if(dis_buf[3]==0x0a || dis_buf[3]==0x0f)  { ten_1=dis_buf[3];}
						    if(dis_buf[4]==0x0a || dis_buf[4]==0x0f)  { one_1=dis_buf[4];}
                      tttt=th_1;ttt=hun_1;tt=ten_1;t=one_1;
					   if((0x80&dis_buf[1])==0x80){tttt=tttt+0x80;}
                       if((0x80&dis_buf[2])==0x80){ttt=ttt+0x80;}
					   if((0x80&dis_buf[3])==0x80){tt=tt+0x80;}
					   if((0x80&dis_buf[4])==0x80){t=t+0x80;}
					     // else{tttt=th_1;ttt=hun_1;tt=ten_1;t=one_1;}
						  //tttt=th_1;ttt=hun_1;tt=ten_1+0x80;t=one_1;

		    WriteWord (Digit0,t);
            WriteWord (Digit1,tt);
            WriteWord (Digit2,ttt); 
            WriteWord (Digit3,tttt);
			delay_time=dis_buf[6]*40;
              delay(delay_time);

		   // WriteWord (Digit0,t);
            //WriteWord (Digit1,tt);
            //WriteWord (Digit2,ttt); 
            //WriteWord (Digit3,tttt);
              //delay(1000);
                }
		   			
  		      } 
		}
	}
}

//void serial_init(void)
//{
 //	TMOD |= 0x20;
//	TL1 = 0xfd;	TH1 = 0xfd;
//	SCON = 0x7a;
//	TR1 = 1;
//	TI = 0;
//	ES = 1;                                                                                                                                                                                                                             
//	EA = 1;
//	DE_RE=0;
//}
void serial_re(void) interrupt 4
{
	static uint ins_cnt; 
	if(RI) 
	{
		if((ins_cnt==0)&&(SBUF==0xff));
		else
		{
			instruction_buf[ins_cnt] = SBUF;
			ins_cnt++;
			if(ins_cnt>=9) 	ins_cnt=0;
		}
		RI=0;
	}
}
void putbyte(char c)	//发送一个字节
{
	DE_RE=1;	//允许串口输出
	ES = 0;	//暂停串行中断,以免数据比较时出错
	SBUF = c;
	while(TI==0);
	TI = 0;
	DE_RE=0;	//允许串口输入
	ES = 1;
}

⌨️ 快捷键说明

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