EDN首页   博客首页

2

关于投票
Mega16 Bootloader+PC端上位机

AVR的Bootloader功能很方便产品的在线升级,以前参考网上的资料写过下位机的程序,标准的XMODEM协议,用超级终端来升级程序。最近在学习C#,所以用C#写个简单的上位机软件,配合以前的bootloader程序实现在线升级。下位机用的Mega16, 实验效果还行,但是比较简单,离实际应用还差很远。

上位机编译环境:C#2008 Express       工程代码:http://space.ednchina.com/upload/2009/4/8/c48f3f71-a2eb-45d2-94a7-b8233ffed606.rar

下位机编译环境:WinAVR                   工程代码:http://space.ednchina.com/upload/2009/4/8/14048d26-6afb-4d48-9b26-14837b2312c7.rar

系统分类: 单片机
用户分类: AVR
标签: BootLoader Mega16 AVR 上位机 C#
来源: 原创
发表评论 阅读全文(403) | 回复(2)

0

关于投票
Mega16热敏电阻测温上位机曲线显示

最近在一直学习用C#做上位机,把以前的做的m16热敏电阻测温的程序翻出来,稍加修改通过串口发给PC;PC端用c#2008写程序,接收数据后通过ZedGraph绘图控件实时显示出曲线图。ZedGraph这个开源控件真是好用,很方便,不过介绍都是英文的,网络上也简单使用的方法,看后也能绘出图形。

这是年前最后一次发贴了,再过两天就回老家过年了,就当新年礼物送给大家啦,哈哈!

硬件电路:电路很简单,就不再画了,一个5K电阻传5K的热敏电阻到地,中间送m16的ADC0。

软件截图:

点击看大图

上位机源码:http://space.ednchina.com/upload/2009/1/21/2201148d-7aa2-4aef-856c-d6010fbd0cc6.rar

下位机源码:http://space.ednchina.com/upload/2009/1/21/6c562d61-c65c-4832-97ab-0065594f2052.rar

系统分类: 单片机
用户分类: AVR
标签: Mega16 热面电阻 测温 上位机 C# 曲线
来源: 原创
发表评论 阅读全文(505) | 回复(2)

4

关于投票
Mega16驱动5110液晶来玩贪吃蛇

硬件环境:
       MCU用的Mega16内部RC 8M,液晶是诺基亚5110的液晶模块(在网上买的)跟邮购部3310液晶的驱动方式一样。游戏思路参考的傻孩子书里面,程序还不太完善,有错误的地方还请大家指出,运行速度感觉还行!
电路很简单就不在说了 ,应为我自己也没画图,就是单片机的ISP口液晶模块,然后是4个按键接到IO口上。
软件环境:
      WINAVR GCC

图片:

点击看大图

游戏开始界面

点击看大图

游戏中

点击看大图

Game Over

项目源码: http://space.ednchina.com/upload/2008/11/26/6cd7e877-93c6-4bba-8b36-8bd7d8554b3d.rar

系统分类: 单片机
用户分类: AVR
标签: 贪吃蛇 mega16 5110 液晶
来源: 原创
发表评论 阅读全文(931) | 回复(1)

1

关于投票
[原创]Mega16驱动5110液晶

前一段时间在网上买了两块Nokia 5110的液晶模块,参考了网上的一些例子自己也可驱动了,这款液晶模块驱动方便,体积也很小,很适合试验调试的时候做显示终端来用,淘宝很多商家都有的卖。

现在程序可以显示一幅图片,ASIIC字符和12x12的中文汉字 ,不过你的自己做字库,字库软件网上很多。看下显示效果吧:

点击看大图

点击看大图

主程序:pdf

系统分类: 单片机
用户分类: AVR
标签: 5110液晶 驱动 Meag16
来源: 原创
发表评论 阅读全文(531) | 回复(0)

6

关于投票
[原创]Mega16硬件SPI驱动12位AD芯片TLC2543

