标题:
单片机测速与1602显示程序与电路
[打印本页]
作者:
杨柱豪
时间:
2016-12-23 23:08
标题:
单片机测速与1602显示程序与电路
STC12C单片机控制
光传感器测速
PWM控制直流电机
下载:
程序 15:28.rar
(109.18 KB, 下载次数: 148)
2016-12-23 23:06 上传
点击文件名下载附件
下载积分: 黑币 -5
部分代码预览:
#include"mytype.h" //包含总合的头文件
#define DATA P2 //定义P0口为数据端
//定义按键I/O口
sbit key0=P0^6; //正反转、停止模式切换按键
sbit key1=P0^7; //加速按键
sbit key2=P0^2;
sbit key3=P0^1; //减速按键
//sbit PWM=P0^0;
//****************
uchar table2[16]=" _DGUT_ ";//第1行液晶显示
uchar table1[16]= "000 Chen ZiXing";//第2行液晶显示
uchar number_table[10]="0123456789";
sbit lcden=P3^2;//液晶使能端
sbit lcdrs=P3^5;//液晶读写控制端
sbit wela=P3^3;
//uchar number;
uchar ge=0,shi=0,bai=0;
//****************
//定义全局变量flag=0,
uchar speed=0,speed1=0; //正反转的标志位,0停止,1正转,2反转
uint num; //定时器1的计数变量
int quan;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=310;y>0;y--);
}
void write_com(uchar com)//液晶写地址函数
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//液晶写数据函数
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()//液晶初始化函数
{
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void Lcd_display()//液晶显示函数,主要是刷新转速专用
{
uint i;
table1[0]=number_table[bai];
table1[1]=number_table[shi];
table1[2]=number_table[ge];
write_com(0x80+0x40);
for(i=0;i<3;i++)
{
write_data(table1[i]);
delay(1);
}
}
void main()
{
uchar number;
time_init(); //定时器初始化
PWM_Init(); //PWM初始化
UART1_Init(9600);//串口初始化
DATA=0x00; //数据端初始化为0
init();
write_com(0x80);
for(number=0;number<16;number++)
{
write_data(table2[number]);
delay(10);
}
write_com(0x80+0x40);
for(number=0;number<16;number++)
{
write_data(table1[number]);
delay(10);
}
PWM_SET(46,0);//进去先让电机速度为零
while(1)
{
keyscan(); //按键扫描
/******用定时器1计算时间,每1秒算一次速度直接显示*******/
if(num>=20)//num 是T1计数器计数变量,numG=20时为1秒
{
TR0=0;TR1=0;//关定时器0/1中断
num=0;//计数变量清零
ge=quan%10;quan=quan/10;
shi=quan%10;quan=quan/10;
bai=quan%10;
Lcd_display(); //LCD显示控制
quan=0;//圈数记录清零
TR1=1;TR0=1; //开定时器0/1中断
}
/*******************************************************************/
}
}
void time_init()
{
TMOD=0x15; //设置定时器0为计数模式,定时器1为定时模式,都为工作方式1
TH0=(65536-1)/256;
TL0=(65536-1)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
ET1=1; //开定时器1中断
TR1=1; //启动定时器1
EA=1; //开启总中断
}
//*************************************************************//
//函数:keyscan()
//功能:实现按键扫描、同时控制电机速度
//
//////********************************************************//
void keyscan()
{
if(key0==0||key1==0||key2==0)
{
delay_ms(10);//延时去抖
if(key0==0)
{
UART1_SendStr("a");
if(speed<9)speed++;
else if(speed1<9){speed=0;speed1++;}
// else speed=9;
PWM_SET(speed1*10+speed,0);
while(!key0);
}
else if(key1==0)
{
UART1_SendStr("q");
if(speed>0)speed--;
else if (speed1>0){speed1--;speed=9;}
PWM_SET(speed1*10+speed,0);
while(!key1);
}
else if(key2==0)
{
UART1_SendStr("key2");
while(!key2);
}
write_com(0x80);
write_data(number_table[speed1]);
write_data(number_table[speed]);
}
}
void T0_time() interrupt 1 //外部中断0函数,记录红外对管脉冲高个数,quan就是脉冲个数发,也是圈数
{
TH0=(65536-1)/256; //设置初值,每计数1就溢出
TL0=(65536-1)%256;
quan++;
}
void T1_time() interrupt 3 //定时器1函数,定时计算一秒的时间,num==20的时候就是1秒
{
TH1=(65536-45872)/256; //设置初值,每计数15872就溢出
TL1=(65536-45872)%256;
num++;
//if(num%speed==0)PWM=~PWM; //累加溢出次数,40次为1秒,晶振为22.1184(20次为1秒,晶振为11.0592)
}
void delay_ms(int xms) //延时函数,单位为ms
{
uchar m;
uint n;
for(n=0;n<xms;n++)
for(m=0;m<110;m++);
}
复制代码
作者:
qq894308196
时间:
2016-12-23 23:45
STC12C单片机控制 正是我想要的,谢谢
作者:
大大29
时间:
2017-1-11 04:32
不错 谢谢分享
作者:
tkf008
时间:
2017-1-11 07:59
谢谢,先收下了!辛苦!
作者:
科学我究
时间:
2017-1-11 11:01
谢谢不错不错
作者:
mj8abcd
时间:
2017-1-26 13:44
谢谢楼主分享!!!!!!
作者:
chysh
时间:
2017-6-20 21:47
失望,下载完才发现没有仿真图
作者:
chysh
时间:
2017-6-20 21:47
失望,下载完才发现没有仿真图
作者:
RenLC
时间:
2017-8-6 12:03
谢谢分享
作者:
XXXZZZ
时间:
2017-8-7 16:49
没有仿真图
作者:
15659281171
时间:
2017-8-7 18:08
谢谢,先收下了!很快就要用到了!
作者:
j6920
时间:
2018-4-9 18:21
正想做个小车 , 有仿真更好了
作者:
906267461
时间:
2018-4-28 09:35
谢谢分享
作者:
youguxiake
时间:
2018-10-13 22:09
这不是51单片机吗
作者:
小号487560745
时间:
2019-11-9 00:10
牛逼大佬的作为
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1