我给你段程序,我写的,还有上位机的,一个数据采集与控制的,有你需要东西,这里有照片http://wwwbaiducom/p/tm790116from=super
这是初始化程序
;--------------------------------------------------
;
初始化程序
;--------------------------------------------------
CSH:
NOP
NOP
MOV
R0,#38H
MOV
R1,#8
MOV
A,#00H
CSHH:
MOV
@R0,A
INC
R0
DJNZ
R1,CSHH
MOV
20H,#0FFH
;按键数据
MOV
2DH,#0FFH
;输出控制
MOV
4FH,#01H
;本机地址号
MOV
40H,#01H
;查询指针
;----------串口初始化----------
;定时器工作设置
MOV
TMOD,#20H;T1为模式2
MOV
TH1,#0F3H;波特率为2400
MOV
TL1,#0F3H
;串口设置
MOV
SCON,#50H;UART工作在MODE1,SM1=1
REN=1
;程序参数初始化
SETB
TR1
MOV
IE,#100100000B
SETB
ES
SETB
EA
SETB
TR1
JMP
ZCX
MOV
P2,#00H
MOV
R3,#00
MOV
49H,#1DH
CS2:
MOV
R0,#30H
MOV
48H,#08H
CS1:
NOP
MOV
A,R3
MOV
@R0,A
INC
R0
DJNZ
48H,CS1
MOV
4AH,#70H
CS3:
NOP
CALL
DSPLAY
DJNZ
4AH,CS3
INC
R3
DJNZ
49H,CS2
MOV
30H,#0AH
MOV
31H,#19H
MOV
32H,#08
MOV
33H,#09
MOV
34H,#0CH
MOV
35H,#05
MOV
36H,#02
;--------------------------------------------------
;
主程序程序
;--------------------------------------------------
ZCX:
NOP
;
CALL
DSPLAY
;调用显示子程序
CALL
CXCX
;调用查询子程序
NOP
;
JNB
P37,BDYX
;本地还是远程控制
JMP
ZCX1
;
BDYX:
NOP
;JNB
P37,BDYX
CALL
KEY
;本地是否有按键动作
MOV
P1,20H
;
CALL
BJ
;高用比较子程序
ZCX1:
JMP
ZCX
这是串口发通信子程序
;-----------------------------------------------
;串口中断处理程序
;-----------------------------------------------
CKZD:
NOP
;串口中断
CLR
EA
JBC
RI,UART
;
CLR
TI
;
JMP
FSCX
;
UART:
MOV
R6,#07
;接收八位数据
MOV
R0,#50H
;
TXCL:
CLR
RI
;
MOV
@R0,SBUF
;第一位数
是否为本机地址,是则接收数据,不是则退出
MOV
R3,#250
;是否是干扰信号是则退出
TXYS1:
MOV
R4,#250
;
TX1:
JB
RI,TX2
;
DJNZ
R4,TX1
;
DJNZ
R3,TXYS1
;
JMP
UARTCK11
;
TX2:
INC
R0
;
MOV
@R0,SBUF
;数据存入50-57H
CLR
RI
;
DJNZ
R6,TX1
;
MOV
A,50H
CJNE
A,#1BH,UARTCK11
;联络信号
MOV
A,4FH
;50H为本机地址号
CJNE
A,51H,UARTCK11
;判断是否为本机,是则下行,不是则放弃处理
MOV
A,52H
;第一位数为指令
CJNE
A,#01H,UART1
;指令为1是显示复制子程序
CALL
XSFZ
;显示复制子程序
JMP
UARTCK11
;
UART1:
CJNE
A,#02H,UART2
;
MOV
54H,2DH
;
JMP
FSCX
;
UART2:
CJNE
A,#03H,UART3
;
MOV
20H,54H
;
MOV
2DH,54H
JMP
UARTCK11
;
UART3:
UARTCK11:
SETB
EA
RETI
还有什么问题,可以加我,291918938
使用51单片机,12M晶振,LCD1206液晶显示屏显示
#include"reg52h" //头文件
#define uint unsigned int
#define uchar unsigned char
int humi,temp,check;
uchar n,Readflag; //定义全局变量
sbit SPI = P1^1;
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6; //定义端口
void delayms(uchar ms);
void Init_Timer0(void); //函数声明
void write_com(uchar com) //LCD1206端口写函数
{
RS=0;
P0=com;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
void write_data(uchar date) //LCD1206数据写函数
{
RS=1;
P0=date;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
void LCD1602_init() //LCD1206初始化函数
{
RW=0;
EN=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void Display_Humi(int v,unsigned char position) ////////////湿度显示函数
{
int shu;
write_com(position);
write_data('R');
write_data('H');
shu=v%100/10;
write_data(shu+'0');
shu=v%10;
write_data(shu+'0');
write_data('%');
}
void Display_Temp(int v,unsigned char position) ///////////温度显示函数
{
int shu;
write_com(position);
write_data('T');
write_data('e');
write_data('m');
write_data('p');
write_data(':');
shu=v%100/10;
write_data(shu+'0');
shu=v%10;
write_data(shu+'0');
write_data(0xdf);
write_data('C');
}
void Display_Check(int v,uchar position) //校验位显示函数
{
int shu;
write_com(position);
write_data('C');
write_data('h');
write_data('e');
write_data('c');
write_data('k');
write_data(':');
shu=v/100;
write_data(shu+'0');
shu=v%100/10;
write_data(shu+'0');
shu=v%10;
write_data(shu+'0');
}
void delayms(uchar ms) //精确延时毫秒级函数
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void delayus(uchar us) //精确延时微秒级函数
{
while(us--);
}
void DHT_Rst() //DHT11启动函数
{
SPI=0; //主机拉低总线18ms以上
delayms(20);
SPI=1; //主机拉高总线约30us
delayus(14);/// 20-40us
while(SPI); //等待DHT11响应
while(!SPI); //等待DHT11拉高总线
}
uchar Readbit() //读一位程序
{
while(SPI);//等待总线变为低电平
while(!SPI);//等待总线变为高电平
delayus(5);//等待10us,执行下几条程序使用约20us
if(SPI)
return 1;
else
return 0; //////判断SPI总线状态,返回0或1
}
uchar Readbyte() //读一个字节程序
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++) //重复读取8位数据
{
dat=dat<<1; //dat左移一次,总共8次
dat=Readbit()|dat; //dat和返回值,按位或
}
return dat; //返回dat
}
void ReadDHT() //读DHT11温湿度传感器
{
uchar buf[5],i; //定义临时变量
DHT_Rst(); //初始化传感器
for(i=0;i<5;i++) //读5字节,共40位
buf[i]=Readbyte();
SPI=1; //通讯结束,拉高总线
if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])//数据校验
{
humi=buf[0];//湿度值
temp=buf[2];//温度值
check=buf[4];//校验位值,校验位=湿度值+温度值(小数位为零)
}
}
void main() //主函数
{
Init_Timer0(); //初始化定时器
Readflag=0; //读标志位为0
LCD1602_init(); //初始化LCD1602液晶显示屏
while(1) //主循环
{
if(Readflag==1) //验证是否读
{
Readflag=0; //重置读标志位
ReadDHT(); //读一次DHT11
}
Display_Temp(temp,0x80);
Display_Humi(humi,0x8A);
Display_Check(check,0xc0); /////显示值
}
}
void Init_Timer0(void) //定时器初始化函数
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1 //定时器中断服务程序
{
static unsigned int num;
TH0=(65536-10000)/256; //重新赋值 10ms
TL0=(65536-10000)%256;
num++;
if(num==20) //大致200ms
{
num=0;
Readflag=1; //激活读命令
}
}
纯手打,望采纳
1、先按“取消/恢复键”解锁屏幕。
2、再按“校时”按钮校对小时,然租局后按“校分”按钮校对分物铅钟,再按“校星期”校对星期。
3、再按“定时”按钮,来设置开关罩型好机时间。
4、按“自动/手动”按钮调至自动,就可以定时开关机了,设置完毕,按“取消/恢复”即可。
如何读取1秒钟编码器脉冲个数
什么叫1秒钟编码器?1秒钟产生一个脉冲,1秒钟旋转1圈? 如果是1秒钟产生一个脉冲,那么完全可以不用高速计数器,假如输入为i00 ldi00 eu incwvw100 就可以了 如果是1秒钟旋转1圈,那么要采用高速计数器 根据编码器的类型(增量式还是正交式)及硬件接线来选择工作模式,具体请参照《S7-200可编程序控制器》 如果是第一次使用高速计数器,那么建议采用向导完成 补充 ldsm05 eu movdHC(使用的高计),vd100 sm05是一个秒脉冲,采用上升沿是1s读取一次数据在vd100
利用T32或T96中断,读取每秒脉冲数,然后再复位!
建议你用SM05计时,SM05ON为一个计数周期并驱动中断程序给相应的HC复位,之前SM05上升沿将HC的值送入你的存储变量DW中HC定义为9,控制字为HEC
定时读取编码器脉冲个数,时间一定要准,所以采用定时中断读取是最合理的.建议使用SMB34定时中断去读.
将编码器每圈脉冲个数(一般为1024个)×每秒转速
如果编码器在一秒钟内发出的最大脉冲数小于65535个,建议你用定时器T32或T96的定时中断功能控制高速计数器读取编码器的脉冲数。T32、T96可以在32秒钟范围内定时。高速计数器的最大计数范围可以设置为FFFF。在中断程序中读取计数值,并对高速计数器清零,让其重新开始计数。 如果脉冲数大于65535个,则需要缩短定时,分数次读取后累加;或则采用数学方法计算出1秒钟的脉冲数。
-------------------
不知道你用的是哪个品牌的PLC。
有的PLC有一条测频指令(SPD)
要是你的脉冲频率基本固定的话,也可以自己做一段程序,比如做一个定时中断,每次中断计算一下脉冲数的变化,然后定时中断的时间长除以脉冲数就是每个脉冲的时间。
因为你是初次使用, 有漏洞, 当然"不运作"啦!!
1 电源线/插头插上了吗
2 星期设置有木有错 135, 还是246, 还是每天
3 家用电器接上并且电源开关处于"ON"了吗
4 还要将光标"手动/自动"调到"自动"位置!!(如果是DHC16定时器,置于"AUTO OFF")
使用定时器充电对电池没有影响,需要使用得当。
前提是,应该把定时器的时间设置掌握好,骑行多少里程后,定时多少小时,对于充电器不能转灯的情况是有好处的。可以避免过冲。
如果电瓶和充电器都正常,充电结束能够转灯的,使用定时器也没有妨碍,把时间定的稍有富余,转灯以后,定时器可以把充电器电源关闭,所不利的方面,有时,不知道定时多少,可能出现没有充电完成就断电。因此,客观讲,使用定时器,利与弊是因人而异的。
欢迎分享,转载请注明来源:品搜搜测评网