5099|3

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我根据AD转换值产生PWM波,调试出问题 [复制链接]

//ICC-AVR application builder : 2011-8-26 下午 08:01:50
// Target : M16
// Crystal: 7.3728Mhz

#include <iom16v.h>
#include <macros.h>
#define   LCD_RS  PC7
#define   LCD_RW  PC6
#define   LCD_EN  PC5
#define   LCD_DD  PD
#define uchar unsigned char
#define uint unsigned int
unsigned char temp[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char temp1000,temp100,temp10,temp1;
void PWM_init(void)
{
  DDRB=0xFF;             //PB口输出高电平,LED全处于熄灭状态
  PORTB=0xFF;
  TCCR0=0x63;            //0b01100001,PWM相位修正模式,无64分频,在升序计数时发
                         //生比较匹配将清零OC0,降序计数时发生比较匹配将置位OC0
 
}
void PWM_out(unsigned char m)
{
  if(m<2)
   OCR0=100;
  else
   OCR0=255;
 }
unsigned int ADC_Init(void)
{
    unsigned int dat;
    DDRA&=~(1<<PA0);
    PORTA&=~(1<<PA0);
    ADMUX=0;//ADC多工道寄存器,参考外部电压,右对齐,选取PA第一通道
    ADCSRA=0x80;//A通道控制和状态寄存器,取消开始转换,中断标志,自动触发,取消中断使能ADCSR在ICC中可以
    ADCSRA|=1<<ADSC;//开始转换指令
    while(!(ADCSRA&(1<<ADIF)));//中断使能,检测中断使能位同时为高说明已转换完
    ADCSRA |= (1 << ADIF);   //清零ADC中断标志位
    dat=ADCL;//已定义右对齐,先读低8位
    dat=dat+ADCH*256;//在读高8位
    return dat;
}
void delayms(unsigned int ms)
{
   unsigned int j;
   while(ms--)
   {
     for(j=0;j<1141;j++);
   }
}
void  LCD1602_Port_Init(void)
{
 /*LCD1602数据端口设置*/
 DDRD=0xff;//数据口全为输出
 PORTD=0;//输出低电平
  
 /*LCD1602控制端口设置*/
 DDRC|= (1 <<LCD_RS) | (1 <<LCD_RW) | (1 <<LCD_EN);
 PORTC &= ~((1 <<LCD_RS) | (1 <<LCD_RW) | (1 <<LCD_EN));       
}

/*LCD1602初始化定义*/
void LCD1602_Init(void)
{
   delayms(400);
   LCD1602_Write_Command(0x38);//选择显示模式
   delayms(15);
   LCD1602_Write_Command(0x38);//选择显示模式
   delayms(15);
   LCD1602_Write_Command(0x38);//选择显示模式
   delayms(15);
   LCD1602_Write_Command(0x0c);//让显示屏的光标闪烁
    delayms(10);
   LCD1602_Write_Command(0x06);//写完一个字符,显示地址指针自加一
   delayms(10);
   LCD1602_Write_Command(0x01);
   delayms(10);
}

/*LCD1602写指令函数*/
void LCD1602_Write_Command(unsigned char command)
{
  PORTC&=~(1<<LCD_RS);
  PORTC&=~(1<<LCD_RW);
  PORTD=command;
  PORTC|=1<<LCD_EN;
  delayms(5);
  PORTC&=~(1<<LCD_EN);//1602下降沿送数据
}

/*LCD1602写数据指令函数*/
void LCD1602_Write_Data(unsigned char dat)
{
  PORTC|=1<<LCD_RS;
  PORTC&=~(1<<LCD_RW);
  PORTD=dat;
  PORTC|=1<<LCD_EN;
  delayms(5);
  PORTC&=~(1<<LCD_EN);//1602下降沿送数据
}

/*LCD1602指定一个位置显示一个字符*/
void LCD1602_DisplayOneChar(unsigned char x,unsigned char y,unsigned char dat)
{
  unsigned char address;
  if(y==1)
     address=0x80+x;
   else
     address=0x0c+x;//算出地址码
 LCD1602_Write_Command(address);//找到显示的位置
 LCD1602_Write_Data(dat);//显示要显示的字符
}

/*LCD1602指定位置显示一个字符串*/
void LCD1602_DisplayStringChar(unsigned char x,unsigned char y,unsigned char *s)
{
  unsigned char address,i;
  uint lengh;
  if(y==1)
     address=0x40+x;
  else
     address=0xc0+x;
  LCD1602_Write_Command(address);
  lengh= (uint)strlen(s);//调用字符串函数算出字符的长度,并赋值给lengh
  for(i=0;i<lengh;i++)
  {
   LCD1602_Write_Data(*s);//显示一个字符
   s++;
  }
}

/*LCD1602显示自定义字符*/
void LCD1602_DisplayMyChar(char xx,char yy,unsigned char *MyChar,unsigned char saveto)//*作用指向对象的地址
{
  unsigned char add=(saveto<<3)|0x40;
  unsigned char i,t;
  t=*(MyChar+0);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第一行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+1);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第二行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+2);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第三行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+3);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第四行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+4);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第五行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+5);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第六行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+6);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第七行
  LCD1602_Write_Data(t);//写显示数据
  t=*(MyChar+7);
  LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第八行
  LCD1602_Write_Data(t);//写显示数据
 
  for(i=0;i<8;i++)
  {
   LCD1602_Write_Command(add+i);
   LCD1602_Write_Data(*(MyChar+i));
 
  }
  LCD1602_DisplayOneChar(xx,yy,saveto);
}

