本文引用地址:
http://butianyuan.cn/article/201611/320071.htm
#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 //數(shù)據(jù)端口
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));//循環(huán)顯示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};//正轉(zhuǎn)表格
unsigned char code B_Rotation[4]={0x10,0x08,0x040,0x02};//反轉(zhuǎn)表格
void Delay(unsigned int i)//延時
{
while(--i);
}
main()
{
unsigned char i;
while(1)
{
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉(zhuǎn)表格
Delay(10000); //改變這個參數(shù)可以調(diào)整電機轉(zhuǎn)速
}
}
}
10. 直流電機調(diào)速
#include
sbit KEY1 = P3^1;
sbit PWM = P1^5;
unsigned char CYCLE; //定義周期 該數(shù)字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;// 時間可以調(diào)整 這個是10步調(diào)整 周期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 保持原來狀態(tài)
PWM = 0;//燈亮
}
}
11.秒表
#include
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共陰數(shù)碼管 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,0x55,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};
//共陰數(shù)碼管 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的代碼 ,可以是燈電路,繼電器吸合等,或者執(zhí)行一個程序
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]; //個位顯示處理
}
}
評論