最新日志

发表于:2008-7-9 23:36:21
标签:PIC  

2

我的书"PIC单片机实用C语言程序设计与典型实例"已出版

直接登录我们的网站: www.supermcu.com

或直接登录当当网:http://product.dangdang.com/product.aspx?product_id=20263568

或直接登录中国互动出版网:http://www.china-pub.com/41131

或直接登录中国电力出版社网上书店:http://www.ceppbooks.com/productinfo.asp?id=97875083690039800030

点击看大图

【内容简介】

本书针对目前市场上关于PIC18系列单片机注重理论、实例少的特点而推出。重点给出了PIC18系列单片机的7个综合性的实例,引领读者直接掌握PIC18系列单片机的应用。全书共11章,主要内容包括PIC18F2X20/4X20的内部结构、PIC18FXXX中断系统、PICl8F2X20/4X20外围功能模块、具有温度日历功能的闹钟开发实例、直流电机调速测速系统开发实例、智能风扇控制系统开发实例、半导体恒温控制器开发实例、语音通信DTMF拨号器开发实例、长时间数字语音录放机开发实例、MP3播放器开发实例等。.
本书实例丰富、讲解深入浅出,非常适合从事PIC单片机C语言开发的初中级人员使用,也可作为各高等院校单片机、嵌入式系统课程的教材和参考书。

【目录信息】


前言.
第1章 概述
1.1 单片机应用
1.2 单片机发展趋势
1.3 PIC单片机分类
1.4 PIC单片机优越性
1.5 PIC单片机系列产品
1.6 PIC系列单片机开发工具
本章小结
第2章 PIC18F2X20/4X20内部结构
2.1 PIC18F2X20/4X20主要特色
2.2 PIC18FXXX系列的特殊模块特色
2.3 PIC18F2X20/4X20的内部结构分析
2.4 PIC18F2X20/4X20的引脚功能
2.5 CPU的特殊功能
本章小结
第3章 PICl8FXXX中断系统
3.1 中断
3.2 PICl8nX20/4X20中断
<< 查看详细目录

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(208)
发表于:2008-3-27 23:41:45
标签:西谱电子,SP0602-AVR  

2

IARAVR C编译器的中断使用方法

  IAR公司开发的AVR单片机C编译器是一款非常优秀的开发工具,由于它的编译效率要比ICCAVR、CODEVISIONAVR、GCCAVR编译器都要高,很容易编写出高效的C程序。
  对于C程序的编写,大体都是一样的,只是不同的编译器在标准C基础上都有自己的扩展特性。AVR单片机的中断服务程序的编写对于不同的编译器声明的方法也就不同。例如在IAR AVR C编译器中使用定时器Timer0溢出中断声明的方法如下:
  #pragma vector = TIMER0_OVF_vect
  __interrupt void Timer0_OverFlow_Interrupt(void)
  {
    //用户自己添加的程序段
  }
  "#pragma vector = "是必须声明的,等于号后面内容为对应中断向量地址
  “__interrupt”这是IAR AVR C编译器中的中断服务程序声明的关键字,是必须的。后面就是用户给该中断服务程序取的函数名,由用户自己定义。
  另外有一点必须注意的是:中断服务函数必须为无参,无返回参数的函数。

       我们的网站:www.supermcu.com

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(256)
发表于:2008-3-27 21:13:42
标签:PIC,SP9608  

2

PIC12F629产生四路方波信号

/**************************************************
; CPU类型:      PIC12F629
; 内部RC振荡器: 4MHz
; C编译器:      HT-PICC
; 集成开发环境: MPLAB v8.01
; 方波信号发生器实例
**************************************************/

我们的网站:www.supermcu.com


#include

#define GPIO2_STATUS GPIO2
#define GPIO4_STATUS GPIO4
#define GPIO5_STATUS GPIO5

