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

发布者:火星叔叔最新更新时间:2016-02-25 来源: eefocus关键字:单片机  C语言  程序举例 手机看文章 扫描二维码
随时随地手机看文章
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,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};
   //共阴数码管 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]; //个位显示处理
   
    }
}


关键字:单片机  C语言  程序举例 引用地址:单片机C语言程序举例(二)

上一篇:单片机C语言程序举例(一)
下一篇:松翰单片机 RTC 应用注意

推荐阅读最新更新时间:2024-03-16 14:45

基于ARM的32位MCU提供SoC设计参考
随着制造工艺的迅猛发展,MCU在外设集成、性能、功耗及降低成本方面都有了长足的进展,几乎能提供与SoC相类似的性能,而且应用数量正日趋增长。特别是基于ARM的32位MCU,为SoC设计人员提供了快速低廉的设计参考。 系统级芯片(SoC)技术可以看作是专用集成电路(ASIC)的一种新的设计模式,较之ASIC,其设计周期短,能为设计人员消除设计特殊应用时遇到的障碍。SoC的性能接近于成熟的ASIC,不过它仍需要掩膜,并不能节省ASIC所需的大部分设计成本。 随着先进的制造工艺将更多外设集成于芯片、降低功耗和提供更多的性能,ASIC和标准32位微控制器(MCU)的区别也在缩小。对于基于ARM内核的微控制器而言,当集成了关键外设时,这
[单片机]
μCOS-Ⅱ在ARM系列单片机S3C44B0x上的移植
引 言 目前,嵌入式系统在工业控制、家用电器、移动通信、PDA等各种领域得到了越来越广泛的应用。由于用户对嵌入式产品的性能要求越来越高,程序设计也变得越来越复杂,这就需要一个通用的嵌入式实时操作系统来对其进行管理和控制。对移植了操作系统的嵌入式系统进行设计和开发,可以大大减小程序员的负担,对于不同的应用可以按照相同的步骤来完成系统的设计。 μC/OS-Ⅱ是一种简单高效、源代码公开的嵌入式实时操作系统,具有良好的可扩展性和可移植性,被广泛的应用到各种嵌人式处理器上。μCOS-Ⅱ操作系统拥有可固化,可裁剪,可剥夺性的实时内核,可同时管理64个系统任务。利用移植μCOS-Ⅱ操作系统的嵌入式微处理器来设计和开发产品,对于提高产品
[单片机]
μCOS-Ⅱ在ARM系列<font color='red'>单片机</font>S3C44B0x上的移植
STM32F103单片机生成16路PWM波
单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波。 使用keil5软件,用标准库函数来实现。 首先看定时器初始化 void TIM1_PWM_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitSturcture; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | R
[单片机]
STM32F103<font color='red'>单片机</font>生成16路PWM波
高性价比MCU的传奇 —— STM32H7系列
STM32可以列出很多关键词,跨界通用、全面覆盖、完整生态、超低功耗、多种应用。而高性价比是最受用户关注的关键词。 从2007年推出世界第一款Cortex-M MCU,到2020年新推出的H7系列高性能大内存产品,十几年来,ST在MCU市场上不断加大创新力度,STM32持续出新。5大家族、17条产品线、千款型号、I/O兼容,STM32大家族跨越通用、超低功耗、高性能和超高性价比MCU,全面覆盖各种应用需求,打造出了32位MCU的大帝国。 谈到STM32的高性能家族产品,大家已经对STM32F2/F4/F7耳熟能详。之后的STM32H7系列继承和发展了高性能产品家族的特性,其中单核的H743/750和双核745/747也已经得到了
[单片机]
基于51单片机的OLED显示图片文字
一、前言 从性能来说OLED屏幕分辨率相对较高,引脚也少很多,占用的I/O口会少很多。从功耗来说首先oled显示屏不需要背光灯,当有电流通过时,这些有机材料就可以发光,而且3.3V~5V之间都可以使用。从外观来说体型更小,重量更轻更薄,可用来制作许多小型显示设备。这次我使用的是四个引脚的0.95寸oled显示屏,进行文字图片的循环显示。 二、OLED模块介绍 1、液晶显示屏 液晶显示器,为平面超薄的显示设备,它由一定数量的彩色或黑白像素组成,放置于光源或者反射面前方。液晶显示器功耗很低,因此倍受工程师青睐,适用于使用电池的电子设备。它的主要原理是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。 液晶显示器的工作原理:液晶
[单片机]
基于51<font color='red'>单片机</font>的OLED显示图片文字
MCS51单片机的定时器/计数器概念 非常好的寄存器关系图
一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令
[单片机]
MCS51<font color='red'>单片机</font>的定时器/计数器概念 非常好的寄存器关系图
利用单片机构成高精度PWM式12位D/A
.前言 在用单片机制作的变送器类和控制器类的仪表中,需要输出1—5V或4—20mA的直流信号的时候,通常采用专用的D/A芯片,一般是每路一片。当输出信号的精度较高时,D/A芯片的位数也将随之增加。在工业仪表中,通常增加到12位。12位D/A的价格目前比单片机的价格要高得多,占用的接口线数量也多。尤其是在需隔离的场合时,所需的光电耦合器数量与接口线相当,造成元器件数量大批增加,使体积和造价随之升高。如果在单片机控制的仪表里用PWM方式完成D/A输出,将会使成本降低到12位D/A芯片的十分之一左右。我们在S系列流量仪表中采用了这种方式,使用效果非常理想。下面介绍一下PWM方式D/A的构成原理。 .电路原理 一般1
[单片机]
利用<font color='red'>单片机</font>构成高精度PWM式12位D/A
以C8051F020单片机为控制核心的人机交互系统设计
在现代各类仪器的开发中,人机交互功能正起着无可替代的作用。人机交互界面友好的仪器将更容易操作和使用,从而提高工作效率。液晶显示器(LCD)具有功耗低、价格低、寿命长、接口控制方便等特点,在科研与设计领域正发挥着越来越大的作用。FPGA 作为单片机外设的接口芯片,可以大大简化接口电路,通过对FPGA 进行编程,可以实现常用的译码、地址选通等功能。 本文以C8051F020 单片机与FPGA 互连系统为控制核心,以液晶显示控制器T6963C 为例,结合行扫描键盘,简述了一种人机交互功能的设计。 1 系统设计方案: FPGA 可在很大程度上扩展单片机的资源,然而人机交互功能仍应尽量减少对单片机及FPGA 的资源消耗, 以便将更多
[单片机]
以C8051F020<font color='red'>单片机</font>为控制核心的人机交互系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved