STC12C单片机控制
光传感器测速
PWM控制直流电机
部分代码预览:
#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)
{
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』