您的位置 首页 电源

单片机C言语程序举例(二)

8液晶背光控制includereg52h>includestdioh>includeintrinsh>unsignedinthour,minute,second,count;sbit

8.液晶背光操控

#include
#include
#include

unsigned int hour,minute,second,count;

sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E = P2^6;//Pin6

sbit BLCtrl = P2^7;
sbit KEY = P3^2;
#define Data P0 //数据端口

char data TimeNum[]=” “;
char data Test1[]=” “;

void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;
while(–uscnt);
}

void DelayMs(unsigned char ms)//delay Ms
{
while(–ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}

void WriteData(unsigned char c)
{
DelayMs(5); //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}

void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则指令代码高4位为0xc
else
p=pos+0x80; //是第二行则指令代码高4位为0x8
WriteCommand (p);//write command
WriteData (c); //write data
}

void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循环显现16个字符
}

void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显现光标移动方位
WriteCommand(0x0c); //显现开及光标设置
WriteCommand(0x01); //显现清屏

}

/////////////////////////////////////////////////////////////////
void main(void)

{

InitLcd();//初始化液晶
DelayMs(15);

sprintf(Test1,” www.haotun.com “);//榜首行
ShowString(0,Test1);

sprintf(TimeNum,”LCM1602 Test ok!”);//第二行
ShowString(1,TimeNum);

while(1){
if(!KEY)
{
DelayMs(10);//按下去抖
while(!KEY);
if(KEY)
{
DelayMs(10);//释放去抖
if(KEY)
BLCtrl=!BLCtrl; //背光关掉或许翻开
}
}
}

}

9.步进电机操控

#include

unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10};//正转表格
unsigned char code B_Rotation[4]={0x10,0x08,0x040,0x02};//回转表格

void Delay(unsigned int i)//延时
{
while(–i);
}

main()
{

unsigned char i;

while(1)
{
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 能够自行换成回转表格
Delay(10000); //改动这个参数能够调整电机转速
}
}
}

10. 直流电机调速

#include
sbit KEY1 = P3^1;
sbit PWM = P1^5;
unsigned char CYCLE; //界说周期 该数字X基准守时时刻 假如是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//界说高电平时刻
void delay(unsigned int cnt)
{
while(–cnt);
}

main()
{
unsigned char PWM_Num;//界说档位
TMOD |=0x01;//守时器设置 1ms in 12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//守时1mS
IE= 0x82; //翻开中止
TR0=1;

CYCLE = 10;// 时刻能够调整 这个是10步调整 周期10ms 8位PWM便是256步
while(1)
{
if(!KEY1)
{
delay(10000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P1=0xFE;PWM_ON=0;break;//高电平时长
case 1:P1=0xFD;PWM_ON=4;break;
case 2:P1=0xFB;PWM_ON=6;break;
case 3:P1=0xF7;PWM_ON=8;break;
default:break;
}
}

}
}

}

void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//守时1mS

if (count==PWM_ON)
{
PWM = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //假如左右时刻是0 坚持本来状况
PWM = 0;//灯亮

}

}
11.秒表

#include

code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9

unsigned char Dis_Shiwei;//界说十位
unsigned char Dis_Gewei; //界说个位
unsigned char S_Dis_Shiwei;//界说秒十位
unsigned char S_Dis_Gewei; //界说秒个位
unsigned char second,msecond;

void CLR(void);
void delay(unsigned int cnt)
{
while(–cnt);
}

main()
{
EX0=1;//外部中止0设置
IT0=1;

EX1=1;//外部中止1设置
IT1=1;

TMOD |=0x01;//守时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
ET0=1; //翻开中止
TR0=0;

EA=1;
CLR();
while(1)
{
P0=S_Dis_Shiwei;//显现秒十位
P2=1;
delay(300);//时间短延时
P0=S_Dis_Gewei; //显现秒个位
P2=2;
delay(300);
P0=0x40; //显现秒个位
P2=3;
delay(300);
P0=Dis_Shiwei;//显现十位
P2=4;
delay(300);//时间短延时
P0=Dis_Gewei; //显现个位
P2=5;
delay(300);
}
}

void tim(void) interrupt 1 using 1
{

TH0=0xd8;//从头赋值
TL0=0xf0;
msecond++;
if (msecond==100)
{
msecond=0;
second++;//秒加1
if(second==100)
second=0;
S_Dis_Shiwei=tab[second/10];//十位显现值处理
S_Dis_Gewei=tab[second%10]; //个位显现处理

}
Dis_Shiwei=tab[msecond/10];//十位显现值处理
Dis_Gewei=tab[msecond%10]; //个位显现处理

}
void ISR_INT0(void) interrupt 0 using 1
{
TR0=!TR0; //使用外部中止翻开和封闭守时器0 用于开端和中止计时

}
void ISR_INT1(void) interrupt 2 using 1
{
if(TR0==0)//中止时才能够清零
CLR();
}

void CLR(void)
{
second=0; //使用外部中止清零
msecond=0;
Dis_Shiwei=tab[msecond/10];//十位显现值处理
Dis_Gewei=tab[msecond%10]; //个位显现处理
S_Dis_Shiwei=tab[second/10];//十位显现值处理
S_Dis_Gewei=tab[second%10]; //个位显现处理
}

12.把戏灯

#include

unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0×55,0x55,0xaa,0xaa};//rom答应状况能够无限增加
////////////////////////////////////////////////////////
void delay(unsigned int cnt)//简易延时
{
while(–cnt);
}
///////////////////////////////////////////////////////
main()
{
unsigned char i;
while(1)
{
P1=0xFE;//榜首个LED
for(i=0;i<8;i++)
{
delay(10000);
P1 <<=1;
}

P1=0x7F;//第七个LED亮
for(i=0;i<8;i++)
{
delay(10000);
P1 >>=1;
}

P1=0xFE;//榜首个LED亮
for(i=0;i<8;i++)
{
delay(10000);
P1 <<=1;
P1 |=0x01;
}

P1=0x7F;//第七个LED亮
for(i=0;i<8;i++)
{
delay(10000);
P1 >>=1;
P1 |=0x80;
}
////////////////////////////////////
for(i=0;i<16;i++)//查表能够简略的显现各种把戏 实用性更强
{
delay(20000);
P1=seg[i];
}
}

}
13.红绿灯

#include

bit red,green,yellow,turnred;

code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9

unsigned char Dis_Shiwei;//界说十位
unsigned char Dis_Gewei; //界说个位
void delay(unsigned int cnt)
{
while(–cnt);
}

main()
{

TMOD |=0x01;//守时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //翻开中止
TR0=1;

P1=0xfc;//红灯亮
red =1;
while(1)
{
P0=Dis_Shiwei;//显现十位
P2=0;
delay(300);//时间短延时
P0=Dis_Gewei; //显现个位
P2=1;
delay(300);
}

}

void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值99

TH0=0xd8;//从头赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second–;//秒减1
if(second==0)
{ //这儿增加守时到0的代码 ,能够是灯电路,继电器吸合等,或许履行一个程序
if(red)
{
red=0;yellow=1;
second=5;
P1=0xF3;//黄灯亮5秒
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=50;
P1=0xCF;//绿灯亮50秒
}
else if(green)
{
yellow=1;green=0;
second=5;
P1=0xF3;//黄灯亮5秒
turnred=1;
}
else if(yellow && turnred)
{
red=1;yellow=0;
P1=0xFC;//红灯亮60秒
second=60;
turnred=0;
}

}
Dis_Shiwei=tab[second/10];//十位显现值处理
Dis_Gewei=tab[second%10]; //个位显现处理

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/262535.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部