单片机,用t0方式1定时50ms,t1用方式1门控计数20次,达到1s延迟,点亮一排灯

单片机,用t0方式1定时50ms,t1用方式1门控计数20次,达到1s延迟,点亮一排灯的c语言代码

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在单片机中 设置pwm时会用到定时器,定时器的作用是什么了 详细一些
#define MAIN_Fosc 11059200L //定义主时钟 #include "15W4KxxS4.H" #define uint16 unsigned int #define uint8 unsigned char /************************************** 功能描述:延时函数 入口参数:uint16 x ,该值为1时,延时1ms 返回值:无 ***************************************/ void delay_ms(uint16 x) { uint16 j,i; for(j=0;j<x;j++) { for(i=0;i<1100;i++); } } /************************************************************************************** 功能描述:对PWM3和PWM3进行初始化 入口参数:无 返回值:无 **************************************************************************************/ void PWM2PWM3_Configuration(void) { PWMCFG &= 0xBF; //将CBTADC位置0,即PWM计数器归零时不触发ADC转换 PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零 P_SW2 |= 0x80; //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器 //对PWM2的初始化部分 PWM2CR |= 0x08; //将PWM2_PS位置1,选择PWM2的输出引脚是P2.7 PWMCR |= 0x01; //将ENC2O位置1,PWM2的端口为PWM输出口,受PWM波形发生器控制 PWMCFG &= 0xFE; //将C2INI位置0,设置PWM2输出端口的初始电平为低电平 PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零 PWM2CR |= 0x04; //将EPWM2I位置1,使能PWM2中断 PWM2CR &= 0xFD; //将EC2T2SI位置0,关闭T2翻转时中断 PWM2CR &= 0xFE; //将EC2T1SI位置0,关闭T1翻转时中断 //对PWM3的初始化部分 PWM3CR |= 0x08; //将PWM3_PS位置1,选择PWM3的输出引脚是P4.5 PWMCR |= 0x02; //将ENC3O位置1,PWM3的端口为PWM输出口,受PWM波形发生器控制 PWMCFG &= 0xFD; //将C3INI位置0,设置PWM3输出端口的初始电平为低电平 PWMIF &= 0xFD; //将C3IF位置0,PWM3中断标志位,需软件清零 PWM3CR |= 0x04; //将EPWM3I位置1,使能PWM3中断 PWM3CR &= 0xFD; //将EC3T2SI位置0,关闭T2翻转时中断 PWM3CR &= 0xFE; //将EC3T1SI位置0,关闭T1翻转时中断 //对PWM2和PWM3翻转计数器赋初值 PWM2T1 =1; //赋值PWM2第一次翻转计数器值 PWM2T2 = 0x00FA; //赋值PWM2第二次翻转计数器值 PWM3T1 =1; //赋值PWM3第一次翻转计数器值 PWM3T2 = 0x00FA; //赋值PWM3第二次翻转计数器值 //对PWM波形发生器时钟源进行初始化 PWMCKS |= 0x10; //将SELT2位置1,PWM时钟源为定时器2溢出脉冲 PWMC = 0x00FA; //PWM计数器赋值(同时对PWMCH和PWMCL进行了赋值) AUXR |= 0x04; //定时器2时钟为Fosc,即1T T2L = 0xE0; //设定定时初值 T2H = 0xFE; //设定定时初值 AUXR |= 0x10; //启动定时器2 P_SW2 &= 0x7F; //将EAXSFR位置0,恢复访问XRAM //PWM外部异常控制寄存器的操作 PWMFDCR &= 0xDF; //将ENFD位置0,关闭PWM外部异常检测功能 PWMFDCR &= 0xF7; //将ENDI位置0,关闭PWM异常检测中断 PWMFDCR &= 0xFB; //将FDCMP位置0,比较器与PWM无关 PWMFDCR &= 0xFD; //将FDIO位置0,P2.4的状态与PWM无关 PWMFDCR &= 0xFE; //将FDIF位置0,PWM异常检测中断标志位,需软件清零 IP2 |= 0x40; //将PPWM位置1,使能PWM中断为最高优先级中断 //使能PWM波形发生器 PWMCR |= 0x80; //将ENPWM位置1,使能PWM波形发生器,PWM计数器开始计数 PWMCR &= 0xBF; //将ECBI位置0,禁止PWM计数器归零中断 } /*************************************************************************** * 描 述 : PWM中断服务函数 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void PWM(void) interrupt PWM_VECTOR using 1 { PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零 PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零 PWMIF &= 0xFD; //将C3IF位置0,PWM3中断标志位,需软件清零 } /******************************************************** 功能描述:主函数 入口参数:无 返回值:无 *********************************************************/ int main() { uint8 flag=1; uint16 ledpwmval=0; ///////////////////////////////////////////////// //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 ///////////////////////////////////////////////// P2M1 &= 0x7F; P2M0 &= 0x7F; //设置P2.7为准双向口 P4M1 &= 0xDF; P4M0 &= 0xDF; //设置P4.5为准双向口 PWM2PWM3_Configuration(); //初始化PWM2和PWM3口 EA = 1; //允许总中断 while(1) { delay_ms(100); //延迟每次指示灯亮度的时间,更方便观察实验现象 if(flag) //如果标识符为1则递增变量ledpwmval ledpwmval++; else //如果标识符为0则递减变量ledpwmval ledpwmval--; if(ledpwmval>248) //如果变量ledpwmval递增到一定值则控制标识符为0,以实现ledpwmval递减 flag=0; if(ledpwmval==1) //如果变量ledpwmval递减到一定值则控制标识符为1,以实现ledpwmval递增 flag=1; P_SW2 |= 0x80; //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器 PWM2T1 =(uint16)ledpwmval; //赋值PWM2第一次翻转计数器值(不断变化值) PWM2T2 = 0x00FA; //赋值PWM2第二次翻转计数器值(定值) PWM3T1 =(uint16)ledpwmval; //赋值PWM3第一次翻转计数器值(不断变化值) PWM3T2 = 0x00FA; //赋值PWM3第二次翻转计数器值(定值) P_SW2 &= 0x7F; //将EAXSFR位置0,恢复访问XRAM } }
51单片机加入定时器的定义和中断后,手机APP与单片机只能连接几秒,问题出在哪里
在原来的单片机代码中加入void TF0_isr() interrupt 1和在void InitUART(void)里定义了定时器 ET0=1;TH0=56320/256; L0=56320%256; TR0=1;后,拷到单片机里,手机APP连接WiFi建立链接后,几秒后断开链接,有时甚至无法建立链接。 是串口中断和定时器中断冲突了吗? 请问问题出在哪里,怎么解决 原来正常的情况:单片机和APP连接后,APP能控制LED1、2的亮灭,并显示LED等的状态 #include "DHT11.h" #include <stdio.h> #include "string.h" extern unsigned char F16T,F16RH; //温湿度数据 sbit LED1=P3^7; sbit LED2=P3^6; #define uchar unsigned char #define uint unsigned int unsigned char idata Rxbuff[50],Rxnum; unsigned char Recwifi_data[5]; char *strx=0; char clinetid;//连接ID unsigned char getflag;//获取标志 void Get_Clinet(void); void InitUART(void) //这是串口和定时器的基本配置,配置他的波特率是9600.这些参数都是标准的。 { TMOD|= 0x21; SCON = 0x50; TH1 = 0xFD; TL1 = TH1; PCON = 0x00; EA = 1; //启动中断系统 ES = 1; TR1 = 1; ET0=1;// 定时器的定义 TH0=56320/256; //计数起点为56320 ==10ms溢出一次 TL0=56320%256; TR0=1; } void Clear_Buffer(void)//清空缓存 { int i; // for(i=0;i<50;i++) // Rxbuff[i]=0;// Rxnum=0; } /******************************************************************************/ void delayms(unsigned int x) { unsigned int i; while(x--) for(i=125;i>0;i--); } /* * UART 发送一字节 */ void UART_send_byte(char dat) { SBUF = dat; while (TI == 0); TI = 0; } /* * UART 发送字符串 */ void Send_Str(unsigned char *buf) { while (*buf != '\0') { UART_send_byte(*buf++); } } void ESP8266_SERVER(void)//服务器建立 { Send_Str("AT\r\n"); delayms(500); Send_Str("AT\r\n"); delayms(500); Send_Str("AT\r\n"); delayms(500); Send_Str("ATE0\r\n"); //关闭回显 delayms(500); Send_Str("AT+CWSAP=\042ESP8266_001\042,\0421234567890\042,5,3\r\n"); //设置显示名称和密码 delayms(500); Send_Str("AT+CIPMUX=1\r\n");//启动多连接,建立服务器都需要配置 delayms(500); Clear_Buffer(); Send_Str("AT+CIPSERVER=1,8888\r\n");//建立服务器 delayms(500); strx=strstr((const char*)Rxbuff,(const char*)"OK");//等待建立完成 while(strx==NULL) { Clear_Buffer(); delayms(500); strx=strstr((const char*)Rxbuff,(const char*)"OK");//等待建立完成 } Clear_Buffer(); } void Get_Clinet(void)//判断是否获取到了客户端接入 { uchar i; strx=strstr((const char*)Rxbuff,(const char*)"CONNECT");//返回连接值 if(strx) { Clear_Buffer(); getflag=1; } strx=strstr((const char*)Rxbuff,(const char*)"CLOSE");//返回断开连接 if(strx) { Clear_Buffer(); getflag=0; } if(getflag) { strx=strstr((const char*)Rxbuff,(const char*)"+IPD");//有数据返回 if(strx)//正常获取数据 { clinetid=strx[5]; strx=strstr((const char*)Rxbuff,(const char*)":");//有数据返回 for(i=0;i<2;i++) Recwifi_data[i]=strx[1+i]; //获取手机对LED的控制 if( Recwifi_data[0]=='1'&& Recwifi_data[1]=='0' )//关灯 LED1=1; else if( Recwifi_data[0]=='1'&& Recwifi_data[1]=='1' )//开灯 LED1=0 ; if( Recwifi_data[0]=='2'&& Recwifi_data[1]=='0' )//关灯 LED2=1; else if( Recwifi_data[0]=='2'&& Recwifi_data[1]=='1' )//开灯 LED2=0 ; Clear_Buffer(); } } } void Send_DATA(uchar *buffer) { uchar i; Send_Str("AT+CIPSEND=0,7\r\n"); delayms(300); Send_Str(buffer);//发送数据 delayms(100); strx=strstr((const char*)Rxbuff,(const char*)"SEND OK");//返回OK while(strx==NULL) { delayms(100); strx=strstr((const char*)Rxbuff,(const char*)"SEND OK");//返回OK } strx=strstr((const char*)Rxbuff,(const char*)"+IPD");//有数据返回 ,顺便判断是否有数据返回 if(strx)//正常获取数据 { clinetid=strx[5]; strx=strstr((const char*)Rxbuff,(const char*)":");//有数据返回 for(i=0;i<5;i++) Recwifi_data[i]=strx[1+i]; //获取上位机设定的报警值 Clear_Buffer(); } Clear_Buffer(); } void main() { unsigned char Tx_Buf[10]; uchar i; unsigned char LEDstatus;//灯的状态 delayms(500); delayms(500); delayms(1000); //延时一段时间,让WIFI模块稳定 InitUART(); //初始化串口 ESP8266_SERVER(); IP = 0x10; // PS = 1; // PT0=0; //初始化ESP8266 while(1) { Get_Clinet(); if(getflag) { getDHT11(); //获取温湿度值 Tx_Buf[0]='T'; //帧头 Tx_Buf[1]=F16T/10%10+0x30; //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示 Tx_Buf[2]=F16T%10+0x30; Tx_Buf[3]=F16RH/10%10+0x30; Tx_Buf[4]=F16RH%10+0x30; LEDstatus=LED1; Tx_Buf[5]=LEDstatus+0x30;//发送灯的状态 LEDstatus=LED2; Tx_Buf[6]=LEDstatus+0x30; Send_DATA(Tx_Buf) ;//发送数据 } } } /*****************串口接收中断函数,接收蓝牙模块的数据*********************/ void UARTInterrupt(void) interrupt 4 { if(RI) { ES=0; RI = 0; Rxbuff[Rxnum++]=SBUF; if(Rxnum>=50) Rxnum=0; ES=1; } } void TF0_isr() interrupt 1 //10ms 进入一次 { static int c1; //执行一条指令12个周期,12/11.059M =1.08507us 10ms需要9216个周期 TH0=56320/256; //重装初值 TL0=56320%256; c1++; if(c1>400){ LED1=0; } if(c1>600) { LED1=1; c1=0; } }
ATmega16A 定时器0 不明原因程序不运行
想用定时器实现按毫秒定时(输入多少毫秒就定多少) 配置了MCUCR GICR TIMSK SREG TCCR0 TCNT0 中断函数 以及输出电平 熔丝位设置:CKOPT:0 CKSEL:1111 SUT:10 外部12M晶振 功能就是让数码管亮 锁存控制具体哪个数码管 for循环延时正常 通电瞬间会全亮一下然后循环 现在用定时器 不知道什么原因 通电之后全亮了 应该是卡在程序开头 然而开头只是个io口电平设置啊 环境 CodeBlocks13.12 编译器 WinAVR 刚才测了输出的电平 用1个单片机测的是3.66V 另1个是3.11V 都不是高电平 ``` #include <avr/io.h> //#include <avr/iom16a.h> //#include <avr/iom16.h> unsigned int digits[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-10和无数字 unsigned int count0 = 0; unsigned int ms = 0; void portInit(void) { //A输出到数码管,B输出到锁存LE //先规定电平后规定方向防止默认电平 PORTA = 0x00; DDRA = 0xff; PORTB = 0x00; DDRB = 0xff; PORTC = 0x00; DDRC = 0xff; PORTD = 0x00; DDRD = 0xff; } //#define _TC0_ #ifndef _TC0_ void timer0Init(void) { SREG = 0x80; //全局中断 Page7 TIMSK = 0x01; //T/C0 Page 80 TCNT0 = 209; TCCR0 = 0x04; //256分频 Page79 } void timer0Off(void) { SREG = 0x00; //全局中断 Page7 TIMSK = 0x00; //T/C0 Page 80 TCCR0 = 0x00; } /* //针对晶振12M void delayMs(unsigned int ms) { unsigned int count0 = 0; TCNT0 = 209; while(1) { TCCR0 = 0x04; //256分频 Page79 if(++count0 >= ms) { TCCR0 = 0x00; //count0 = 0; break; } else { } } } */ void delayMs(unsigned int mss) { timer0Init(); ms = mss; } #pragma interrupt_handler timer0Ovf: 10 //中断向量 Page43 void timer0Ovf(void) { TCNT0 = 209; //重装计数初值 if(++count0 >= ms) { timer0Off(); count0 = 0; ms = 0; } } void main(void) { unsigned int i; portInit(); timer0Off(); GICR = 0x00; MCUCR = 0x00; //Page30 PORTB = 0x3f; PORTA = digits[10]; while(1) { for(i=0;i<11;i++) { delayMs(300); PORTA = digits[i]; } } } #else //for循环延时 void main(void) { unsigned int i,j; portInit(); PORTB = 0x3f; PORTA = digits[10]; while(1) { for(j=0;j<11;j++) { for(i=0;i<20000;i++) { } PORTA = digits[j]; } } } #endif ```
C语言 单片机秒表程序
本人是一个新手 对于下边的c程序每一个子函数能看懂,但是像这么多子函数放到一起 就晕了,想请亲们帮我把这个程序的流程梳理梳理中断是何时工作,各个子函数怎么在这个整体里运行 越详细越好,本人十分感谢! ``` /* 设计的秒表计数到小数点后两位,(ms)用到六个数码管一个小数点加两位小数*/ #include<reg52.h> sbit ADDR3=P1^3; sbit ENLED=P1^4; sbit KEY1=P2^4; sbit KEY2=P2^5; sbit KEY3=P2^6; sbit KEY4=P2^7; unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[6]={ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF //数码管显示缓存区 }; unsigned char KeySta[4]={1,1,1,1}; bit StopwatchRunning=0; bit StopwatchRefresh=1; unsigned char IntegerPart=0;//整数部分 unsigned char DecimalPart=0;//小数部分 void ConfigTimer0(unsigned int ms); void StopwatchDisplay(); void KeyDriver(); void main() { EA=1; ENLED=0; ADDR3=1; P2=0XFE;//P2.0置零选第四行按键 ConfigTimer0(2);//T0定时2ms while(1) { if(StopwatchRefresh) //如果刷新需要调用显示函数 StopwatchRefresh=0; StopwatchDisplay(); KeyDriver(); } } /*配置并启动T0 ms就是T0的定时时间*/ void ConfigTimer0(unsigned int ms) { unsigned long tmp; tmp=11059200/12;// 1/T=f频率 tmp=(tmp*ms)/1000; // ms/1000=1s f*T=机械周期个数 tmp=65536-tmp; tmp=tmp+18; T0RH=(unsigned char)(tmp>>8); T0LH=(unsigned char)tmp; TMOD&=0xF0; TMOD|=0x01; TH0=T0RH; TL0=T0RL; ET0=1; TR0=1; } /*秒表计数显示函数*/ void StopwatchDisplay() { signed char i; unsigned char buf[4];//同理数据转换的缓冲区 /*小数部分转换到低2位*/ LedBuf[0]=LedChar[DecimalPart%10]; LedBuf[1]=LedChar[DecimalPart/10]; /*整数部分换到高4位 注意这里和小数部分区别是要用到缓存*/ buf[0]= IntegerPart%10; buf[0]= IntegerPart/10%10; buf[0]= IntegerPart/100%10; buf[0]= IntegerPart/1000%10; for(i=3;i>=1;i++)//把高位为零的换成空字符 { if(buf[i]==0) LedBuf[i+2]=0xFF;//置空 else break; } for(;i>=0;i--) { LedBuf[i+2]=LedChar[buf[i]]; } LedBuf[i+2]=0x7F;//运行到整数的最后一位上顺便点亮小数点 } /*秒表复位*/ void StopwatchReset() { StopwatchRunning=0; //停止秒表 IntegerPart=0; DecimalPart=0; StopwatchReset=1//重置刷新标志 } /*秒表启停函数*/ void StopwatchAction() { if(StopwatchRunning)//若是已经启动则停止 StopwatchRunning=0; else StopwatchRunning=1;//若是已经停止则启动 } /*按键驱动函数,检测到有按键动作,调度相应动作函数,只有两个按键另外四个。注意:需要在主函数调用*/ void KeyDriver() { unsigned char i; static unsigned char backup[4]=[1,1,1,1]; for(i=0;i<4;i++) { if(backup[i]!=KeySta[i]) { if(backup[i]!=0) { if(i==1) StopwatchReset(); else if(i==2) StopwatchAction(); } backup[i]=KeySta[i]; } } } /*数码管动态扫描刷新函数,注意:需在定时中断中调用*/ void LedScan() { static unsigned char i=0; P0=0XFF; P1=(P1&0xF8)|i; P0=LedBUF[i]; if(i<5) //在C里,i>5 i=0 继续走!!! i++; else i=0; } void KeyScan() { unsigned char i; static unsigned char keybuff[4]={ 0xFF,0xFF,0xFF,0xFF }; keybuff[0]=(keybuff[0]<<1)| KEY1; keybuff[1]=(keybuff[1]<<1)| KEY1; keybuff[2]=(keybuff[2]<<1)| KEY1; keybuff[3]=(keybuff[3]<<1)| KEY1; for(i=0;i<4;i++) { if(keybuff[i]==0x00)//连续8次扫描为0, 2ms*8(得移动8位上面才能有结果) { KeySta[i]=0; } else if(keybuff[i]==0xFF) { KeySta[i]=1; } } } /* 秒表计数函数,每隔10ms调用一次进行秒表计数累加 */ void StopwatchCount() { if (StopwatchRunning) //当处于运行状态时递增计数值 { DecimalPart++; //小数部分+1 if (DecimalPart >= 100) //小数部分计到100时进位到整数部分 { DecimalPart = 0; IntegerPart++; //整数部分+1 if (IntegerPart >= 10000) //整数部分计到10000时归零 { IntegerPart = 0; } } StopwatchRefresh = 1; //设置秒表计数刷新标志 } } /*T0中断函数,完成数码管扫描、按键扫描与秒表计数*/ void InterruptTimer0() interrupt 1 { static unsigned char tmr10ms =0; TH0=T0RH; TL0=T0RL; LedScan(); KeyScan(); //定时10ms进行一次秒表计数 tmr10ms++; if(tmr10ms>=5) //2ms一次 2*5=10ms { tmr10ms=0; StopwatchCount(); } } ```
【单片机】三位数码管显示0.0-60.0然后清零,中途在25秒的时候却清零了
如题,我本来是想写数码管循环显示程序,从0.0开始计数,到60.0清零。可是中途在25秒的时候就清零了,这是怎么回事呢? #include<reg52.h> unsigned char code Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code THEN[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x0,0x10,0xff}; unsigned char int_time; //记录中断次数 unsigned char second; //储存秒 /*********************************************************************** 函数功能:快速动态扫描延时 ************************************************************************/ void delay(void) { unsigned char i; for(i=0;i<200;i++) ; } /*********************************************************************** 函数功能:显示秒 ************************************************************************/ void DisplaySecond(unsigned char k) { P2=0xdf; //P2.6引脚输出低电平, DS6点亮 P0=Tab[k/100%10]; //显示十位 delay(); P2=0xbf; //P2.7引脚输出低电平, DS7点亮 P0=THEN[k/10%10]; //显示个位 delay(); P2=0x7f; P0=Tab[k%10]; delay(); P2=0xff; //关闭所有数码管 P0=0xff; //显示个位 delay(); } void main(void) //主函数 { TMOD=0x01; //使用定时器T0 TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微秒 50ms //=50000微秒=50毫秒 TL0=(65536-46083)%256; EA=1; //开启总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0开始运行 int_time=0; //中断次数初始化 second=0; //秒初始化 while(1) { DisplaySecond(second); //调用秒的显示子程序 } } //******************************************************** //函数功能:定时器T0的中断服务程序 //******************************************************* void interserve(void ) interrupt 1 using 1 { TR0=0; //关闭定时器T0 int_time ++; //每来一次中断,中断次数int_time自加1 if(int_time==2) //够2次中断,即100ms进行一次检测结果采样 { int_time=0; //中断次数清0 second++; //1/10s加1 if(second==600) second =0; } TH0=(65536-46083)/256; //重新给计数器T0赋初值 TL0=(65536-46083)%256; TR0=1; //启动定时器T0 }
单片机运行出现 expression with possibly no effect
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit CS88 = P2^2; //8X8点阵使能 sbit DS1302=P2^7; //HJ-C52主板 时钟复位 关掉DS1302 以免影响其他IO口实验。 sbit LCD1602=P2^5;//HJ-C52主板 LCD1602复位 关掉LCD1602显示 以免影响其他IO口实验。 void delay1(); //Motor sbit F1 = P1^0; sbit F2 = P1^1; sbit F3 = P1^2; sbit F4 = P1^3; unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转 unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转 unsigned int K, rate; sbit dula=P2^6; sbit wela=P2^7; sbit LCD_RS = P1^0; sbit LCD_RW = P1^1; sbit LCD_EN = P2^5; int time; int succeed_flag; uchar timeL; uchar timeH; uchar distance; uchar H; sbit Trig=P2^4; sbit Echo=P3^2; uchar code dis1[] = {"The juli is: "}; uchar dis2[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; /********************************************************** * * * 步进电机驱动 * ***********************************************************/ void motor_ffw(void) { unsigned char i; for (i=0; i<8; i++) //一个周期转30度 { P1 = FFW[i]&0x1f; //取数据 delay1(); //调节转速 } } /******************************************** 延时程序 *********************************************/ void delay1(void) { unsigned int k,t; t=rate; while(t--) { for(k=0; k<150; k++) { } } } /******************************************************** * *步进电机运行 * *********************************************************/ void motor_turn(void) { unsigned char x; rate=0x0a; x=0x40; do { motor_ffw(); //加速 rate--; }while(rate!=0x01); do { motor_ffw(); //匀速 x--; }while(x!=0x01); do { motor_ffw(); //减速 rate++; }while(rate!=0x0a); } void delay2(int ms) { int i; while(ms--) { for(i = 0; i< 110; i++) { _nop_(); } } } void delay2_20us() { uchar a ; for(a=0;a<100;a++); } bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80); LCD_EN = 0; return result; } void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; } void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; _nop_(); _nop_(); LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; } void lcd_pos(uchar pos) { lcd_wcmd(pos|0x80); //数据指针=80+地址变量 } void lcd_init() { dula=0; wela=0; lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay2(5); lcd_wcmd(0x38); delay2(5); lcd_wcmd(0x38); delay2(5); lcd_wcmd(0x0c); //显示开,关光标 delay2(5); lcd_wcmd(0x06); //移动光标 delay2(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay2(5); } main() { uchar i,a,b,c; delay2(10); lcd_init(); // 初始化LCD Trig=0; //首先拉低脉冲输入引脚 EA=1; //打开总中断0 TMOD=0x10; //定时器1,16位工作方式 while(1) { EA=0; //关总中断 Trig=1; //超声波输入端 delay2_20us(); //延时20us Trig=0; //产生一个20us的脉冲 while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志 EA=1; EX0=1; //打开外部中断0 TH1=0; //定时器1清零 TL1=0; //定时器1清零 TF1=0; //计数溢出标志 TR1=1; //启动定时器1 delay2(20); //等待测量的结果 TR1=0; //关闭定时器1 EX0=0; //关闭外部中断0 if(succeed_flag==1) { time=timeH*256+timeL; distance=time*0.0172; //毫米 H=100 - distance; } if(succeed_flag==0) { distance=0; //没有回波则清零 } a=H/100; b=(H%100)/10; c=H%10; lcd_wcmd(0x06); //向右移动光标 lcd_pos(0); //设置显示位置为第一行的第1个字符 i = 0; while(dis1[i] != '\0') { //显示字符 lcd_wdat(dis1[i]); i++; delay2(2); //控制两字之间显示速度 } lcd_pos(0x45); //设置显示位置为第二行第1个字符 lcd_wdat(dis2[a]); delay2(2); lcd_wdat(dis2[b]); delay2(2); lcd_wdat(dis2[c]); delay2(2); lcd_wdat('c'); delay2(2); lcd_wdat('m'); delay2(2); if(distance>10) motor_turn; } } void exter() interrupt 0 // 外部中断0是0号 { EX0=0; //关闭外部中断 timeH =TH1; //取出定时器的值 timeL =TL1; //取出定时器的值 succeed_flag=1;//至成功测量的标志 } void timer1() interrupt 3 // { TH1=0; TL1=0; } 出现这种情况为什么MAIN.C(252): warning C275: expression with possibly no effect
单片机智能小车循迹延时
#include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit IN1=P1^0; sbit IN2=P1^1; sbit IN3=P1^2; sbit IN4=P1^3; sbit EN1=P1^4; // 左电机使能 sbit EN2=P1^5; // 右电机使能 ////定义两路循迹灯//// sbit z=P2^3; sbit y=P2^4; sbit m=P2^5; uint i,j; #define left_qianmoto_go {EN1=1,IN1=0,IN2=1;} //前左电机向前走 #define left_qianmoto_back {EN1=1,IN1=1,IN2=0;} //前左边电机向后转 #define left_qianmoto_stop {EN1=0;} //前左边电机停转 #define right_qianmoto_go {EN2=1,IN3=1,IN4=0;} //前右边电机向前走 #define right_qianmoto_back {EN2=1,IN3=0,IN4=1;} //前右边电机向后走 #define right_qianmoto_stop {EN2=0;} //前右边电机停转 uchar left_zkb; //定义左电机占空比 uchar right_zkb; //定义右电机占空比 uchar t; //定义定时器中断计数器 void xunji(); //循迹程序 void run(); //前进函数 void right(); //右转函数 void left(); //左转函数 void stop(); void back(); void t0_init(); //定时器0初始化函数 void main() //主函数 { t0_init(); //定时器初始化 while(1) { xunji(); //不断调用循迹子程序 } } /*********************循迹程序***********************************/ void xunji() { ////////0亮灯 表示 接收到 信号,代表没有处于黑线///////////// ////////1灭灯 表示 没接收 到信号,代表处于黑线中/////////// if(z==1&&m==1&&y==1)//十字路口,左 { run(); for(i=1000;i>0;i--) for(j=110;j>0;j--); left(); for(i=1000;i>0;i--) for(j=110;j>0;j--); } if(z==0&&m==1&&y==0)//循迹 { run(); } } /*********中断服务函数产生占空比方波用于占空比调速****************/ /* PWM产生118次中断,每次中断为100us,即T约等于11.8ms */ void timer0 () interrupt 1 { TH0= 0XFF; //100us定时 TL0= 0X9c; //100us定时 t++; if(t>=200) //限定周期 118次中断以后清空 t=0; /*********左电机PWM调速********/ if(t<left_zkb) {EN1=1; } else {EN1=0;} /********右电机PWM调速**********/ if(t<right_zkb) {EN2=1;} else {EN2=0;} } void run(void) //前进函数 { left_zkb=14; right_zkb=14; left_qianmoto_go; left_zkb=14; right_zkb=14; right_qianmoto_go;} void left(void) //左转函数 {left_zkb=14; right_zkb=14; right_qianmoto_back; left_zkb=14; right_zkb=14; left_qianmoto_go; } void right(void) //右转函数 { left_zkb=14; right_zkb=14; right_qianmoto_go; left_zkb=14; right_zkb=14; left_qianmoto_back;} void stop(void) {left_qianmoto_stop; right_qianmoto_stop;} void back(void)//返回函数 {left_zkb=14; right_zkb=14; left_qianmoto_back; left_zkb=14; right_zkb=14; right_qianmoto_back;} void t0_init() //定时器初始化函数 { TMOD=0x01; TH0= 0XFF; //100us定时 TL0= 0X9c; //100us定时 EA=1; ET0=1; TR0=1; } 为什么一加for延时就不能用,电机不转,但是发错吱吱的声音!一去掉就可以!
如何修改程序使单片机工作周期缩短至一秒内
#include "reg51.h" #include<stdio.h> #include<intrins.h> //打开头文件 #define uint8 unsigned char #define uint16 unsigned int #define uchar unsigned char #define uint unsigned int //宏定义 uint16 cnt2ms; //10ms计数器 uint8 cnt1s; //1秒计数器 //电阻-------------------------------- #define Z1 13700053.00 #define Z2 3685279.00 float RZ=0; unsigned long RX=0; unsigned long RX2=0; unsigned long RX3=0; unsigned long RX4=0; unsigned long RX5=0; unsigned long RX6=0; unsigned long RX7=0; unsigned long RX8=0; unsigned long RX9=0; //电感-------------------------------- float LZ=0; #define C1 0.0461 //电容-------------------------------- float CZ=0; float CX=0; #define R1 24874 uint8 KL=0; // unsigned int Pulsecnt=0; //脉冲个数 unsigned int Pulsenum; //脉冲个数 uint8 start=0; // uint16 PulseTime; //10ms计数器 uint16 Pulse; //10ms计数器 bit flag=0; uint8 CH=0; // unsigned long x; void Init_Extint(void); void TimerInitProc(); void Init_System(void); void Display(uint8 chose_dat, uint8 dat); void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s); void DelayMs(uint8 Ms); uint8 Pulse_FLAG=0; uint8 Pulse_5=0; /********************************LCD液晶**************************************/ #define LCD_Data P0 //LCD的数据口 sbit LCD_BF=LCD_Data^7; //LCD忙信号位 sbit LCD_RS=P2^5; sbit LCD_RW=P2^6; sbit LCD_EN=P2^7; #define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位 //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动 //设置显示、光标及闪烁开、关 #define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM #define LCD_LEFT_MOVE 0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 //工作方式设置 #define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 /*定义子程序*/ void LCD_ClrAll(void); //清屏 void Judge_LCD_busy(void); //检测是否忙碌 void LCD_Write(uchar WriteData); //写控制字 void LCD_write_data(uchar LCD_data); //写数据显示 void LCD_cursor(uchar x); //光标起始地址 void LCD_printc(unsigned char lcd_data) ; //输出一个字符 void LCD_prints(unsigned char *lcd_string);//输出字符串 /*LCD1602忙碌判断子程序*/ void Judge_LCD_busy(void) //判断LCD1602是否忙状态 { while(1) { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_Data=0xff; LCD_EN=1; //EN 是 1—0 使能 if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。 } LCD_EN=0; } /******LCD清屏***************/ void LCD_ClrAll(void) { Judge_LCD_busy(); //判断是否忙碌 LCD_RS=0; LCD_RW=0; LCD_Data=0x01; LCD_EN=1; LCD_EN=0; } /*******LCD写数据定义各种模式*********/ void LCD_Write(uchar WriteData) //写指令到LCD { Judge_LCD_busy(); LCD_RS=0; LCD_RW=0; P0=WriteData; //把WriteData的数据送到数据口 LCD_EN=1; LCD_EN=0; } /********LCD显示数据***********/ void LCD_write_data(uchar LCD_data) //输出一个字节数据到LCD { Judge_LCD_busy(); LCD_RS=1; LCD_RW=0; P0=LCD_data; LCD_EN=1; LCD_EN=0; } /****光标位置的确定***/ void LCD_cursor(uchar x) //LCD光标定位到x处 { LCD_Write(0x80+x); //第一行地址是0x80 } /*输出一个字符*/ void LCD_printc(unsigned char lcd_data) { LCD_write_data(lcd_data); } /*输出字符串*/ void LCD_prints(unsigned char *lcd_string) { unsigned char i=0; while(lcd_string[i]!=0x00) { LCD_write_data(lcd_string[i]); i++; } } /*初始化程序*/ void LCD_initial(void) //初始化LCD { LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_Write(LCD_DISPLAY_DOUBLE_LINE); LCD_ClrAll(); } /****延时******/ void delay_1ms(uint x) { uint j; uchar i; for(j=0;j<x;j++) { for(i=0;i<120;i++); } } void Value_to_ASCII(unsigned long value,uchar add) { unsigned char temp[] = "0000.000K "; temp[0] = value/1000000 + 0x30;//数值改成字符,液晶显示需要ASCII码 value = value%1000000; temp[1] = value/100000 + 0x30; value = value%100000; temp[2] = value/10000 + 0x30; value = value%10000; temp[3] = value/1000 + 0x30; value = value%1000; temp[5] = value/100 + 0x30; value = value%100; temp[6] = value/10 + 0x30; value = value%10; temp[7] = value + 0x30; LCD_cursor(add); //光标起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f LCD_prints(temp); } //--------------------主程序-------------------------------- void main() { TMOD=0x51; //设置定时器0,方式1:16位定时器 TH1=0; TL1=0; TH0=(65536-2000)/256; //设定定时周期 TL0=(65536-2000)%256; TR0=1; //打开定时器0 TR1=1; //打开定时器1 ET1=1; ET0=1; EA=1; //打开总中断 LCD_initial(); delay_1ms(50); LCD_initial(); delay_1ms(50); LCD_cursor(0x00); LCD_prints(" MEASURE Rx "); LCD_cursor(0x45); while(1) { if(flag==1) { flag=0; x=Pulsenum*65536+TH1*256+TL1;//计算1s内的脉冲个数,频率=脉冲个数 RZ=(Z1/x);//测量100到1000 RX=RZ-1000; RX=RX>>1; if(RX>=1005){ RX=RX-1005;}else{RX=0;} if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;} if(RX>1000000){RX=1000000; } RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度 RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX; //保存上一次的阻值 Value_to_ASCII(RX2,0x44);//更新阻值显示 cnt2ms=0; Pulsenum=0; TH1=0; TL1=0; TR1=1; } } } /******************************************************************************* * 函 数 名: Exti0_interrupt * 函数功能: /T0引脚下降沿进入中断 * 入口参数: 无 * 返 回: 无 *******************************************************************************/ void T1_interrupt(void) interrupt 3 using 0 { Pulsenum++; //保存测得脉冲值 } /******************************************************************** 函数功能:定时器/计数器1中断处理 入口参数:null 返 回:null 备 注:null ********************************************************************/ void Timer0IntProc() interrupt 1 using 0 //2ms { TH0=(65536-2000)/256; TL0=(65536-2000)%256; cnt2ms++; if(cnt2ms==497) //1s计时到 { TR1=0; cnt2ms = 0; flag=1; } }
1602液晶屏一排方格,新手上路求指教
#include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^0; //ds18b20 与单片机连接口 sbit RS=P1^1; sbit RW=P1^2; sbit EN=P1^3; sbit p37=P3^6; //流量正常运行接口 sbit p36=P3^7; //温度报警接口 sbit p14=P1^4; //功能按键接口 sbit p15=P1^5; sbit p16=P1^6; uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20}; //0-9 数字和显示无 unsigned long int a; float f,zong; uint tvalue; uchar n1,n2,n3,n4,n5,n6,n7,n8,n9; uchar tflag,d,g,kai,j,j1,j2,b; /************************延时子程序**************************/ void delay (uint z) { int x,y; for(x=z;x>0;x--) for(y=120;y>0;y--) ; } /***************延时 1us 子程序**********************/ void delay_18B20(unsigned int i)//延时 1 微秒 { while(i--); } /***************液晶显示写指令*******************************/ void wr_com(unsigned char com) //写指令 { delay(1); //延时 1ms RS=0; //写命令设置 RW=0; //并行数据的读写 EN=0; //使能为 0 P2=com; //输入命令 delay(1); //延时 1ms EN=1; //使能为 1 delay(1); //延时 1ms EN=0; //使能为 0 } /************液晶显示写数据**************************/ void wr_dat(unsigned char dat)//写数据 { delay(1); //延时 1ms RS=1; //写数据设置 RW=0; //并行数据的读写 EN=0; //使能为 0 P2=dat; //输入数据 delay(1); //延时 1ms EN=1; //使能为 1 delay(1); //延时 1ms EN=0; //使能为 0 } /***********水流量计算程序与数据转换程序******************/ void loop () { uint zong1; if(g==0) //判断时间是否到 { zong=(b/100.0)+zong; //得出总流量的后三位 } g=1; //将标志为为 1 if(zong>=1000) //判断总流量后三位是否大于 1000 { a++; //总流量前六位加 1 zong=0; //后三位清零 } if(a>=1000000) //总流量前六位大于 1 百万 { a=0; //总流量前六位清零 } zong1=(int)zong ; //总流量后三位转换为整形 n9=a/100000; //总流量 9 位全部分配 n8=a%100000/10000; n7=a%10000/1000; n6=a%1000/100; n5=a%100/10; n4=a%10; n3=zong1%1000/100; n2=zong1%100/10; n1=zong1%10; } /*********************水费计算与数据转换************************/ void shuifei() { uchar h1,h2,h3,h4; h4=(j*a)/1000000; //水费显示 h3=(j*a)%1000000/100000; h2=(j*a)%100000/10000; h1=(j*a)%10000/1000; wr_com(0x80+10); //水费显示 wr_dat(0x5c); wr_dat(table[h4]); wr_dat(table[h3]); wr_dat(table[h2]); wr_dat(0x2e); //显示小数点 wr_dat(table[h1]); } /**********************ds1820 复位子程序*****************/ void ds1820rst() { unsigned char x=0; DQ = 1; //DQ 复位 delay_18B20(4); //延时 DQ = 0; //DQ 拉低 delay_18B20(100); //精确延时大于 480us DQ = 1; //拉高 delay_18B20(40); //延时 } /***********ds1820 读数据子程序********************/ uchar ds1820rd() //读数据 { unsigned char i=0; unsigned char dat=0; - 42 - for (i=8;i>0;i--) //读温度 2 进制 8 次 { DQ = 0; //给脉冲信号 dat>>=1; //将温度数据转移到 dat DQ = 1; //给脉冲信号 if(DQ) //数据转换 dat|=0x80; delay_18B20(10); } return(dat); } /**************ds1820 写数据子程序********************/ void ds1820wr(uchar wdata) { unsigned char i=0; for (i=8; i>0; i--) //写数据 2 进制 8 次 { DQ = 0; //给脉冲信号 DQ = wdata&0x01; //数据传送 delay_18B20(10); //延时 DQ = 1; //给脉冲信号 wdata>>=1; //数据移位 } } /*****************ds1820 温度转换程序****************************/ uint read_temp() { uchar a,b; ds1820rst(); //ds1820 复位 ds1820wr(0xcc); //跳过读序列号 - 43 - ds1820wr(0x44); //启动温度转换 ds1820rst(); //ds1820 复位 ds1820wr(0xcc); //跳过读序列号 ds1820wr(0xbe); //读取温度 a=ds1820rd(); //将温度数据给 a b=ds1820rd(); //将温度数据给 b tvalue=b; //将温度数据转移 tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) //是正温度吗 tflag=0; //正温度标志 else { tvalue=~tvalue+1; //负温度,取反加 1 tflag=1; //负温度标志 } tvalue=tvalue*(0.625);//温度值扩大 10 倍,精确到 1 位小数(0.0625) return(tvalue); } /****************ds1820 温度显示子程序*************************/ void ds1820disp( ) { uchar t1,t2,t3,t4; t3=tvalue/1000; //百位数 (0-9 是 0x30-0x39) 温度值放大了十倍 t2=tvalue%1000/100; //十位数 t1=tvalue%100/10; //个位数 t4=tvalue%10; //小数位 if(tflag==1) { wr_dat(0x2d);//负温度显示负号:- } else p37=1; if(t3!=0) { t1=9; t2=9; t3=10; t4=9; p37=0; } if(t2>=4) p37=0; else p37=1; if(tflag==1) { p37=0; //负温度显示负号:- } if(t3==0) { t3=10; //如果百位为 0,不显示 if(t2==0) { t2=10; //如果百位为 0,十位为 0 也不显示 } } wr_dat(table[t3]);//显示百位 wr_com(0x80+3); wr_dat(table[t2]);//显示十位 wr_dat(table[t1]);//显示个位 wr_dat(0x2e); //显示小数点 wr_dat(table[t4]);//显示小数位 } /**********************流量程序*******************************/ void liuliang() { while(d>=2) //时间到? { d=0; //d 清零 b=TH0*256+TL0; //读取频率 TH0=0x00; //计数器清零 TL0=0x00; g=0; //时间标志位 } loop(); //水流量计算程序与数据转换程序 } /**************第一页显示子程序***************************/ void display1() { wr_com(0x80); //温度显示 wr_dat(0x54); //显示 T wr_dat(0x3a); //显示: read_temp(); //读取温度 ds1820disp( ); //温度显示 wr_dat(0x00); //显示° wr_dat(0x43); //显示 C shuifei(); wr_com(0x80+0x40); //水流量(t)显示 wr_dat(0x46); wr_dat(0x4c); wr_dat(0x4f); wr_dat(0x57); wr_dat(0x3a); wr_dat(0x20); wr_dat(table[n9]); wr_dat(table[n8]); wr_dat(table[n7]); wr_dat(0x2e); //显示小数点 wr_dat(table[n6]); wr_dat(table[n5]); wr_dat(table[n4]); wr_dat(0x20); //显示小数点 wr_dat(0x74); wr_dat(0x20); } /**************第二页显示子程序**********************/ void display2() { wr_com(0x80); //温度显示 wr_dat(0x54); //显示 T wr_dat(0x3a); //显示: read_temp(); //读取温度 ds1820disp( ); //温度显示 wr_dat(0x00); //显示° wr_dat(0x43); //显示 C wr_com(0x80+10); //水价显示 wr_dat(table[j2]); wr_dat(0x2e); wr_dat(table[j1]); wr_dat(0x5c); wr_dat(0x2f); wr_dat(0x74); wr_dat(0x20); wr_com(0x80+0x40+5);//水流量(kg)显示 wr_dat(0x20); wr_dat(0x20); wr_dat(table[n4]); wr_dat(0x2e); //显示小数点 wr_dat(table[n3]); wr_dat(table[n2]); wr_dat(table[n1]); wr_dat(0x20); wr_dat(0x6b); wr_dat(0x67); } /*****************控制流量测量的开关程序***********************/ void kaiguan1() { if(p14==0) //按键按下? {delay(2); if(p14==0) { delay(2); p36=~p36; //P3.6 取反 TR0=~TR0; //TR0 取反 while(p14==0);//按键松开 } } } /**************界面切换开关程序********************/ void kaiguan2() { if(p15==0) //按键按下? { delay(2); if(p15==0) { delay(2); kai=~kai; //P3.6 取反 while(p15==0);//按键松开? } } } /*****************水的单价控制开关程序************************/ void kaiguan3() { if(p16==0) //按键按下? {delay(2); if(p16==0) { delay(2); j++; //水价加一 if(j>40) //水价大于 40 j=0; //水价清零 j2=j/10; //水价分位 j1=j%10; while(p16==0);//按键松开? } } } /**********************程序初始化******************************/ void lcd_init () { TMOD=0x15; //设定定时器 0 为计数功能,定时器为 1 为定时功能 TH1=(65536-50000)/256;//定时器 1 赋出值 50ms TL1=(65536-50000)%256; TH0=0x00; //定时器 0 赋初值 0 次 TL0=0x00; EN=0; //液晶使能端为 0 wr_com(0x38); //液晶初始设置 wr_com(0x0c); wr_com(0x06); wr_com(0x01); wr_com(0x40); wr_dat(0x06); //写 CGRAM 写字模 wr_dat(0x09); wr_dat(0x09); wr_dat(0x06); wr_dat(0x00); wr_dat(0x00); wr_dat(0x00); wr_dat(0x00); zong=0; //总流量(带小数点) EA=1; //开启总中断 ET1=1; //开启定时器 1 中断 TR1=1; //开启定时器 1 TR0=0; //开启计数器 0 p16=1; //p16 为 1 p15=1 ; //p15 为 1 p14=1; //p14 为 1 zong=995; //总流量的后三位赋初值 - 50 - a=199999; //总流量的前六位赋初值 j=20; //水价赋初值 j2=2; //水价个位赋初值 j1=0; //水价小数位赋初值 kai=0; } /********************主程序****************************/ void main() { lcd_init(); //初始化显示 while(1) { kaiguan1(); //控制水流量的测量 kaiguan2(); //控制显示界面 liuliang(); //流量测量 if(kai==0) //判断界面开关是否按下 display1(); //显示第一页界面 else { kaiguan3(); //判断水价开关是否按下 display2(); //显示第二页界面 } } } /******************定时器 1 中断**********************/ void time1() interrupt 3 { TH1=(65536-50000)/256;//定时器 1 初值定时 50ms TL1=(65536-50000)%256; d++; //20ms 后 d 加 1 }
如何通过串口修改时钟的时间
请问大神们如何在这个程序里添加串口来改变时钟啊 #include<reg51.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ //此表为 LED 的字模, 共阴数码管 0-9 - uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 /*定义并初始化变量*/ uchar seconde=0;//秒 uchar minite=0;//分 uchar hour=12; //时 uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1 uchar shi=0;//闹铃功能 uchar fen=0; uchar bjcs;//报警次数 sbit P1_0=P1^0; //second 调整定义 sbit P1_1=P1^1; //minite调整定义 sbit P1_2=P1^2; //hour调整定义 sbit P1_5=P3^0; //整点报时 sbit P1_3=P1^3; //闹铃功能,调整时间 sbit P1_6=P1^6; //调整时 sbit P1_7=P1^7; //调整分 sbit P1_4=P1^4; //关闭闹铃 /*函数声明*/ void delay(uint k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( ); //键盘扫描子程序 /*延时子程序*/ void delay (uint k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /*时间处理子程序*/ void time_pro(void) { if(seconde==60) { seconde=0; minite++; if(minite==60) { minite=0; hour++; if(hour==24) { hour=0; } } } } /*显示子程序*/ void display(void) { if(P1_3==1) { P2=0XFE; P0=dispcode[seconde%10];//秒个位 delay(1); P2=0XFD; P0=dispcode[seconde/10];//秒十位 delay(1); P2=0XFB; P0=dispcode[10];//间隔符 - delay(1); P2=0XF7; P0=dispcode[minite%10];//分个位 delay(1); P2=0XEF; P0=dispcode[minite/10];//分十位 delay(1); P2=0XDF; P0=dispcode[10];//间隔符 - delay(1); P2=0XBF; P0=dispcode[hour%10];//时个位 delay(1); P2=0X7F; P0=dispcode[hour/10];//时十位 delay(1); } } /*键盘扫描子程序*/ void keyscan(void) { if(P1_0==0)//秒位的调整 { delay(30); if(P1_0==0) { seconde++; if(seconde==60) { seconde=0; } } delay(250); } if(P1_1==0)//分位的调整 { delay(30); if(P1_1==0) { minite++; if(minite==60) { minite=0; } } delay(250); } if(P1_2==0)//时位的调整 { delay(30); if(P1_2==0) { hour++; if(hour==24) { hour=0; } } delay(250); } } /*整点报警*/ void zhengdian (void) { if((seconde==0)&(minite==0))//整点报时 { P1_5=0; delay(1000); P1_5=1; } } /*定时闹钟*/ void dingshi(void) { if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。 { P2=0XFE; P0=dispcode[0];//秒个位 delay(1); P2=0XFD; P0=dispcode[0];//秒十位 delay(1); P2=0XFB; P0=dispcode[10];//间隔符 - delay(1); P2=0XF7; P0=dispcode[fen%10];//分个位 delay(1); P2=0XEF; P0=dispcode[fen/10];//分十位 delay(1); P2=0XDF; P0=dispcode[10];//间隔符 - delay(1); P2=0XBF; P0=dispcode[shi%10];//时个位 delay(1); P2=0X7F; P0=dispcode[shi/10];//时十位 delay(1); } if(P1_6==0)//设定时 { delay(30); if(P1_6==0) { shi++; if(shi==24) { shi=0; } } delay(250); } if(P1_7==0)//设定分 { delay(30); if(P1_7==0) { fen++; if(fen==60) { fen=0; } } delay(250); } if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警六十次。 { for(bjcs=0;bjcs<60;bjcs++) { P1_5=0; delay(500); P1_5=1; delay(500); } } } /*主函数*/ void main(void) { P1=0XFF; TMOD = 0x11; //time0为定时器,方式1 TH0=0x3c; //预置计数初值,50ms TL0=0xb0; EA=1; //总中断开 ET0=1; //允许定时器0中断 TR0=1; //开启定时器0 while (1) { keyscan(); //按键扫描 dingshi();//定时闹钟 zhengdian();//整点报时 display(); //显示时间 } } void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次 { TH0=0x3c; //手动加载计数脉冲次数 TL0=0xb0; TMOD=0x11; mstcnt++; //用于计算时间,每隔50ms加1 if(mstcnt==20)//mstcnt满20即为一秒 { seconde++;//秒+1 time_pro( ); //时间处理 mstcnt=0; //对计数单元的清零,重新开始计数 } }
哪位大神可以帮我翻译一下这个带液晶显示的充电器代码,多谢。
#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char #define nop _nop_ /*********端口定义********/ sbit GATE = P2^4; sbit BP = P3^5; sbit BusyFlag=P0^7; //LCD控制接口 sbit E=P2^7; sbit RW=P2^6; sbit RS=P2^5; sbit CS = P2^2; sbit CLK = P2^1; sbit DIO = P2^0; sbit Lu=P3^4; sbit Hu=P3^1; sbit bit7=ACC^7; //单片机内部移位寄存器ACC声明; sbit bit0=ACC^0; //显示界面 LCD1602 uchar LCD_4,LCD_3,LCD_2,LCD_1,LCD_0; uchar code LCDData[] ="0123456789"; uchar first_line[16]="Phone Charging "; //LCD第一行显示缓存数组 uchar second_line[16]="S:100% Volt=4.20"; //LCD第二行显示缓存数组,正常显示时间。 /*********************定义全局变量****************/ uint adval;//AD值 uint temp,num; //uchar data temp_data[2]={0xff,0xff}; //读出温度暂放 //************************************ //延时程序 //************************************ void delay(unsigned int N) { unsigned int i; for(i=0;i<N;i++); } //************************************ //LCD1602操作程序 //************************************ //LCD1602测忙 void check_busy(void) { while(1) { P0=0xff; E=0; _nop_(); RS=0; _nop_(); _nop_(); RW=1; _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); if((P0&0x80)==0) { break; } E=0; } } //LCD1602写命令 void write_command(uchar tempdata) { E=0; _nop_(); _nop_(); RS=0; _nop_(); _nop_(); RW=0; P0=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); _nop_(); check_busy(); } //LCD1602写数据 void write_data(uchar tempdata) { E=0; _nop_(); _nop_(); RS=1; _nop_(); _nop_(); RW=0; P0=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); _nop_(); check_busy(); } //初始化LCD1602 void init_lcd1602() { write_command(0x01); //清除屏幕 write_command(0x38); //功能设定(8位,2行,5*7点阵式) write_command(0x0c); //显示器ON,光标OFF,闪烁OFF write_command(0x06); //指针地址加1 delay(5); } void display(void) { uchar i; write_command(0x80); for(i=0;i<16;i++) { write_data(first_line[i]); } write_command(0xc0); for(i=0;i<16;i++) { write_data(second_line[i]); } } unsigned char A_D() { uchar i,dat; CS=1; //一个转换周期开始 CLK=0; //为第一个脉冲作准备 CS=0; //CS置0,片选有效 DIO=1; //DIO置1,规定的起始信号 CLK=1; //第一个脉冲 CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平 DIO=1; //DIO置1, 通道选择信号 CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0 CLK=0; //第二个脉冲下降沿 DIO=1; //DI置1,选择通道1 CLK=1; //第三个脉冲 CLK=0; //第三个脉冲下降沿 DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1 CLK=1; //第四个脉冲 for(i=0;i<8;i++) //高位在前 { CLK=1; //第四个脉冲 CLK=0; dat<<=1; //将下面储存的低位数据向右移 dat|=(uchar)DIO; //将输出数据DIO通过或运算储存在dat最低位 } CS=1; //片选无效 return dat; //将读书的数据返回 } void dis_0832(uint k) { uchar Int,Dec; Int=(k)/51; Dec=(k%51)*100/51; second_line[12]=LCDData[Int]; second_line[13]='.'; second_line[14]=LCDData[Dec/10]; second_line[15]=LCDData[Dec%10]; } void S_0832(uint l) { uchar Int,Dec; Int=(l)/51; Dec=(l%51)*100/51; l=Int*100+Dec; if(l<368) { second_line[2]=' '; second_line[3]=' '; second_line[4]=LCDData[0]; } else if(l<378) { second_line[2]=' '; second_line[3]='2'; second_line[4]=LCDData[0]; } else if(l<380) { second_line[2]=' '; second_line[3]='3'; second_line[4]=LCDData[5]; } else if(l<385) { second_line[2]=' '; second_line[3]='4'; second_line[4]=LCDData[8]; } else if(l<390) { second_line[2]=' '; second_line[3]='6'; second_line[4]=LCDData[8]; } else if(l<394) { second_line[2]=' '; second_line[3]='7'; second_line[4]=LCDData[8]; } else if(l<400) { second_line[2]=' '; second_line[3]='8'; second_line[4]=LCDData[6]; } else if(l<403) { second_line[2]=' '; second_line[3]='9'; second_line[4]=LCDData[2]; } else if(l<408) { second_line[2]=' '; second_line[3]='9'; second_line[4]=LCDData[8]; } else { second_line[2]='1'; second_line[3]=LCDData[0]; second_line[4]=LCDData[0]; } } uint t_count,int0_count; /* 初始化 */ void init() { EA = 1; // 打开CPU中断 PT0 = 1; // T0中断设为高优先级 TMOD = 0x11; // 模式1,T0为16位定时/计数器 TH0 = (65536-5000)/256; // 5ms定时 TL0 = (65536-5000)%256; TH1 = (65536-5000)/256; // 5ms定时 TL1 = (65536-5000)%256; ET0 = 1; // 打开T0中断 TR0=0; ET1 = 1; // 打开T0中断 TR1=0; IT0 = 1; // 外部中断0设为边沿触发 EX0 = 1; // 打开外部中断0 GATE = 1; // 光耦正常输出电压 BP = 1; // 关闭蜂鸣器 int0_count = 0; // 产生外部中断0的计数器清零 } void main() { init_lcd1602(); init(); while(1) { adval=A_D(); dis_0832(adval); S_0832(adval); display() ; delay(2000); } } /* 定时器0中断服务子程序 */ void timer0() interrupt 1 using 1 { TR0 = 0; // 停止计数 TH0 = (65536-5000)/256; // 重设计数初值 TL0 = (65536-5000)%256; t_count++; if ((t_count>600)) // // 外部中断0产生3s~5s的信号 { if (int0_count==1) // 还没有出现第二次外部中断0,则认为充电完毕 { GATE = 0; // 关闭充电电源 BP = 0; // 打开蜂鸣器报警 ET0 = 0; // 关闭T0中断 EX0 = 0; // 关闭外部中断0 Lu=0; TR1=1; } else // 否则即是充电出错 { GATE = 1; BP = 1; } int0_count = 0; t_count = 0; } else TR0 = 1; // 启动T0计数 } /* 外部中断0服务子程序 */ void int0() interrupt 0 using 1 { if (int0_count==0) { TH0 = (65536-5000)/256; // 5ms定时 TL0 = (65536-5000)%256; TR0 = 1; // 启动定时/计数器0计数 t_count = 0; // 产生定时器0中断的计数器清零 } int0_count++; } void int1() interrupt 3 { TH0 = (65536-5000)/256; // 5ms定时 TL0 = (65536-5000)%256; num++; if(num==1800) { Hu=0; //提醒灯 BP = 1; // 关闭蜂鸣器报警 TR1=0; } }
51单片机十字路口交通灯设计 求问
明天就要课设答辩了 影响着自己毕业。求大神帮我讲解一下这个程序 谢谢了 ``` #include <reg51.h> #include<absacc.h> #define COM XBYTE[0xCFE9] #define DAT XBYTE[0xCFE8] void Init_8279(void); void led_display(void); void Key_Scan(void); void key_action(void); void led_init_status(void); void delay(void); unsigned char led_buf[8]; //数码管显示缓冲数组 unsigned char KeyVal = 0x00; //当前按键的键值 unsigned char led_char[17] = { //数码管数字真值表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, }; sbit R_LED1 = P1^0; sbit G_LED1 = P1^1; sbit Y_LED1 = P1^2; sbit Y_LED3 = P1^3; sbit R_LED2 = P1^4; sbit G_LED2 = P1^5; sbit Y_LED2 = P1^6; sbit Y_LED4 = P1^7; int main(void) { TMOD = 0x01; //定时器模式设置 TH0 = 0xfc; TL0 = 0x18; TR0 = 1; EA = 1; //总中断使能 ET0 = 1; //定时器中断0使能 Init_8279(); while(1) { Key_Scan(); //按键扫描函数 } } void Init_8279(void) { COM = 0xd1; //总清除命令 do { ACC = COM; } //读取8279状态 while(ACC^7 == 1); //等待清除结束 COM = 0x00; //8个字符显示,左入口;,双键锁定 COM = 0x2a; //时钟分频 } //数码管显示函数,实现数码管动态扫描 void led_display(void) { static unsigned char j = 0; //静态局部变量,只初始化一次, COM = 0x82 + j; //发送显示地址,0x80为左一,程序里0x80,0x81数码管未使用,j = 0时,显示0x82位置的数码管,j=1时83,。。。 DAT = led_buf[j]; //依次把缓冲数组的内容显示 j++; if(j >= 4) //四个数码管 j = 0; } //按键扫描函数, 主循环调用 void Key_Scan(void) { unsigned char temp = 0; while((temp & 0x0f) == 0) //没有检测到按键程序停在这里,中断服务函数负责完成其他工作 { temp = COM; } //能执行到此处说明检测到了按键 COM = 0x40; //读按键值命令 KeyVal = DAT; //取键值 KeyVal &= 0x0f; //取低4位 KeyVal += 1; //因为按下第一个按键时,得到的键值位0x00,加一为了后面方便操作 key_action(); //检测到按键,并执行相应动作 } unsigned long sec_1s = 0; //全局时间,赋值多少当前秒是多少 unsigned char xingren = 0; unsigned char sec_1s_bak = 0; unsigned char bianhuan = 40; void key_action(void) {if(KeyVal == 0x01) {xingren = 1; sec_1s_bak = sec_1s; sec_1s = 0; } if(KeyVal == 0x02) {bianhuan = 40; sec_1s = 0; } if(KeyVal == 0x03) {bianhuan = 20; sec_1s = 0; } if(KeyVal == 0x04) {bianhuan = 10; sec_1s = 0; } } unsigned long ms2 = 0; //2ms计数 bit dir = 1; void InterruptTimer0() interrupt 1 { TH0 = 0xfc; //重新装在定时器的值 TL0 = 0x18; ms2++; //进来一次表示2ms if(ms2 >= 500) //累计500次则表示1s { ms2 = 0; //归零 sec_1s++; //1s计数器 加一 if(xingren == 1) { R_LED1 = 0; G_LED1 = 1; Y_LED1 = 1; Y_LED3 = 1; R_LED2 = 0; G_LED2 = 1; Y_LED2 = 1; Y_LED4 = 1; led_buf[2] = led_char[0]; led_buf[3] = led_char[10 - sec_1s]; if(sec_1s == 9) { xingren = 0; P1 = 0XFF; sec_1s = sec_1s_bak; } } else if(sec_1s >= 0 && sec_1s <= bianhuan) { if(dir) { R_LED1 = 0; G_LED2 = 0; } else { R_LED2 = 0; G_LED1 = 0; } led_buf[2] = led_char[(bianhuan + 1 - sec_1s)/10]; led_buf[3] = led_char[(bianhuan + 1 - sec_1s)%10]; } else if(sec_1s >= bianhuan && sec_1s <= bianhuan + 4) { R_LED1 = 1; G_LED1 = 1; Y_LED1 = 0; Y_LED3 = 0; R_LED2 = 1; G_LED2 = 1; Y_LED2 = 0; Y_LED4 = 0; led_buf[0] = led_char[0]; led_buf[1] = led_char[4 - sec_1s%10]; if(sec_1s == bianhuan + 4) { sec_1s = 0; dir = ~dir; Y_LED1 = 1; Y_LED3 = 1; Y_LED2 = 1; Y_LED4 = 1; } } } led_display(); //刷新数码管显示,放在中断中保证及时刷新显示 } ```
关于8051单片机(普中开发板)秒表程序问题
求助QAQ,一直是这样查了好久看不出来问题。数组没办法初始化。。 ![图片说明](https://img-ask.csdn.net/upload/201901/01/1546340646_121073.jpg) ![图片说明](https://img-ask.csdn.net/upload/201901/01/1546340417_481446.png) ![图片说明](https://img-ask.csdn.net/upload/201901/01/1546340516_480258.png)![图片说明](https://img-ask.csdn.net/upload/201901/01/1546340522_346623.png) ![图片说明](https://img-ask.csdn.net/upload/201901/01/1546340852_721330.png) ``` #include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit LSA = P2^2; //38译码器引脚编号,选择数码管 sbit LSB = P2^3; sbit LSC = P2^4; sbit number = P0; //发送转换表(段码) sbit key1 = P3^1; //开始/暂停 sbit key2 = P3^0; //复位 sbit key3 = P3^2; // sbit key4 = P3^3; // u8 code smgduan[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };//数码管转换表 u8 LedBuff[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } ;//数码管缓冲区 u8 KeySt[4] = { 1, 1, 1, 1 };//按键电平状态储存区 bit StopwatchRunning = 1; //秒表是否运行(确定是否暂停) bit StopwatchRefresh = 1; //秒表是否要刷新 u8 DecimalPart = 0; //计数小数部分 u16 IntegerPart = 0; //计数整数部分 u8 T0RH = 0; //T0重装高位 u8 T0RL = 0; //T0重装低位 void ConfigTimer0(u16 ms); //配置定时器 void StopwatchDisplay(); //显示函数(数字分割显示) void KeyDriver(); //检测按键,执行指令(主函数中调用) void main() { EA = 1; //打开总中断 ConfigTimer0(2); //定时器2ms while(1) { if(StopwatchRefresh) //是否更新数码管显示 { StopwatchRefresh = 0; StopwatchDisplay(); } KeyDriver(); //调用按键驱动 } } /*函数部分*/ void ConfigTimer0(u16 ms)//配置定时器 { u32 tmp; tmp = 12000000 / 12; tmp = (tmp * ms) / 1000; tmp = 65536 - tmp; tmp += 18; T0RH = (u8)(tmp >> 8); T0RL = (u8)tmp; TMOD &= 0XF0; //仅改变后四位(置零) TMOD |= 0X01; TH0 = T0RH; TL0 = T0RL; ET0 = 1; TR0 = 1; } void StopwatchDisplay()//显示函数(数字分割显示) { signed char i; u8 buf[4]; // LedBuff[0] = smgduan[DecimalPart % 10]; //小数转换 LedBuff[1] = smgduan[DecimalPart / 10]; buf[0] = IntegerPart % 10; buf[1] = (IntegerPart / 10) % 10; buf[2] = (IntegerPart / 100) % 10; buf[3] = (IntegerPart / 1000) % 10; for(i = 3; i >= 1; i --) //整数高位0转换为空 { if(buf[i] == 0) { LedBuff[i + 2] = 0XFF; } else break; } for( ; i >= 0; i --) //整数转换 { LedBuff[i + 2] = smgduan[buf[i]]; } LedBuff[2] &= 0X80; //小数点 } void StopwatchAction()//秒表的启动与暂停 { if (StopwatchRunning) //已启动则停止 StopwatchRunning = 0; else //未启动则启动 StopwatchRunning = 1; } void StopwatchReset()//秒表复位 { StopwatchRunning = 0; DecimalPart = 0; IntegerPart = 0; StopwatchRefresh = 1; } void KeyDriver()//检测按键,执行指令(主函数中调用) { u8 i; static u8 backup[4] = {1, 1, 1 , 1};//键值对比样本 for(i = 0; i < 4; i ++) { if(backup[i] != KeySt[i]) { if(backup[i] != 0) { if(i == 1) { StopwatchReset(); } else if(i == 2) { StopwatchAction(); } } backup[i] = KeySt[i]; //刷新备份,作为下次判定样本 } } } void KeyScan()//按键扫描,定时中断调用 { u8 i; static u8 keybuf[4] = { 0xFF, 0xFF, 0xFF, 0xFF }; keybuf[0] = (keybuf[0] << 1) | key1; //键值输入 keybuf[1] = (keybuf[1] << 1) | key2; keybuf[2] = (keybuf[2] << 1) | key3; keybuf[3] = (keybuf[3] << 1) | key4; for(i = 0; i < 4; i ++) { if(keybuf[i] == 0X00) { KeySt[i] = 0; } else if(keybuf == 0XFF) { KeySt[i] = 1; } } } void LedScan()//数码管扫描,定时中断调用 { static u8 i = 0; number = 0X00; //LS = (LS & 0XE3) | (i << 2); for(i = 0;i < 5;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } } P0 = LedBuff[i]; //if(i < 5) i ++; //else i = 0; } void StopwatchCount()//秒数统计 { if(StopwatchRunning) { DecimalPart ++; if(DecimalPart >= 100) { DecimalPart = 0; IntegerPart ++; if(IntegerPart > 10000) { IntegerPart = 0; } } StopwatchRefresh = 1; //提醒刷新 } } void InterruptTimer0() interrupt 1 //中断函数 { static u8 tmr10ms = 0; TH0 = T0RH; TL0 = T0RL; LedScan(); KeyScan(); tmr10ms ++; if(tmr10ms >= 5) //10ms记一次数 { tmr10ms = 0; StopwatchCount(); } } ```
一個關於51單片機涉及交通燈的匯編程序以及他的PROTUES仿真圖
采用51单片机作为系统的MCU,基本完成控制两组交通指示灯交替亮 每个街口有左拐、直行及行人三种指示灯。直行灯每个灯有红、黄、绿三种颜色。自行车与汽车共用左拐和直行灯。 首先东西向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒(同时南北向红灯亮95秒),然后东西向红灯亮95秒钟(同时首先南北向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒),然后东西向的绿灯亮,依次类推。 每次绿灯亮的时候,对应的行人灯亮。 60S/30S/5S/60S/30S/5S 东西道 绿和行人/左转/黄/红/红/红 南北道 红/红/红/绿和行人/左转/黄 行人灯亮的时候有声音提示盲人能通过。 突发交通事故的时候能够紧急全红灯。 在有重要人物通过的时候能手动改为绿灯。 ORG 0000H ;主程序的入口地址 LJMP MAIN ;跳转到主程序的开始处 ORG 0003H ;外部中断0的中断程序入口地址 ORG 000BH ;定时器0的中断程序入口地址 LJMP T0_INT ;跳转到中断服务程序处 ORG 0013H ;外部中断1的中断程序入口地址 MAIN : MOV SP,#50H MOV IE,#8EH ;CPU开中断,允许T0中断,T1中断和外部中断1中断 MOV TMOD,#51H ;设置T1为计数方式,T0为定时方式,且都工作于模式1 MOV TH1,#00H ;T1计数器清零 MOV TL1,#00H SETB TR1 ;启动T1计时器 SETB EX1 ;允许INT1中断 SETB IT1 ;选择边沿触发方式 MOV DPTR ,#0003H MOV A, #80H ;给8255赋初值,8255工作于方式0 MOVX @DPTR, A AGAIN: JB P3.1,N0 ;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转 MOV A,P1 JB P1.7,RED ;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间 MOV R0,#00H ;R0清零 MOV R0,A ;存入东西方向绿灯初始时间 MOV R3,A LCALL DISP1 LCALL DELAY AJMP AGAIN RED: MOV A,P1 ANL A,#7FH ;P1.7置0 MOV R7,#00H ;R7清零 MOV R7,A ;存入东西方向红灯初始时间 MOV R3,A LCALL DISP1 LCALL DELAY AJMP AGAIN ;---------------------------------- N0: SETB TR0 ;启动T0计时器 MOV 76H,R7 ;红灯时间存入76H N00: MOV A,76H ;东西方向禁止,南北方向通行 MOV R3,A MOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮 MOV A,#0DDH MOVX @DPTR, A N01: JB P2.0,B0 N02: SETB P3.0 CJNE R3,#00H,N01 ;比较R3中的值是否为0,不为0转到当前指令处执行 ;------黄灯闪烁5秒程序------ N1: SETB P3.0 MOV R3,#05H MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮 MOV A,#0D4H MOVX @DPTR,A N11: MOV R4,#00H N12: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒 N13: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭 MOV A,#0DDH MOVX @DPTR,A N14: MOV R4,#00H CJNE R4,#7DH,$ ;黄灯持续灭0.5秒 CJNE R3,#00H,N1 ;闪烁时间达5秒则退出 ;----------------------------------- N2: MOV R7,#00H MOV A,R0 ;东西通行,南北禁止 MOV R3,A MOV DPTR,#0000H ; 置8255A口,东西方向绿灯亮,南北方向红灯亮 MOV A,#0EBH MOVX @DPTR,A N21: JB P2.0,T03 N22: CJNE R3,#00H,N21 ;------黄灯闪烁5秒程序------ N3: MOV R3,#05H MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮 MOV A,#0E2H MOVX @DPTR,A N31: MOV R4,#00H CJNE R4,#7DH,$ ;黄灯持续亮0.5秒 N32: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭 MOV A,#0EBH MOVX @DPTR,A N33: MOV R4,#00H CJNE R4,#7DH,$ ;黄灯持续灭0.5秒 CJNE R3,#00H,N3 ;闪烁时间达5秒则退出 SJMP N00 ;------闯红灯报警程序------ B0: MOV R2,#03H ;报警持续时间3秒 B01: MOV A,R3 JZ N1 ;若倒计时完毕,不再报警 CLR P3.0 ;报警 CJNE R2,#00H,B01 ;判断3秒是否结束 SJMP N02 ;------1秒延时子程序------- N7: RETI T0_INT:MOV TL0,#9AH ;给定时器T0送定时10ms的初值 MOV TH0,#0F1H INC R4 INC R5 CJNE R5,#0FAH,T01 ;判断延时是否够一秒,不够则调用显示子程序 MOV R5,#00H ;R5清零 DEC R3 ;倒计时初值减一 DEC R2 ;报警初值减一 T01: ACALL DISP ;调用显示子程序 RETI ;中断返回 ;------显示子程序------ DISP: JNB P2.4,T02 DISP1: MOV B,#0AH MOV A,R3 ;R3中值二转十显示转换 DIV AB MOV 79H,A MOV 7AH,B DIS: MOV A,79H ;显示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY DS2: MOV A,7AH ;显示个位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A RET ;------东西方向车流量检测程序------ T03: MOV A,R3 SUBB A,#00H ;若绿灯倒计时完毕,不再检测车流量 JZ N3 JB P2.0,T03 INC R7 CJNE R7,#64H,E1 MOV R7,#00H ;中断到100次则清零 E1: SJMP N22 ;------东西方向车流量显示程序------ T02: MOV B,#0AH MOV A,R7 ;R7中值二转十显示转换 DIV AB MOV 79H,A MOV 7AH,B DIS3: MOV A,79H ;显示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY DS4: MOV A,7AH ;显示个位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A LJMP N7 ;------延时4MS子程序---------- DELAY: MOV R1,#0AH LOOP: MOV R6,#64H NOP LOOP1: DJNZ R6,LOOP1 DJNZ R1,LOOP RET ;------字符表------ TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
ARM小白请教大神,对于这些任务,近期我应该怎样去学
1.I/O口操作: 任务要求:自行焊接四个LED灯驱动电路(上拉下拉自选),通过stm32的IO口点亮指定的灯,并且实现流水灯。 2.按键操作: 任务要求:自行焊接至少两个按键驱动电路,实现硬件滤波,并通过stm32 IO 口获取按键状态,进而实现通过外部中断实现按键补获,并可以通过按键来控制LED灯的亮灭。 3.串口收发: 任务要求:学会利用stm32板载串口,实现单片机于PC通信,并且学会利用printf()函数发送指定数据,也要学会利用uart_senddata 函数发送数据,熟悉ASCII编码。 4.定时器计数: 任务要求:学会设置定时器中断,实现每10ms进入一次定时器中断,声明一个count变量,每进入一次中断count自增1,并且实时打印count的值到屏幕上。 5.PWM输出 任务要求:学会利用定时器输出PWM信号,要求频率50hz,(1)占空比0~100%可调 (2)脉宽1ms~2ms 可调,并且利用PWM实现LED灯的亮度调节
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
源码阅读(19):Java中主要的Map结构——HashMap容器(下1)
(接上文《源码阅读(18):Java中主要的Map结构——HashMap容器(中)》) 3.4.4、HashMap添加K-V键值对(红黑树方式) 上文我们介绍了在HashMap中table数组的某个索引位上,基于单向链表添加新的K-V键值对对象(HashMap.Node&lt;K, V&gt;类的实例),但是我们同时知道在某些的场景下,HashMap中table数据的某个索引位上,数据是按照红黑树
c++制作的植物大战僵尸,开源,一代二代结合游戏
    此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材,少部分搜集于网络,以及自己制作。 此游戏为同人游戏而且仅供学习交流使用,任何人未经授权,不得对本游戏进行更改、盗用等,否则后果自负。 目前有六种僵尸和六种植物,植物和僵尸的动画都是本人做的。qq:2117610943 开源代码下载 提取码:3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风,全部修
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
深度学习图像算法在内容安全领域的应用
互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度学习图
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程实用技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法,并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 万字申请,废话报告,魔幻形式主义大作怎么写?兄dei,狗屁不通文章生成器了解一下。这个富有灵魂的项目名吸引了众人的目光。项目仅仅诞生一周,便冲上了GitHub趋势榜榜首(Js中文网 -前端进阶资源教程)、是榜首哦
推荐几款比较实用的工具,网站
1.盘百度PanDownload 这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风????) 不要去某站买付费的???? PanDownload下载地址 2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了 bejson网站 3.二维码美化 这个网站的二维码美化很好看,网站界面也很...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
Spring Security 实战干货:基于注解的接口角色访问控制
1. 前言 欢迎阅读 Spring Security 实战干货[1] 系列文章 。在上一篇 基于配置的接口角色访问控制[2] 我们讲解了如何通过 javaConfig 的方式配置接口的角色访问控制。其实还有一种更加灵活的配置方式 基于注解 。今天我们就来探讨一下。DEMO 获取方式在文末。 2. Spring Security 方法安全 Spring Security 基于注解的安全...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问