找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2042|回复: 4
收起左侧

单片机程序存在C141语法错误

[复制链接]
ID:944908 发表于 2021-6-25 23:01 | 显示全部楼层 |阅读模式
程序在附件
这种错误怎么改,求解
1624633054656.jpg

程序.docx

10.38 KB, 下载次数: 2

回复

使用道具 举报

ID:405850 发表于 2021-6-26 08:12 | 显示全部楼层
把 interrupt 1、interrupt 0去掉
回复

使用道具 举报

ID:155507 发表于 2021-6-26 08:38 | 显示全部楼层
给你改了,对比一下就知道哪里错了。

  1. #include <reg52.h>
  2. #define  uchar unsigned char
  3. #define  uint  unsigned int
  4. #define DAdata  P0
  5. #define lcd_ports P1
  6. void delay(uchar z);
  7. void triangle_out();
  8. void sine_out();
  9. void square_out();
  10. void write_com(uchar com);
  11. void write_date(uchar date);
  12. void disp_lcd(uchar addr,uchar *temp1);
  13. void init_lcd();
  14. //void timer0() interrupt 1;   //中断子函数 不须要函数申明
  15. //void key_int0() interrupt 0; //中断子函数 不须要函数申明
  16. sbit DA_S1= P2^0;   
  17. sbit DA_S2= P2^1;
  18. sbit rs=P2^2;
  19. sbit rw=P2^3;
  20. sbit lcden=P2^4;  
  21. sbit key=   P3^2;
  22. uchar wavecount;   
  23. uchar THtemp,TLtemp;
  24. uchar judge=1;      
  25. uchar waveform;          
  26. uchar code freq_unit[3]={10,50,200};
  27. uchar idata wavefreq[3]={1,1,1};          
  28. uchar code  lcd_hang1[]={"Sine Wave" "Triangle Wave" "Square Wave" "Select Wave:" "press No.1 key!"};
  29. uchar idata lcd_hang2[16]={"f=Hz"};
  30. uchar code waveTH[]={
  31.         0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  32.         0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  33.         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  34. uchar code waveTL[]={
  35.         0x06,0x8a, 0x10,0x4e, 0x78,0x93, 0xa8,0xb3, 0xbe,0xc6,
  36.         0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde,       
  37.         0xff,0x8e,0x5a,0x41,0x32,0x28,0x20,0x1b,0x17,0x0e};
  38. uchar code triangle_tab[]={         
  39.         0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,
  40.         0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,
  41.         0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,
  42.         0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};
  43. uchar code sine_tab[256]={
  44.         0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,        0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,
  45.         0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
  46.         0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,
  47.         0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,
  48.         0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
  49.         0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,
  50.         0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,
  51.         0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  52.         0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,
  53.         0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
  54.         0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
  55. void delay(uchar z)          
  56. {
  57.         uint x,y;
  58.         for(x=z;x>0;x--)
  59.             for(y=110;y>0;y--);
  60. }
  61. void triangle_out()       
  62. {       
  63.         DAdata=triangle_tab[wavecount++];
  64.         if(wavecount>64) wavecount=0;
  65.         DA_S1=0;  
  66.         DA_S1=1;  
  67. }
  68. void sine_out()         
  69. {       
  70.         DAdata=sine_tab[wavecount++];
  71.         DA_S1=0;  
  72.         DA_S1=1;  
  73. }
  74. void square_out()  
  75. {       
  76.         judge=~judge;
  77.         if(judge==1) DAdata=0xff;
  78.         else  DAdata=0x00;
  79.         DA_S1=0;  //打开位输入寄存器
  80.         DA_S1=1;  //关闭位输入寄存器
  81. }
  82. /************1602液晶的相关函数*************/

  83. void write_com(uchar com)
  84. {
  85.         rs=0;       
  86.         lcden=0;
  87.         lcd_ports=com;
  88.         delay(5);
  89.         lcden=1;
  90.         delay(5);
  91.         lcden=0;       
  92. }
  93. void write_date(uchar date)
  94. {
  95.         rs=1;       
  96.         lcden=0;
  97.         lcd_ports=date;
  98.         delay(5);
  99.         lcden=1;
  100.         delay(5);
  101.         lcden=0;       
  102. }
  103. void disp_lcd(uchar addr,uchar *temp1)
  104. {
  105.         uchar num;
  106.         write_com(addr);
  107.         delay(1);   
  108.         for(num=0;num<16;num++)
  109.         {
  110.                 write_date(temp1[num]);
  111.                 delay(1);
  112.         }
  113. }

  114. void init_lcd()
  115. {
  116.         lcden=0;  
  117.         rw=0;  //初始化一定要设置为零,表示写数据
  118.         write_com(0x38);  
  119.         write_com(0x0c);  
  120.         write_com(0x06);  
  121.         write_com(0x01);  
  122.         write_com(0x80);  
  123.         disp_lcd(0x80,&lcd_hang1[3*16]);  //在第一行显示
  124.         disp_lcd(0xc0,&lcd_hang1[4*16]);  //在第二行显示
  125.        
  126. }
  127. /********************1602液晶函数声明结束*********************/
  128. void main()
  129. {
  130.         uchar i=0;
  131.         DA_S2=0;   
  132.         DAdata=0;
  133.         DA_S1=1;  
  134.         init_lcd();
  135.         waveform=0;       
  136.         TMOD=0x01;  //设置定时器为位工作方式
  137.         IT0=1;      
  138.         ET0=1;      
  139.         EX0=1;
  140.         EA=1;
  141.         while(1)   //主循环
  142.         {
  143.                
  144.         }
  145. }         
  146. void timer0() interrupt 1
  147. {
  148.         TH0=THtemp;
  149.         TL0=TLtemp;
  150.         if(waveform==0)      sine_out();
  151.         else if(waveform==1) triangle_out();
  152.         else if(waveform==2) square_out();
  153. }
  154. void key_int0() interrupt 0  
  155. {
  156.         uchar keytemp;
  157.         uint total_freq; //总频率
  158.         EA=0; TR0=0;     //关总中断与定时器
  159.         delay(5);      
  160.         if(key==0)       //确实有按键按下而引发中断
  161.         {
  162.                 keytemp=P3&0xf0; //获取P3口高四位的值
  163.                 switch(keytemp)
  164.                 {
  165.                 case 0xe0:        //选择波形
  166.                         waveform++;
  167.                         if(waveform>2) waveform=0;
  168.                         break;

  169.                 case 0xd0:  //频率按规定单位依次增加
  170.                         wavefreq[waveform]++;       // <---------???
  171.                         if(wavefreq[waveform]>10) wavefreq[waveform]=1;
  172.                         break;                                                                               
  173.                 case 0xb0:  //频率按规定单位依次衰减
  174.                         wavefreq[waveform]--;       // <---------????
  175.                         if(wavefreq[waveform]<1) wavefreq[waveform]=10;
  176.                         break;
  177.                 case 0x70:   
  178.                         DA_S2=1; //使DAC寄存器关闭
  179.                         break;
  180.                 }
  181.                 THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_temp
  182.                 TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
  183.                 total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)
  184.                 lcd_hang2[5]=total_freq%10+0x30;                 //在液晶中显示个位,(0x30 在液晶显示中表示数字)
  185.                 total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位
  186.                 total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位
  187.                 total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位
  188.                 disp_lcd(0x80,&lcd_hang1[waveform*16]);  //在第一行显示
  189.                 disp_lcd(0xc0,lcd_hang2);  //在第二行显示
  190.         }
  191.         EA=1; TR0=1;     //开启总中断与定时器
  192. }

复制代码
回复

使用道具 举报

ID:944908 发表于 2021-6-26 19:06 来自手机 | 显示全部楼层
发表于 2021-6-26 08:12
把 interrupt 1、interrupt 0去掉

非常感谢,谢谢
回复

使用道具 举报

ID:944908 发表于 2021-6-26 19:06 来自手机 | 显示全部楼层
angmall 发表于 2021-6-26 08:38
给你改了,对比一下就知道哪里错了。

好的,感谢您的解答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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