void main(void)
{
   uint ad_data;
   PWM_init();
   LCD1602_Port_Init();
   LCD1602_Init();
   LCD1602_DisplayStringChar(0,2,"m16 ADC tranform");
   SEI();
 while(1)
 {
  ad_data=ADC_Init();
  ad_data=(5000*(long)ad_data)/1023;
  PWM_out(ad_data);
  temp1000=ad_data/1000;
  temp100=ad_data%1000/100;
  temp10=ad_data%1000%100/10;
  temp1=ad_data%1000%100%10;
  delayms(20);
  LCD1602_DisplayOneChar(1,1,temp[temp1000]);
  LCD1602_DisplayOneChar(2,1,temp[temp100]);
  LCD1602_DisplayOneChar(3,1,temp[temp10]);
  LCD1602_DisplayOneChar(4,1,temp[temp1]);
  
  }
 
}

这是我写的ad转换加PWM程序,用ICCV7编译出现如下问题:iccv7avr\bin\imakew -f LCD1602.mak
    iccavr -c -e -D__ICC_VERSION=722 -DATMega16  -l -g -MLongJump -MHasMul -MEnhanced  main.c
!W E:\ICCproject\LCD1602+AD程序\main.c(67):[warning] calling a function without prototype may cause runtime errors if the function
does not return int or unsigned int
!W E:\ICCproject\LCD1602+AD程序\main.c(83):[warning] declaration of `LCD1602_Write_Command' does not match previous declaration at E:\ICCproject\LCD1602+AD程序\main.c(67)
!W E:\ICCproject\LCD1602+AD程序\main.c(125):[warning] calling a function without prototype may cause runtime errors if the function
does not return int or unsigned int
    iccavr -o LCD1602 -g -e:0x4000 -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:30 -beeprom:0.512 -fihx_coff -S2 @LCD1602.lk   -lcatmega
Device 9% full.
Done. Wed Aug 31 20:45:56 2011
请大哥大姐指导下啊,这是什么问题

这是我的附件: LCD1602+AD程序.rar (129.48 KB, 下载次数: 26)

[ 本帖最后由 guowj513 于 2011-8-31 20:51 编辑 ]

LCD1602+AD程序.rar

125.58 KB, 下载次数: 14

最新回复

顶一下。  详情 回复 发表于 2012-10-25 15:57
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
顶下,谢谢楼主,下来看看
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
楼主这个是数控电源程序么
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶一下。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表