📄 text8.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 + -