找回密码
 立即注册

QQ登录

只需一步,快速开始

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

无法实现正弦波频率的调节,哪位大神帮忙看看怎么回事,感激万分

[复制链接]
跳转到指定楼层
楼主
ID:118267 发表于 2016-5-10 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include"reg52.h"
  2. #include"12864.h"
  3. #include"da7621.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ulong unsigned long

  7. unsigned char a,b,c,j=3;

  8. void main()
  9. {         
  10.         P0=0xff;
  11.         P2=0xff;
  12.         TMOD=0x01;                 //设定定时器0为方式1
  13.         EA=1;                           //开总中断
  14.         EX0=1;                          
  15.         EX1=1;                                //打开外部中断允许为位
  16.         IT0=0;                                 //关闭t0定时器中断允许位
  17.         IT1=0;
  18.                           //延时
  19.         lcd_init();                                //初始化12864液晶
  20.         lcd_display();
  21.         ms=500;
  22.         fro=ms;

  23. //        while(!flag);        //等待按键处理
  24. //        flag=0;
  25.         TH0=(65536-917431/fro)/256; //10^6*(1/fro)/(12/11059200)=917431/fro
  26.         TL0=(65536-917431/fro)%256;
  27.         TR0=1;
  28.         while(1)
  29.         {
  30.            write_f(ms);
  31.            key();
  32.         }
  33. }
  34. void INT0_key() interrupt 0//键盘扫描
  35. {
  36.         uchar a,b,c;
  37.         for(c=40;c>0;c--)
  38.                 for(b=50;b>0;b--)
  39.                         for(a=250;a>0;a--)
  40.                                 {
  41.                                         key();
  42.                                 }
  43. }
  44. void INT1_exit_sin() interrupt 2 //退出正弦波输出死循环
  45. {
  46.         uchar exit;
  47.         exit=1;

  48. }          
  49. #define uchar unsigned char
  50. #define uint unsigned int
  51. //端口定义
  52. #define LCD_data P0           //数据口
  53. sbit LCD_RS = P1^5;                        //寄存器选择输入
  54. sbit LCD_RW = P1^6;                   //液晶读写/写控制
  55. sbit LCD_EN = P1^7;                   //液晶使能控制
  56. sbit LCD_PSB= P1^4;                        //串/并方式控制

  57. uchar code dis1[]={"频率:"};
  58. uchar code dis2[]={"Hz"};

  59. void delayms(uint xms)
  60. {
  61.         uint i,j;
  62.         for(i=xms;i>0;i--)
  63.                 for(j=110;j>0;j--);
  64. }
  65. //写指令数据到LCD
  66. //RS=L,RW=L,E=高脉冲,D0-D7=指令码
  67. void write_cmd(uchar cmd)
  68. {
  69.         LCD_RS=0;
  70.         LCD_RW=0;
  71.         LCD_EN=0;
  72.         P0=cmd;
  73.         delayms(5);
  74.         LCD_EN=1;
  75.         delayms(5);
  76.         LCD_EN=0;
  77. }
  78. //写显示数据到LCD
  79. //RS=H,RW=L,E=高脉冲,D0-D7=数据
  80. void write_dat(uchar dat)
  81. {
  82.         LCD_RS=1;
  83.         LCD_RW=0;
  84.         LCD_EN=0;
  85.         P0=dat;
  86.         delayms(5);
  87.         LCD_EN=1;
  88.         delayms(5);
  89.         LCD_EN=0;
  90. }
  91. //设定显示位置
  92. void lcd_pos(uchar X,uchar Y)
  93. {
  94.         uchar pos;
  95.         if(X==0)
  96.                 {X=0x80;}
  97.         else if(X==1)
  98.                 {X=0x90;}
  99.         else if(X==2)
  100.                 {X=0x88;}
  101.         else if(X==3)
  102.                 {X=0x98;}
  103.         pos=X+Y;
  104.         write_cmd(pos);  //显示地址
  105. }

  106. void lcd_display()
  107. {
  108.         uchar i;
  109.         lcd_pos(0,0);                                //设置显示位置为第二行的第一个字符
  110.         i=0;
  111.         while(dis1[i]!='\0')
  112.         {
  113.                 write_dat(dis1[i]);                  //显示字符
  114.                 i++;
  115.         }
  116.         lcd_pos(0,6);                                  //设置显示位置为第三行的第一个字符
  117.         i=0;
  118.         while(dis2[i]!='\0')
  119.         {
  120.                 write_dat(dis2[i]);           //显示字符
  121.                 i++;
  122.         }
  123. }
  124. //LCD初始化设定
  125. void lcd_init()
  126. {
  127.         LCD_PSB=1;                                 //并口方式
  128.         write_cmd(0x30);                 //基本指令操作
  129.         delayms(5);
  130.         write_cmd(0x0c);                  //显示开,关光标
  131.         delayms(5);
  132.         write_cmd(0x01);                        //清除LCD的显示内容
  133.         delayms(5);
  134. }

  135. #define uchar unsigned char
  136. #define uint unsigned int
  137. #define ulong unsigned long

  138. sbit key1=P3^7;
  139. sbit key2=P3^6;
  140. sbit key3=P3^5;

  141. unsigned char code tab[]={
  142. 0x800,0x86B,0x8D6,0x940,0x9AA,0xA12,0xA79,0xADE,0xB41,0xBA1,
  143. 0xC00,0xC5B,0xCB3,0xD08,0xD5A,0xDA7,0xDF1,0xE37,0xE78,0xEB5,
  144. 0xEED,0xF20,0xF4E,0xF77,0xF9B,0xFB9,0xFD2,0xFE6,0xFF4,0xFFC,
  145. 0xFFF,0xFFC,0xFF4,0xFE6,0xFD2,0xFB9,0xF9B,0xF77,0xF4E,0xF20,
  146. 0xEED,0xEB5,0xE78,0xE37,0xDF1,0xDA7,0xD5A,0xD08,0xCB3,0xC5B,
  147. 0xC00,0xBA1,0xB41,0xADE,0xA79,0xA12,0x9AA,0x940,0x8D6,0x86B,
  148. 0x800,0x795,0x72A,0x6C0,0x656,0x5EE,0x587,0x522,0x4BF,0x45F,
  149. 0x400,0x3A5,0x34D,0x2F8,0x2A6,0x259,0x20F,0x1C9,0x188,0x14B,
  150. 0x113,0xE0,0xB2,0x89,0x65,0x47,0x2E,0x1A,0x0C,0x04,
  151. 0x01,0x04,0x0C,0x1A,0x2E,0x47,0x65,0x89,0xB2,0xE0,
  152. 0x113,0x14B,0x188,0x1C9,0x20F,0x259,0x2A6,0x2F8,0x34D,0x3A5,
  153. 0x400,0x45F,0x4BF,0x522,0x587,0x5EE,0x656,0x6C0,0x72A,0x795};

  154. unsigned int fro;
  155. uchar i;
  156. int ms;
  157. unsigned char exit=0;

  158. void write_f(int ms)
  159. {         
  160.         lcd_pos(0,3);  
  161.         write_dat(0x30+ms/1000);
  162. //        write_dat('.');                          //小数点显示       
  163.         write_dat(0x30+ms/100%10);       
  164.         write_dat(0x30+ms/10%10);
  165.         write_dat(0x30+ms%10);

  166. }
  167. void key()
  168. {
  169.         if(key1==0)
  170.         {
  171.                 delayms(5);
  172.                 if(key1==0)
  173.                 {
  174.                         ms=ms+50;
  175.                         if(ms>1000)
  176.                                 ms=50;
  177.                         while(!key1);
  178.                 }
  179.         }
  180.         if(key2==0)
  181.         {
  182.                 delayms(5);
  183.                 if(key2==0)
  184.                 {               
  185.                         ms=ms-50;
  186.                         if(ms<100)
  187.                                 ms=1000;
  188.                         while(!key2);
  189.                 }
  190.         }
  191.         if(key3==0)
  192.         {
  193.                 delayms(5);
  194.                 if(key3==0)
  195.                 {
  196.                         ms=500;
  197.                         while(!key3);
  198.                 }
  199.         }
  200. }

  201. void write_sin()//输出正弦波循环
  202. {  
  203.         if(TF0==1)
  204.         {
  205.                 TH0=(65536-917431/fro)/256;
  206.                 TL0=(65536-917431/fro)%256;
  207.                 TF0=0;
  208.                 for(i=0;i<120;i++)
  209.                 {
  210.                         P2=tab[i]&0xff;
  211.                         P1=tab[i]>>8;
  212.                 }
  213.                 i++;
  214.                 if(i>119)
  215.                 {
  216.                         i=0;
  217.                 }
  218.         }
  219.         if(exit==1)
  220.         {
  221.                 exit=0;
  222.                 TR0=0;
  223.         //        break;
  224.         }
  225. }



复制代码

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

使用道具 举报

沙发
ID:63997 发表于 2016-5-11 00:05 | 只看该作者
你的 fro 在初始化以后就没有被重新赋值国 你需要在按键处理的时候 加上一句 fro = ms; 或者在主函数的while(1)循环里面加一句 fro = ms;
回复

使用道具 举报

板凳
ID:118267 发表于 2016-5-11 00:50 来自手机 | 只看该作者
xueyunmicheng 发表于 2016-5-11 00:05
你的 fro 在初始化以后就没有被重新赋值国 你需要在按键处理的时候 加上一句 fro = ms; 或者在主函数的whi ...

加了也没起什么作用!我的程序好像无法实现输出正弦波,请问你有做过类似的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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