#define GPIO2_ON  GPIO2=1
#define GPIO2_OFF GPIO2=0
#define GPIO4_ON  GPIO4=1
#define GPIO4_OFF GPIO4=0
#define GPIO5_ON  GPIO5=1
#define GPIO5_OFF GPIO5=0

unsigned char Hz50_Count=0;//产生50Hz频率的软计数器变量
unsigned char Hz1_Count=0;//产生1Hz频率的软计数器变量
 
void System_Init(void)
{
  CMCON = 0x00;//将GP0、GP1初始化为数字I/O引脚
  ANSEL = 0x07;//将GP0、GP1、GP2、GP4初始化为数字I/O引脚
  TRISIO2=0;//置GP2为输出
  TRISIO4=0;//置GP4为输出
  TRISIO5=0;//置GP5为输出
 
  GPIO2 = 0;//GP2输出为低电平
  GPIO4 = 0;//GP4输出为低电平
  GPIO5 = 0;//GP5输出为低电平
 
  T0CS = 0;//选择内部Fosc/4时钟源,作为定时
  PSA  = 0;//将预分频器分配给Timer0模块
  PS2  = 0;//初始化预分频比为1:2
  PS1  = 0;
  PS0  = 0;
 
  TMR0=256-250;//初始化定时500uS的初值
}

void main(void)
{
  System_Init();//调用系统初始化函数
 
  while(1)
    {
      if(1==T0IF)//判断T0IF溢出标志是否为1
        {
          T0IF=0;//清T0IF溢出标志
          TMR0=256-250;//重新装入定时500uS初值
         
          if(1==GPIO2_STATUS)GPIO2_OFF;//如果GP2引脚电平为高电平,则输出低电平
            else GPIO2_ON;//否则输出高电平;此处是产生1KHz方波信号从GP2引脚输出
         
          Hz50_Count++;//产生50Hz方波信号变量加1
          if(20==Hz50_Count)//判断是否满足产生50Hz计数条件
            {
              Hz50_Count=0;//清计数值变量
             
              if(1==GPIO4_STATUS)GPIO4_OFF;//如果GP4引脚电平为高电平,则输出低电平
                else GPIO4_ON;//否则输出高电平;此处是产生50Hz方波信号从GP4引脚输出
               
              Hz1_Count++;//产生1Hz方波信号变量加1
              if(50==Hz1_Count)//判断是否满足产生1Hz计数条件
                {
                  Hz1_Count=0;//清计数值变量
                 
                  if(1==GPIO5_STATUS)GPIO5_OFF;//如果GP5引脚电平为高电平,则输出低电平
                    else GPIO5_ON;//否则输出高电平;此处是产生1Hz方波信号从GP5引脚输出
                }
            }
        }       
    }
}


 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(261)
发表于:2007-8-6 23:59:40
标签:SP0605开发板  西谱电子  

3

