找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4405|回复: 4
打印 上一主题 下一主题
收起左侧

mega128波形发生器仿真及源程序 LCD显示

[复制链接]
跳转到指定楼层
楼主


AVR studio编译环境。波形发生器仿真,全部资料下载:
lcd.zip (72.27 KB, 下载次数: 108)


单片机程序:
  1. //#include
  2. //#include
  3. #include  
  4. #include
  5. #include
  6. #include
  7. #define F_CPU 8000000UL                  // 8MHz clock
  8. #include
  9. #include
  10. #include

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. //#define lcdrs PORTG2
  14. //#define lcdwr PORTG1
  15. //#define lcden PORTG0

  16. uchar const table1[]={" The period is"};
  17. uchar const table2[]={"The frequency is"};
  18. unsigned char const sin_tab[]={   
  19.                                 125,128,131,134,138,141,144,147,150,153,156,159,
  20.                                                                 162,165,168,171,174,177,180,182,185,188,191,193,196,198,201,203,
  21.                                                                 206,208,211,213,215,217,219,221,223,225,227,229,231,232,234,235,
  22.                                                                 237,238,239,241,242,243,244,245,246,246,247,248,248,249,249,250,
  23.                                                                 250,250,250,250,250,250,250,249,249,248,248,247,246,246,245,244,
  24.                                                                 243,242,241,239,238,237,235,234,232,231,229,227,225,223,221,219,
  25.                                                                 217,215,213,211,208,206,203,201,198,196,193,191,188,185,182,180,
  26.                                                                 177,174,171,168,165,162,159,156,153,150,147,144,141,138,134,131,
  27.                                                                 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76,73,
  28.                                                                 70,68,65,62,59,57,54,52,49,47,44,42,39,37,35,33,31,30,29,29,28,27,26,25,25,23,21,
  29.                                                                 19,18,16,15,13,12,11,9,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,1,1,2,
  30.                                                                 2,3,4,4,5,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,
  31.                                                                 39,42,44,47,49,52,54,57,59,62,65,68,70,73,76,79,82,85,88,97,94,97,
  32.                                                                 100,103,106,109,112,116,119,122
  33.                                                                 };
  34. float period;
  35. float frequency;
  36. uchar change_flag;
  37. uchar const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  38. uchar i=0;
  39. uchar wave_flag=0;
  40. uchar sine_wave;
  41. uchar pluse;
  42. uchar triangle=0,flag;
  43. uchar counter=1;
  44. uchar show_number;


  45. void write_lcdcom(uchar date)//写lcd1602命令
  46. {
  47.         PORTG&=0xFD;
  48.         PORTG&=0xFB;
  49.         _delay_us(5);
  50.         PORTF=date;
  51.         PORTG|=0x01;
  52.         _delay_us(5);
  53.         PORTG&=0xFE;
  54. }

  55. void write_lcddate(uchar lcddate)//写1602数据
  56. {
  57.         PORTG&=0xFD;
  58.         PORTG|=0x04;
  59.         _delay_us(5);
  60.         PORTF=lcddate;
  61.         PORTG|=0x01;
  62.         _delay_us(5);
  63.         PORTG&=0xFE;
  64. }

  65. void lcd_init()//1602初始化
  66. {
  67.         write_lcdcom(0x38); //display mode
  68.         //write_lcdcom(0x38); //display mode
  69.         //write_lcdcom(0x38); //display mode
  70.         write_lcdcom(0x06); //显示光标移动位置
  71.         write_lcdcom(0x0c); //显示开及光标设置
  72.         write_lcdcom(0x01); //显示清屏
  73. }

  74. void display()//显示字符子函数
  75. {
  76.         uchar i;
  77.         PORTG&=0xFD;
  78.         PORTG&=0xFB;
  79.         PORTG&=0xFE;
  80.     _delay_ms(1);
  81.         if(change_flag==0)
  82.         {
  83.             write_lcdcom(0x80);//第一行lcd显示地址
  84.             for(i=0;i<16;i++)
  85.                 {
  86.                   write_lcddate(table1[i]);//显示table1中的字符
  87.                 }
  88.      }
  89.    else
  90.     {
  91.             write_lcdcom(0x80);//第二行LCD显示起始地址
  92.                 for(i=0;i<16;i++)
  93.                 {
  94.                   write_lcddate(table2[i]);//显示table2中的字符
  95.                 }
  96.         }
  97.         PORTG|=0x02;
  98.         PORTG|=0x04;
  99.         PORTG|=0x01;
  100. }

  101. void lcd_printf(uint x)//LCD数据显示函数
  102. {
  103.         uchar x1,x2,x3,x4;
  104.    
  105.         x1=x/1000;
  106.         x2=x%1000/100;
  107.         x3=x%100/10;
  108.     x4=x%10;
  109.    
  110.     write_lcdcom(0xc6);
  111.         write_lcddate(x1+0x30);//0x30是0的ascii码
  112.     write_lcddate(x2+0x30);
  113.         write_lcddate(x3+0x30);//0x30是0的ascii码
  114.         write_lcddate(x4+0x30);
  115.         if(change_flag==0)
  116.         {
  117.                 write_lcddate('m');
  118.                 write_lcddate('s');
  119.         }
  120.         else
  121.         {
  122.                 write_lcddate('H');
  123.                 write_lcddate('z');
  124.         }
  125. }

  126. void io_init(void)//端口初始化
  127. {
  128.     DDRA=0xFF;                 //端口A输出
  129.     DDRC=0xFF;                 //端口C输出
  130.     DDRG=0xFF;                 //端口G输出
  131.         DDRD=0XFF;
  132.         DDRB=0XFF;
  133.         DDRF=0XFF;
  134.     PORTB&=0xFE;               //PB0低电平
  135.     PORTC=0xFF;               
  136. }

  137. void key()//波形发生按键
  138. {
  139.          if(PINC==0XFE)// 波形转换
  140.          {
  141.             wave_flag++;
  142.                 if(wave_flag>3)
  143.                   wave_flag=0;
  144.           }
  145.          while(PINC==0XFE);

  146.            if(PINC==0XFD)//周期频率转换
  147.           {
  148.            show_number=1;
  149.             change_flag++;
  150.                 if(change_flag>1)
  151.                 change_flag=0;
  152.           }
  153.          while(PINC==0XFD);

  154.          
  155.           if(PINC==0XFB)//加
  156.           {
  157.                  counter++;
  158.                  if(counter>254)
  159.                   counter=255;
  160.           }
  161.          while(PINC==0XFB);
  162.          
  163.           if(PINC==0XF7)//减
  164.           {
  165.                counter--;
  166.                  if(counter<1)
  167.                  counter=1;
  168.           }
  169.          while(PINC==0XF7);
  170. }

  171. void timer0_init(void)//中断初始化
  172. {
  173.     TCNT0=0x7F;//5;
  174.         TIMSK|=(1<<toie0); 使能tc0溢出中断
  175.     TCCR0|=(1<<cs01); 8分频
  176. }


  177. ISR(TIMER0_OVF_vect)
  178. {
  179.         TCNT0=0X7F;
  180. //        i++;
  181.         i=i+counter;
  182.     if(i>=255)
  183.     i=0;
  184.    if(wave_flag==0)//锯齿波
  185.    {
  186.             PORTA=i;   
  187.                 period=4000/(counter*5);         
  188.                 frequency=10000/(period);

  189.         }
  190.         else if(wave_flag==1)//正弦波
  191.         {
  192.                 sine_wave=sin_tab[i];
  193.                 PORTA=sine_wave;
  194.                 period=4000/(counter*5);         
  195.                 frequency=10000/(period);
  196.         }
  197.         else if(wave_flag==2)//方波
  198.         {
  199.             if(i<127)
  200.         PORTA=0xFF;
  201.                 else
  202.                 PORTA=0x00;
  203.                 period=4000/(counter*5);         
  204.                 frequency=10000/(period);

  205.         }
  206.         else if(wave_flag==3)//三角波
  207.         {
  208.                
  209.              if(!flag)
  210.              {
  211.                 PORTA=triangle++;
  212.                         if(triangle==0)
  213.                         {triangle=255;flag=1;}
  214.                     }
  215.            else if(flag)
  216.              {
  217.                    PORTA=triangle--;
  218.                    if(triangle==255)
  219.                    {triangle=1;flag=0;}
  220.                 period=4000/(counter*5);         
  221.                 frequency=10000/(period);
  222.                 }
  223.     }

  224. }




  225. /****************************************************************************
  226. 函数功能:主程序
  227. 入口参数:
  228. 出口参数:
  229. ****************************************************************************/
  230. int main (void) __attribute__((naked));

  231. int main(void)
  232. {
  233.     asm("cli");                                                //关总中断
  234.     io_init();                     //端口初始化
  235.     timer0_init();                 //中断初始化
  236.         lcd_init();
  237.     asm("sei");                    //开总中断
  238.     display();
  239.     while(1)
  240.     {
  241.             if(change_flag==0)
  242.                 {
  243.                    if(show_number==1)
  244.                    {
  245.                   display();
  246.                           show_number=0;
  247.                    }
  248.           lcd_printf(period);
  249.                 }
  250.                 else
  251.                 {
  252.                    if(show_number==1)
  253.                    {
  254.                   display();
  255.                           show_number=0;
  256.                    }
  257.           lcd_printf(frequency);
  258.                 }
  259.         key();
  260.       
  261.     }
  262. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:146834 发表于 2016-11-20 11:49 | 只看该作者
回帖致敬。
回复

使用道具 举报

板凳
ID:237210 发表于 2017-10-9 19:34 | 只看该作者
观摩学习
回复

使用道具 举报

地板
ID:136032 发表于 2017-10-13 06:31 来自手机 | 只看该作者
不错的资料很好
回复

使用道具 举报

5#
ID:44037 发表于 2017-10-15 07:55 | 只看该作者
谢谢分享   非常好的学习资料
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表