TLC2543是TI的一片12位AD芯片,11通道AD转换,数据传输符合SPI串行方式,是常用的高精度AD芯片,价格有点贵了35一片,不过物有所值,在实验中读书还是很稳定的。TLC2543的操作也很简单,命令格式:通道+精度+数据顺序,不过值得注意的:是本次读取的值是上次转换的AD值,也就是说本次发送的命令是启动下一次转换同时读取上次转换的值。

老规矩看图片:

点击看大图

硬件电路是AVR的Mega16,用硬件SPI方式驱动TLC2543,不过SPI的速度比能太快否则读不到数据,我这里用Fmcu/8,(Fmcu = 7.378628M)。程序中的16精度其实有效只有12位,TLC2543是为了方便SPI的传输方式专门照顾的方式,应为SPI传输的都是8BIT字节的整数倍。

点击看大图

只是同过串口调试助手观察通道0的电压值,还是比较准确,虽然我的参考电压直接接的VCC。

工程源代码下载:

编译环境 :AVRStudio + WinAVR 20070525http://space.ednchina.com/upload/2008/9/15/3c05eaec-67b7-4df2-9018-7d27eff5bab0.rar

代码里只是简单的测试了通道0,要测量其它通道只需调用相关函数即可。

附TLC2453中文手册(感谢AVR与虚拟仪器网提供翻译好的中文资料)pdf

 

系统分类: 单片机
用户分类: AVR
标签: TLC2453 驱动 Mega16
来源: 原创
发表评论 阅读全文(1462) | 回复(7)

6

关于投票
[原创]M16驱动12864液晶(KS0108)

最近做项目要用到一块JCM12864A的液晶,控制器是KS0108的。这块液晶在绘图方面比ST7920的方便多了,但是不带字库,如果显示字符少的话自己做字库也很方便的。

先上张效果图,晚上照的效果不太好凑和着看吧o(∩_∩)o...

点击看大图

因为要显示的西文字符多,我这里用的是5*7的字库,所以显示的比较紧凑;汉字我用的16*16宋体加粗。代码里有显示96个ASCII码和汉字的函数,可以单个或字符串显示。

项目代码(AVRStudio+GCC):http://space.ednchina.com/upload/2008/9/14/8822d5cd-7f84-42e9-b118-241b7c0fcff8.rar

没用过KS0108液晶的可以参考上面的代码,觉的好你就顶一下!icon

系统分类: 单片机
用户分类: AVR
标签: 12864 KS0108 液晶 驱动
来源: 原创
发表评论 阅读全文(2832) | 回复(11)

3

关于投票
【原创】Mega16读写SD卡

这是我这几天学习SD卡读写的结果,参考了网络上的一些资料,上电初始化数据后读取容量制造商信息,然后往块2写入512字节数据然后读出,串口显示。硬件是Mega16外部7.37628M晶体SPI方式读写。

点击看大图

点击看大图

项目工程下载:http://space.ednchina.com/upload/2008/9/3/e6dfdcd8-fc9d-48c9-8a65-a9ee9b1438a8.rar

系统分类: 单片机
用户分类: AVR
标签: SD 驱动 Mega16
来源: 原创
发表评论 阅读全文(1161) | 回复(6)

2

关于投票
[学习]用595驱动LED实现灰度调节

前一段时间在ouravr论坛里闲逛的时候看到一篇关于用595驱动LED现实等级灰度的求助贴,楼主的意思是用595驱动LED,并且每个LED的亮度值可以随意调节,来达到不同的灰度。我感觉挺有意思的,用595驱动LED并不难,整体亮度调节也不难,再用PWM控制所有595OE就可以了,单个LED灰度的调节就比较麻烦了。有一位叫“polarbear 枫叶”回帖提出的思路比较简单新颖,我按照他的思路试验了,感觉效果还不错!硬件是M48+2片595+16个LED,用的硬件ISP主机模式。 

先上图再说:

点击看大图

 

现在来说说实现的方法吧,转载一下枫叶的原话:

16个灰度,也就是 0--15,用4BIT来表示, 8-4-2-1

PWM产生4个联系不同占空比的脉冲

T8        8/16                
对应
BIT8        
T4        4/16                
对应
BIT4        
T2        2/16                
对应
BIT2        
T1        1/16                
对应
BIT1        