单片机串口实现微型热敏打印机的方法

       调试硬件平台:SP0605-51/AVR单片机实验开发板

       调试软件环境:Keil8.01版本( www.keil.com

       最近给客户开发的项目中要求通过单片机打印相关的记录问题,该项目中的微打采用北京炜煌公司生产的WHXX05/08A一款微型打印机,该打印可以通过并口或串口实现微打功能,由于单片机串口的使用是最普遍,因此通过单片机串口与微型打印机之间连接起来,在使用过程中要设置微打的跳线使其工作在串口模式下。

       由于该微打的串口数据格式是:1位起始位+8位数据位+1位奇偶校验位+1位停止。对于51单片机来说可以让51单片机工作在方式3模式下,可以实现9位数据的传输,而将TB8RB8作为奇偶校验位即可。

       由于51单片机的TB8/RB8是作为多机通信的命令/数据标识位,没有专门的奇偶位,我们需要在发送每个字节之前对该字节进行奇偶校验。具体实现的源程序段如下:

void SendDataToPrint(unsigned char SendByte)

{

  unsigned char i;

  unsigned char j;

  unsigned char temp;

 

  j=0;

  temp=SendByte;

  for(i=0;i<8;i++)

    {

      if(0!=(temp & 0x01))

        {

          j++;

        }

      temp>>=1;

    }

  if(0!=(j%2))

    {

      TB8=1;   

    }

    else

      {

        TB8=0;

      }

  SBUF=SendByte;

  TI=0;

  while(0==TI);

  TI=0;

}

       因此,在主程序中只需要调用SendDataToPrint函数来实现内容打印即可。

       下面是主程序段

unsigned char TestStr[]={"西 "};

 

void main(void)

{

  unsigned char i;

 

  SCON=0xC0;//串口工作于方式3,禁止接收

  TMOD|=0x20;

  TH1=0xFA;//Fosc=22.1184MHz,9600波特率

  TL1=0xFA;

  TR1=1;

  Delay(60000);

  Delay(60000);

  SendStrToPrint(TestStr);

  SendDataToPrint(13);//换行命令

  Delay(60000);

  Delay(60000);

  Delay(60000);

  Delay(60000);

  Delay(60000);

  Delay(60000);

  Delay(60000);

  Delay(60000);

  SendDataToPrint(27);

  SendDataToPrint(74);

  SendDataToPrint(60);

  while(1);

}

运行的效果是在热敏纸上打印出“西 子”

我们的网站:西谱电子( www.supermcu.com

       SP0605-51/AVR实验开发板( www.supermcu.com/p_info.asp?id=247

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1117)
发表于:2007-8-3 21:40:25
标签:无标签

3

基于LPC935单片机的TFT触摸屏实现

         本站最近给客户的电子测试仪器增加了触摸屏效果,如下图所示。由于该电子测试仪器原先是采用轻触按键和20X4字符LCD显示模块来实现按钮和显示功能,使得该产品的人机接口传统化,随着液晶显示技术和触摸屏技术的发展,将原先的20X4字符LCD显示换成TFT真彩显示并且要求在TFT真彩屏幕上直接实现按钮的操作,也即触摸屏的要求。

点击看大图

         实现的功能有

1、   直接屏幕上的按钮触摸的动态效果(按下和释放的效果);

2、   实时显示相关参数,如输出电流和电压值,电弱点数等;

3、   具有实时的电流和电压曲线显示;

4、   具有测量结果的打印功能;

所有的功能直接通过LPC935单片机来处理并完成,TFT真彩LCD直接采用液晶驱动模块来完成(该模块具有图片存储与显示功能与单片机采用串口或并口通信)

实现的技术主要有:

1、   获取触摸屏按下的坐标值;

2、   获取触摸屏释放的坐标值;

3、   识别坐标触摸屏的坐标值按钮所在的范围并实现按下释放的立体效果;

4、   打印机输出打印结果;

5、   通过定时器实现实时读取输出的电流和电压参数,并转换成屏幕的曲线坐标,通过两点之间坐标实现画线的效果;

 

我们的网站:www.supermcu.com

 

 

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(1) | 阅读(890)
发表于:2007-6-24 14:44:53
标签:PIC  按键识别  

5

PIC单片机的同一个I/O口实现对LED驱动和按键识别技术

//用PIC单片机的同一个I/O口实现对LED驱动和按键的识别过程
//实现的内容是:当KEY按下该LED亮,再按一下该LED灭.

电路原理图如下所示:
点击看大图

实现的原理如下:

    当RB0为输出为1时,LED灯亮,即使按下KEY对LED的电平没有影响,同理RB0输出为0时也是一样,这时要识别KEY是否按下,将RB0的方向置为输入,此时按下KEY时,会使RB0的引脚为低电平,不按KEY时,RB0引脚为高电平。读取RB0电平之后,立即将RB0的方向置为输出。由于读取按键的电平过程只需要十几个uS左右,所以对LED的电平影响不大,几乎看不到有什么变化。这种方法特别适合,PIC单片机的IO十分紧张的情况下,并且对输出信号变化影响不大的情况下可以使用。

        源代码已经在SP9608-PIC增强型实验开发板验证通过。        

           FOSC="INTOSC"=8MHz,PIC18F4520,

实现的源程序见 http://www.supermcu.com/yc_info.asp?id=383

我们的网站: www.supermcu.com

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(988)
发表于:2007-5-25 15:37:35
标签:AVR  

10

AVR单片机实现的“BreakOut Game”游戏

    这是我为澳洲朋友制作的“BreakOut Game”小游戏软件。该小游戏软件是采用AVR单片机通过AV接口来实现的。由AVR单片机负责AV视频和音频的产生,并同时在AV视频上显示出来。

    采用ATmega32单片机,时钟频率为18.432MHz,产生的AV视频像素大小为100X128,目前产生的AV视频为黑白的,过一段时间准备实现彩色的AV视频。

    具体实现的技术有:

1           AV视频的产生技术

2           AV音频的产生技术

3           游戏中的左右键的识别技术

4           游戏中的球的运动轨迹的设计

5           游戏中的球的生命次数和过关难度的设计

6           ...

具体的效果图片如下:

图片1   图片2   图片3   图片4   图片5   图片6   图片7

 

我们的网站: www.supermcu.com

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(834)
发表于:2007-5-12 15:50:20
标签:西谱电子  SP9608  

12

NAND Flash大容量存储器K9F1G08U的坏块管理方法

    在进行数据存储的时候,我们需要保证数据的完整性,而NAND Flash大容量存储器K9F1G08U芯片由于工艺上问题,不可避免就会出现有的Block中就是某个位或某些位是块的,就是用块擦除命令也是无法擦除的,K9F1G08U数据手册也讲了坏块是存在的,对于K9F1G08U最多有20个坏块。如果数据存储到这个坏块中,就无法保证该数据存储的完整性。对于坏块的管理K9F1G08U数据手册也有它的方法去处理该坏块的方法,我根据实际经验总结出自己的一种方法。首先我们要定义一个坏块管理表:unsigned char BadBlockTable[128],此数组可以存储1024Block状态,即每一个字节存储8Block状态。我们要存储一批数据到NAND Flash中去某个Block时,先执行Block擦除操作,然后分析该Block1st Page2st Page中的每个位是否全是FFH,如果全是FFH,则在BadBlockTable数组当前Block对应的字节位给置0,否则置1。如果是1表示当前的块是不能存储数据的,这时需要更换下一个Block来存储这些数据,这样我们重复上面的动作分析再进行分析是否可以存储数据,该块能存储就存储到该块中去。

    具体实现的算法程序如下:

Flag=TRUE;
while(TRUE==Flag)
{                       

Erase_K9F1G08U_Block(K9F1G08U.HighAddress,K9F1G08U.LowAddress);               Flag=Check_K9F1G08U_Block(K9F1G08U.HighAddress/64);                   if(TRUE==Flag)//is invalid block
{                         

BadBlockTable[K9F1G08U.HighAddress/512]|=

(1<<(K9F1G08U.HighAddress%8));

  K9F1G08U.HighAddress+=64;//Point to Next Block
}
else
// is valid block ,record to BadBlockTable
  {               

BadBlockTable[K9F1G08U.HighAddress/512]&=

~(1<<(K9F1G08U.HighAddress%8));
  }

}
for(i=0;i<sizeof(BadBlockTable);i++)                    

Write_RAM(RAM_BANK_0,K9F1G08U_BAD_BLOCK+i,BadBlockTable[i]);

更多内容,我们的网站:www.supermcu.com

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(6) | 阅读(2228)
发表于:2007-5-9 12:17:15
标签:无标签

10

单片机对128MBNAMDFlash芯片K9F1G08U的读写

ATmega128单片机对128MB NAND Flash 芯片K9F1G08U的读写