moyouuserl
发表于 2017-1-9 10:08:50
顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Now
发表于 2017-1-14 12:25:03
世界大战
发表于 2017-2-14 12:12:37
本帖最后由 世界大战 于 2017-2-14 12:16 编辑
红外和电压表的零件还没有到,先做一个舵机测试仪解解渴。
世界大战
发表于 2017-2-14 12:18:48
世界大战 发表于 2017-2-14 12:12
红外和电压表的零件还没有到,先做一个舵机测试仪解解渴。
上视频,交作业。
xiancun010
发表于 2017-2-16 18:48:25
问下萝莉大神 我在测试时舵机一直发出嘟嘟声,但是舵机确没转动。这是为什么?#include <reg51.h>
#include <intrins.h>
#defineU16 unsigned int
#defineU8 unsigned char
//sbit servo1=P1^6;
sfr P5=0xC8;
sbit servo1=P1^5;
sbit servo3=P1^4;
U16 L;
void De_n_Delay10us(U16 delaytime);
void Delay10us(); //@12.000MHz
void main()
{
L=150;
while(1)
{
servo1=1;
De_n_Delay10us(L);
servo1=0;
De_n_Delay10us(1900);
L=L+10;
if(L>200);
{
L=100;
}
}
}
void Delay10us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 24;
while (--i);
}
void De_n_Delay10us(U16 delaytime)
{
while(delaytime>0)
{
Delay10us();
delaytime--;
}
}
飝飛飞
发表于 2017-3-11 23:34:35
好帖,好帖,顶一个
川师鲤鱼
发表于 2017-4-8 06:39:49
不错不错 为你顶帖 很赞
suker620
发表于 2017-5-19 10:18:55
这个是个好东西。
x2587
发表于 2017-6-13 15:54:02
开始看不懂了
davidxu
发表于 2017-6-14 14:15:56
谢谢分享,楼主辛苦了
1343520582
发表于 2017-8-10 14:20:16
技术贴
hulao888
发表于 2017-12-18 10:14:30
这样的帖子应该置顶。
07728967916
发表于 2018-1-19 23:54:10
๑•́₃•̀2伐开心6666
陈小手
发表于 2018-2-5 22:44:02
这个有点难,我得研究一下。买的东西还没到
ritass21
发表于 2018-5-22 21:13:10
顶起
爪牙非非
发表于 2018-6-18 16:19:39
#include<reg51.h>
unsigned char count; //记录0.5ms次数用的变量
sbit pwm=P3^7;
惜梦
发表于 2018-7-11 09:02:08
这个程序和源码哪里有?
coolbgo
发表于 2018-7-30 20:35:50
请教大神
为什么用定时器延时计数 定时器中断里t0++ 用t0=0;while(t0<1000);延时显示数码管会闪烁用t0=0;while(t0!=1000);就不会闪烁
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sfr P5=0xc8; //声明P5端口地址
sfr P2M0=0x96; //声明P2引脚模式寄存器
sfr P3M0=0xb2; //声明P3引脚模式寄存器
sfr AUXR=0x8e; //声明辅助寄存器
sfr ADC_RES=0xBD; //声明转换结果寄存器
sfr ADC_RESL=0xBE; //声明转换结果寄存器低2位
sfr P1ASF=0x9D; //声明P1口模拟功能寄存器 模拟功能开关
sfr ADC_CONTR=0xBC;//声明数模转换寄存器
sbit DA=P2^4; //数码管位选
sbit DB=P3^2;
sbit DC=P3^6;
sbit DD=P2^0;
sbit DE=P2^1;
sbit DF=P2^3;
sbit DG=P3^5;
sbit DP=P3^7;
sbit B1=P2^5; //数码管段选
sbit B2=P2^2;
sbit B3=P3^3;
sbit B4=P3^4;
sbit CS=P3^1; //片选端,CS为低时启动串行接口
sbit SCK=P3^0; //串行时钟输出到max6675
sbit SO=P5^5; //串行数据输入到单片机
sbit keyx1=P2^6; //定义键盘键位
sbit keyx2=P2^7;
sbit keyx3=P1^0;
sbit keyx4=P1^1;
sbit keyy1=P1^2;
sbit keyy2=P1^3;
sbit keyy3=P1^4;
sbit keyy4=P1^5;
sbit keyy5=P1^6;
sbit S1=P5^4; //定义pwm信号接口
uchar count,count2,Flag_temp,Flag_key,keynow,keyold,mode,key; //定义计数,热电偶就绪
uint temp,value,t0; //定义温度,按键值,定时器0计数
uchar code duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xcf}; //定义常量数组数码管段选 code 0-15 p.
uchar code wei[]={0xf7,0xfb,0xfd,0xfe}; //数码管位选
uchar x,OP1,OP2,DOP2; //定义运算符 + - * / = c
uint tOP2,value1,value2;
long uint adc; //定义长整数,不然出错
void disduan(uchar dd)
{
DA=dd>>7;DB=dd>>6&1;DC=dd>>5&1;DD=dd>>4&1;DE=dd>>3&1;DF=dd>>2&1;DG=dd>>1&1;DP=dd&1;
}
void diswei(uchar dw)
{
B1=dw>>3&1;B2=dw>>2&1;B3=dw>>1&1;B4=dw&1;
}
void Delay1ms() //@12.000MHz
{
uchar i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void Delay50us() //@12.000MHz
{
unsigned char i, j;
i = 1;
j = 146;
do
{
while (--j);
} while (--i);
}
void init()
{
P2M0=0x1B; //P2强推挽0001 1011
P3M0=0xE4; //P3强推挽1110 0100
P1ASF=0x80; //开启P1^7引脚模拟功能
key=255;
S1=0; //pwm引脚置零
EA=1; //中断总开关
ET0=1; //定时器0开关
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x88; //设置定时初值 10us
TH0 = 0xFF; //设置定时初值
TR0 = 1; //定时器0开始计时
}
uint MAX6675_ReadReg(void) //返回dat 0-65535 包含状态 温度值
{
uchar i;
uint dat; // 1111 1111 1111 1111
i = 0;
dat = 0;
CS= 0; //片选端,CS为低时、启动串行接口
SCK = 0; //串行时钟输出6675收到低电平发送数据
for(i=0; i<16; i++) //get D15-D0 from 6675从最高位开始接收16位数据
{
SCK = 1; //重置时钟
dat = dat<<1; //dat左移一位,1111 1111 1111 1110
if( SO==1 )
dat = dat|0x01; //收到高电平,个位改为1
SCK = 0; //发送时钟信号,准备接收下一位数据
}
CS = 1;
return dat; //
}
void gettemp()
{
if(count2==8) //256周期测一次温度,电压
{
temp=MAX6675_ReadReg(); //读取状态数据0-65535 1111 1111 1111 1111 fedc ba98 7654 3210
Flag_temp=(temp&4)>>2; //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接 0000 0000 0000 0100
temp=((temp<<1)>>4)*5/2; //读出来的数据的D3~D14是温度值 左移1位,右移4位 乘5/2 10倍温度值
}
}
voidgetadc()
{
if(count2==8)
{
ADC_CONTR=0x8f; //开始ad转换 1000 1111
Delay50us(); //延时50us,等待转换
adc=ADC_RES*4+ADC_RESL; //读取转换结果 10位精度 0-1023
}
}
void getpwm()
{
ADC_CONTR=0x8f; //开始ad转换 1000 1111
Delay50us(); //延时50us,等待转换
adc=ADC_RES*4+ADC_RESL; //读取转换结果 10位精度 0-1023
adc=adc/10+100; //100-202
if(adc>200) //100-200
adc=200;
}
void getkey()
{
uchar i;
if(count2%16==0) //16ms检测一次mode键
{
keyy1=0; //keyy1置零
keynow=keyx1; //keynow状态等于keyx1
keyy1=1;
if(keynow==0&&keyold==1)
key=0;
keyold=keynow;
}
if(count2%16==0&&mode==1) //模式1时,16ms检测一次按键
{
keyy1=0;
keynow=keyx1;
keynow=keyx2;
keynow=keyx3;
keynow=keyx4;
keyy1=1;keyy2=0;
keynow=keyx1;
keynow=keyx2;
keynow=keyx3;
keynow=keyx4;
keyy2=1;keyy3=0;
keynow=keyx1;
keynow=keyx2;
keynow=keyx3;
keynow=keyx4;
keyy3=1;keyy4=0;
keynow=keyx1;
keynow=keyx2;
keynow=keyx3;
keynow=keyx4;
keyy4=1;keyy5=0;
keynow=keyx1;
keynow=keyx2;
keynow=keyx3;
keynow=keyx4;
keyy5=1;
for(i=0;i<20;i++)
{
if(keynow==0&&keyold==1)
key=i;
keyold=keynow;
}
}
}
void operation()
{
if(count2%16==0)
{
switch(key)
{
case 0: key=255;mode++;if(mode==4){mode=0;S1=0;}break;//3个模式
case 1: break;
case 2: break;
case 3: break;
case 4: key=255;x=1; break;
case 5: key=255;x=2; break;
case 6: key=255;x=3; break;
case 7: key=255;OP1=1; break; // +
case 8: key=255;x=4; break;
case 9: key=255;x=5; break;
case 10:key=255;x=6; break;
case 11:key=255;OP1=2; break; // -
case 12:key=255;x=7; break;
case 13:key=255;x=8; break;
case 14:key=255;x=9; break;
case 15:key=255;OP1=3; break; // *
case 16:key=255;x=0; break;
case 17:key=255;OP2=1; break; // =
case 18:key=255;OP2=2; break; // c
case 19:key=255;OP1=4; break; // /
default: break;
}
if(OP1==0&&x!=255)
{
value1=value1*10+x;
x=255;
value=value1;
}
if(OP1!=0&&x!=255)
{
value2=value2*10+x;
x=255;
value=value2;
}
if(OP2==1) //输入 =
{
OP2=0;
switch(OP1)
{
case 1: value=value1+value2; break;
case 2: value=value1-value2; break;
case 3: value=value1*value2; break;
case 4: value=value1/value2; break;
default: break;
}
OP1=OP2=DOP2=tOP2=value1=value2=0;
}
if(DOP2==1)
tOP2++;
if(tOP2==30)
DOP2=0;
if(OP2==2&&DOP2==1) //双击C清空所有数据
OP1=OP2=DOP2=tOP2=value1=value2=value=0;
if(OP2==2) //单击C清除数据
{
OP2=0;
DOP2=1;tOP2=0;
if(OP1==0)
value=value1=0;
else
value=value2=0;
}
}
}
void display()
{
if(mode==0)
{
gettemp();
switch(count) //显示温度
{
case 0:B4=1;disduan(duan); diswei(wei);if(temp/1000==0) B1=1;break; //显示第1管 为0不显示
case 1:B1=1;disduan(duan); diswei(wei);break; //显示第2管
case 2:B2=1;disduan(duan); diswei(wei);DP=1;break; //显示第3管 带小数点
case 3:B3=1;disduan(duan); diswei(wei);break; //显示第4管
default: break;
}
}
if(mode==1)
{
switch(count) //显示按键
{
case 0:B4=1;if(value/1000==0) {B1=1;break;} disduan(duan); diswei(wei);break; //显示第1管
case 1:B1=1;if(value/100==0) {B2=1;break;} disduan(duan); diswei(wei);break; //显示第2管
case 2:B2=1;if(value/10==0) {B3=1;break;} disduan(duan); diswei(wei);break; //显示第3管
case 3:B3=1; disduan(duan); diswei(wei);break; //显示第4管
default: break;
}
}
if(mode==2)
{
if(count2==8)
{
getadc();
adc=adc*5000/1023; //1000倍电压值 adc*5v/1023*1000
}
switch(count) //显示电压
{
case 0:B4=1;disduan(duan); diswei(wei);DP=1;break; //显示第1管 带小数点
case 1:B1=1;disduan(duan); diswei(wei);break; //显示第2管
case 2:B2=1;disduan(duan); diswei(wei);break; //显示第3管
case 3:B3=1;disduan(duan); diswei(wei);break; //显示第4管
default: break;
}
}
while(mode==3) //模式3 pwm循环
{
t0=0;
S1=1;
B4=1;disduan(duan);diswei(wei);//显示数码管1
getpwm(); //获取adc
while(t0!=adc);
S1=0;
while(t0!=500);
B1=1;disduan(duan); diswei(wei);//显示数码管2
while(t0!=1000);
B2=1;disduan(duan); diswei(wei);//显示数码管3
while(t0!=1500);
B3=1;disduan(duan); diswei(wei);//显示数码管4
while(t0!=1700); //检测mode按键
keyy1=0; //keyy1置零
keynow=keyx1; //keynow状态等于keyx1
keyy1=1;
if(keynow==0&&keyold==1)
mode=0; //符合条件mode回零,跳出pwm模式循环
keyold=keynow;
while(t0!=2000); //20ms一个周期
}
}
main()
{
init();
while(1)//
{
Delay1ms(); //系统周期1毫秒
count++;
if(count>3)
count=0;
count2++; //0-255
getkey(); //运行一次80us16ms运行一次
operation();
display();
}
}
void Timert0() interrupt 1
{
t0++; //10us
}
我爱萝丽爱萝丽
发表于 2018-7-31 21:00:19
coolbgo 发表于 2018-7-30 20:35
请教大神
为什么用定时器延时计数 定时器中断里t0++ 用t0=0;while(t0
while(T0<1000) 当然不包括t0大于1000的情况
Hi~
发表于 2018-8-1 23:28:13
大师,单片机没有P5引脚接线的时候怎么办