8/16
表示的是把PWM的周期划分为16份,其中量的周期占8份,其他雷同


当这4个脉冲运行后,由于人的生理特点。也会出现需他的灰度;

同上面的方法比较,它需要4次个周期人眼才能感觉出灰度;

但是对PWM的要求就很低;比如256种灰度,不过送8次,1024也不过要10

大大减低了对硬件的要求,现在基本都是使用这种方法;


在一个595+出现不同的灰度,就必须结合下面说的东东;

把一个灰度分解成4

例如灰度9
 1001
T8        8/16                
对应
BIT8        
T4        
不亮                对应
BIT4        
T2        
不亮                对应
BIT2        
T1        1/16                
对应
BIT1
所以我们的各个灰度分解为4帧,送4次都595,就可以了

例如在1595上出现下面不同灰度的4个点,(就以4个点举例,)

4
个点的灰度

3,12,10,7
转化为BIN

0011  1100  1010 0111
8-4-2-1分割出来,得到独立的4

BIT8
0      1     1   0
BIT4
0       1     0   1
BIT2
1      0      1   1
BIT1
1      0      0    1

步骤:

1.
BIT8的数据送到595,PWM控制OE的脉冲为
T8
2.
BIT4的数据送到595,PWM控制OE的脉冲为
T4
3.
BIT2的数据送到595,PWM控制OE的脉冲为
T2
4.
BIT1的数据送到595,PWM控制OE的脉冲为
T1


经过4帧的时间叠加后,就得到不同的灰度。

 

原帖地址:http://www.ouravr.com/bbs/bbs_content_all.jsp?bbs_sn=985613

我的程序下载(WINAVR GCC + m48Dev)rar

 

 

系统分类: 单片机
用户分类: AVR
标签: 灰度 595 LED
来源: 整理
发表评论 阅读全文(903) | 回复(0)

3

关于投票
[原创]Mega48解码PS/2键盘+串口显示

前几天在单位发现了一个古董机级的键盘,估计是以前X86机器上的键盘,虽然出的早但键盘依然很结识,拿起来很有手感(很重金属材料用的不少),连接上电脑居然还能使用,不过遗憾的是有现按键在XP系统下识别不了。仍了怪可惜的,作为研究PS2协议还是很不错的,于是乎就查资料写了个PS/2键盘的小程序,AVR GCC环境下编写,单片机用是AVR的Mega48v,硬件平台还是我的m48Dev 外置7.3728M晶体,PS/2键盘与单片机连接如下:

PS/2_DATA -------------------PC0

PS/2_CLK----------------------INT0

PS/2_VCC----------------------+5V

PS/2_GND----------------------GND

串口接收截图

点击看大图

部分核心代码:

