微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机C语言程序举例(二)

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

时间:11-22 来源:互联网 点击:
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
{

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top