/************************************************************************
*名称: unsigned char PS2_KeyDeCode(unsigned char bKeyCode)     
*功能: PS2键盘解码程序                     
*参数: bKeyCode 键盘码        
*返回: 按键的ASIIC码                                     
************************************************************************/
unsigned char PS2_KeyDeCode(unsigned char bKeyCode)
{
 unsigned char i;
 if (!PS2KeyStatus.bBreakFlag)//通码
 {
  switch (bKeyCode)//开始翻译扫描码
  {
   case 0xF0: //键盘释放随后的一个字节是断码
   {
    PS2KeyStatus.bBreakFlag = 1;//断码标志置位
    break;
   }
   case 0x12:    //左shift键按下
   {
    PS2KeyStatus.bShiftFlag = 1; //shift标志置位
    break;
   }
   case 0x59:    //右shift键按下
   {
    PS2KeyStatus.bShiftFlag = 1; //shift标志置位
    break;
   }   
   default:       
   { 
    PS2KeyStatus.bBreakFlag = FALSE;
    if(!PS2KeyStatus.bShiftFlag) //如果shift键没有按下
    {  
     for(i = 0; i < 65; i++)//查表找按键ASIIC码
     {
      if(pgm_read_byte(PS2CodeUnShift[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeUnShift[i] + 1);
       PS2KeyStatus.bKeyNewFlag = TRUE;
       break;
      }
     }
    }
    else  //如果shift键按下
    {       
     for(i=0; i < 65; i++)//查表找按键ASIIC码
     {
      if(pgm_read_byte(PS2CodeShift[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeShift[i] + 1);
       PS2KeyStatus.bKeyNewFlag = TRUE;
       break;
      }
     }
    }
    break;
   }
  }
 }
 else //断码
 {
  PS2KeyStatus.bBreakFlag = 0; //将断码标志复位
  switch (bKeyCode)  //检测shift键释放
  {
   case 0x12 :      //左shift键
    PS2KeyStatus.bShiftFlag = 0;
    break;
   case 0x59 :   //右shift键
    PS2KeyStatus.bShiftFlag = 0;
    break;
   default:
    break;
  }
 }

下载完整代码:rar
另附PS/2协议中文版pdf

 

系统分类: 单片机
用户分类: AVR
标签: PS/2 键盘 Meag48 AVR 串口
来源: 原创
发表评论 阅读全文(873) | 回复(2)

1

关于投票
[原创]用M48的PWM功能控制风扇转速

   比较基础简单的试验,适合新手入门老鸟就不用看了,呵呵!

   ATMega48的定时器1工作在8位快速PWM模式,产生3906.25Hz的PWM波通过三极管来调整风扇的转速,风扇是CPU散热器上的直流12V风扇。程序是循环重低到高再到低来调整风扇转速。

点击看大图

代码如下:

/*************************************************************************
* Copyright (c) 2007 wormchen            
* All rights reserved             
* 文 件 名: main.c              
* 说    明: PWM 调整风扇转速                
*                            
* 主要硬件: AtemlMega48(内部1M)            
* 编译环境: WinAVR 20070525            
* 当前版本: 1.0               
* 作    者: wormchen               
* 完成日期: 2008年4月22日11:33:19          
* 取代版本: 1.0               
* 原作  者: wormchen              
* 完成日期: 2008年4月22日11:33:23          
************************************************************************/  
#include
#include
#include
unsigned int uchPWM = 0;

/************************************************************************
* 名称: void DelayMS(unsigned int uiMS)           
* 功能: 延时nms                     
* 参数: 无                                   
* 返回: 无                                     
************************************************************************/
void DelayMS(unsigned int uiMS)
 { 
  while(uiMS--)
   {
    _delay_loop_2(250); // 延时1ms(粗略)
   }
 }
/*************************************************************************
* 名称: void PORT_Init(void)              
* 功能: 端口初始化                    
* 参数: 无                                   
* 返回: 无                                     
*************************************************************************/ 
void PORT_Init(void)
 {
  PORTB &=  ~((1 << PB1) | (1 << PB2));
  DDRB = (1 << PB1) | (1 << PB2); 
 } 
/*************************************************************************
* 名称: void Timer1_Init(void)              
* 功能: TIMER1初始化                    
* 参数: 无                                   
* 返回: 无                                     
*************************************************************************/
void Timer1_Init(void)
{
 //快速PWM模式频率3906.25Hz
 TCNT1 = 0x0000;
 OCR1A = 0x0000;
 TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
 //比较匹配清零TOP置位
 TCCR1B = (1 << WGM12) | (1 << CS10);
 //定时器1工作于8位快速PWM模式无分频

int main(void)
 {
  PORT_Init();
  Timer1_Init();
  while(1)
   {
    for(uchPWM = 0 ; uchPWM < 255; uchPWM++)
    {
     OCR1A = uchPWM;
     if(uchPWM == 0)
     {
      DelayMS(2000);
     }
     else
     {
      DelayMS(100);
     }     
    }
    for(uchPWM = 255 ; uchPWM > 0; uchPWM--)
    {
     OCR1A = uchPWM;
     if(uchPWM == 255)
     {
      DelayMS(2000);
     }
     else
     {
      DelayMS(100);
     }
     
    }
   }
 }

 

系统分类: 单片机
用户分类: AVR
标签: PWM 转速 m48 AVR
来源: 原创
发表评论 阅读全文(1029) | 回复(0)
23Next >Total , Page /