找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1711|回复: 5
收起左侧

求指导频率、周期、脉宽C语言程序

[复制链接]
ID:675320 发表于 2020-4-13 16:51 | 显示全部楼层 |阅读模式
200黑币
程序:求大佬帮忙看一下这个程序,开头和结尾一直报错
这个是设计做频率计的,要求频率,周期和脉宽,这个程序写了测占空比的,如果不测占空比又该怎么改呢?谢谢大家啦!


单片机源程序如下:
  1. uchar keyscan(void)
  2. {
  3. char scan, tmp;
  4. p1=0xf0;
  5. if((p1&0xf0)!=0xf0)
  6. {delay(10);
  7. if((p1&0xf0)!=0xf0)
  8. {scan=0xfe;
  9. while((scan&0x10)!=0)
  10. {
  11. p1=scan;
  12. if((p1&0xf0)!=0xf0)
  13. {tmp=(p1&0xf0)|0xf0;
  14. while((p1&0xf0)!=0xf0);
  15. return((~scan)|(~tmp));}
  16. else scan=(scan<<1)|0x01;
  17. }
  18. }
  19. }
  20. return(0);
  21. }
  22. void keychuli()
  23. {
  24. keyz=keyscan();
  25. if (keyz!=0)
  26. {
  27. switch(keyz)
  28. {
  29. case 0x11:key_1=1;break;
  30. case 0x21:key_1=2;break;
  31. case 0x41:key_1=3;break;
  32. case 0x81:key_1=4;break;
  33. case 0x12:key_1=5;break;
  34. case 0x22:key_1=6;break;
  35. case 0x42:key_1=7;break;
  36. case 0x82:key_1=8;break;
  37. case 0x14:key_1=9;break;
  38. case 0x44:key_1=0;break;
  39. default:break;
  40. }
  41. }
  42. }
  43. void delay(unit  w)
  44. {
  45. uchar a;
  46. for(w,w>0,w--)
  47. for(a=47,a>0,a--);
  48. }
  49. void delay  10ms (int x)
  50. {int i,j;
  51. for (i=1,i<x,i++)
  52. for (j=1,j<1200,j++);
  53. }
  54. void chuli()
  55. {
  56. pinlv s[1]=pinlv/10000%;
  57. pinlv s[2]=pinlv/10000%10;
  58. pinlv s[3]=pinlv/1000%10;
  59. pinlv s[4]=pinlv/100%10;
  60. pinlv s[5]=pinlv/10%10;
  61. pinlv s[6]=pinlv%10;
  62. if (pinlv s[1]==0)
  63. {pinlv s[1]=10;if(pinlv s[2]==0)
  64. {pinlv s[2]=10;if(pinlv s[3]==0)
  65. {pinlv s[3]=10;if(pinlv s[4]==0)
  66. {pinlv s[4]=10;}}}}}}
  67. writecommand (0x8a);
  68. writedata(yejingtable[pinlv s[1]]);
  69. writedata(yejingtable[pinlv s[2]]);
  70. writedata(yejingtable[pinlv s[3]]);
  71. writedata(yejingtable[pinlv s[4]]);
  72. }
  73. void cepin()
  74. {
  75. n=0;
  76. miao=0;
  77. TF0=0;
  78. TMOD=0x15;
  79. TH1=0x3c;
  80. TL1=0xbo;
  81. TH0=0;
  82. TL0=0;
  83. ET1=1;
  84. TCON=0x50;
  85. while (1)
  86. {
  87. if(miao==0&&TF0==1)
  88. {
  89. n++;
  90. TF0=0;
  91. TH0=0;
  92. TL0=0;
  93. }
  94. if(miao==1)
  95. {
  96. pinlv=(n*65536+(TH0*256+TL0));
  97. chuli();
  98. n=0;
  99. miao=0;
  100. TF0=0;
  101. TMOD=0x15;
  102. TH1=0x3c;
  103. TL1=0xb0;
  104. TH0=0;
  105. TL0=0;
  106. ET1=1;
  107. TCON=0x50;
  108. }
  109. display(1,1, "当前频率: ");
  110. display(3,7,"Hz");
  111. keychuli();
  112. if(keyz==0x88)
  113. {TCON=0x0;
  114. break;}
  115. }
  116. }
  117. void cezhou()
  118. {
  119. while(1)
  120. {
  121. n=0;
  122. TMOD=0x01;
  123. TH0=0;
  124. TL0=0;
  125. ET0=1;
  126. TR0=0;
  127. while(T0==1);
  128. while(T0==0);
  129. TR0=1;
  130. while(T0==1);
  131. while(T0==0);
  132. TR0=0;
  133. zhouq=(n*65535+(TH0*256)+TL0);
  134. if(zhank==0)
  135. {
  136. pinlv=zhouqi;
  137. display(1,1,"当前周期:");
  138. chuli();
  139. display(3,7,"us");
  140. }
  141. for(t=0,t<10000,t++)
  142. {
  143. keychuli();
  144. if(keyz==0x8||zhank==1)
  145. goto tuichu;
  146. }
  147. }
  148. tuichu : ;
  149. }
  150. voidcemai()
  151. {
  152. while (1)
  153. {
  154. n=0;
  155. TMOD=0x01;
  156. TH0=0;
  157. TL0=0;
  158. ET0=1;
  159. TR0=0;
  160. while(T0==1);
  161. while(T0==0);
  162. TR0=1;
  163. while(T0==1);
  164. TR0=0;
  165. maik=(n*65535+(TH0*256+TL0));
  166. if(zhank==0)
  167. {
  168. pinlv=maik;
  169. display(1,1,"当前脉宽:"  );
  170. chuli();
  171. display(3,7,"us:");
  172. }
  173. for (t=0,t<10000,t++ )
  174. {
  175. keychuli();
  176. if(keyz==0x88||zhank==1)
  177. goto tuichu1;
  178. }
  179. }
  180. tuichu 1:;
  181. }
  182. void cezhan()
  183. {
  184. float q,x;
  185. unsigned long  m1;
  186. zhank=1;
  187. while (1)
  188. {
  189. display (1,1,"占空比为:");
  190. cezhou();
  191. cemai();
  192. q=zhouq/1.0;
  193. x=maik/q;
  194. m1=x*10000000;
  195. pinlv s[0]=m1/1000000;
  196. pinlv s[1]=m1/100000%10;
  197. pinlv s[2]=m1/10000%10;
  198. pinlv s[3]=m1/1000%10;
  199. pinlv s[4]=m1/100%10;
  200. pinlv s[5]=m1/10%10;
  201. pinlv s[6]=m1%10;
  202. writecommand (0x8a);
  203. writedata(yejingtable[0]);
  204. writedata(0x2e);
  205. writedata(yejingtable[pinlv s[0]]);
  206. writedata(yejingtable[pinlv s[1]]);
  207. writedata(yejingtable[pinlv s[2]]);
  208. writedata(yejingtable[pinlv s[3]]);
  209. writedata(yejingtable[pinlv s[4]]);
  210. writedata(yejingtable[pinlv s[5]]);
  211. writedata(yejingtable[pinlv s[6]]);
  212. for(t=0,t<10000,t++)
  213. {
  214. keychuli();
  215. if(keyz==0x88)
  216. {TR0=0;
  217. gototuichu 2;
  218. }
  219. }
  220. }
  221. tuichu 2: ;
  222. }
  223. voidtimer1(void) interrupt 3 using 0
  224. {
  225. uchar miao1;
  226. TH1=0x3c;
  227. TL1=0xb0;
  228. miao1 ++;
  229. if(miao1==20)
  230. {
  231. TCON=0x0;
  232. miao1=1;
  233. }
  234. }
  235. void timer0 (void) interrupt 1 using 0
  236. {
  237. TH0=0x0;
  238. TL0=0x0;
  239. n++;
  240. }
  241. library ieee;
  242. useieee.std_logic_1164.all;
  243. useieee.std_logic_arith.all;
  244. useieee.std_logic_unsigned.all;
  245. entity trigger  is
  246. Port(
  247. d,j,k,t:in std_logic;
  248.   clk: in  std_logic;
  249. key:in  std_logic_vector(2 downto0);
  250. q,nq:out  std_logic);
  251. end  trigger;
  252. architecture  Behavioral  of trigger  is
  253. signal  temp:std_logic_vector(2downto  0);
  254. signal  q_temp:std_logic:='0';
  255. signal clk_fresh:std_logic;
  256. signal  jk:std_logic_vector(1downto 0);
  257. signal  cnt0:integer range 0 to2000000;
  258. signal  cnt:integer range 0to20000000;
  259. begin
  260. process (clk,key)
  261. begin
  262.   if(key="111")then cnt0<=0;
  263. else if(clk'event' and clk='1')then
  264.   ifcnt0>1999999  then cnt0<=0;
  265. temp<=key;
  266. else  cnt0<=cnt0+1;
  267.   endif ;
  268. end  if;
  269. end  process;
  270. process (clk)
  271.   begin
  272. if(clk'event' and clk='1') then cnt<=cnt+1;
  273.   ifcnt<10000000 then clk_fresh<='0';
  274. elsif cnt<20000000 then clk_fresh<='1';
  275. elsif cnt>20000000 then cnt<=0;
  276.   endif;
  277.   endif;
  278. end  process;
  279. process(clk_fresh)
  280. befin
  281. if(clk_fresh'event'  andclk_fresh='1') then
  282.   if(temp="110")then
  283. q_temp<=d;
  284. elsif (temp="101") then
  285. jk<=j&k;
  286. case jk is
  287. when "00"=>q_temp<=q_temp;
  288. when "01"=>q-temp<='0';
  289. when "10"=>q-temp<='1';
  290. when "11"=>q_temp<=not q_temp;
  291. when others =>q_temp <=null;
  292. end  case ;
  293. elsif (temp="011") then
  294.   if(t='0') then
  295. q_temp<=q_temp;
  296. else q_temp <=not q_temp;
  297. q<=q_temp;
  298. nq<=not q_temp;
  299.   endprocess;
  300. end  behavioral;
  301.   end      if
  302.   end
复制代码

回复

使用道具 举报

ID:584814 发表于 2020-4-14 09:51 | 显示全部楼层
这个程序少太多组件,还是抄全了罢。
回复

使用道具 举报

ID:680763 发表于 2020-4-14 11:51 | 显示全部楼层
编译提示50多个错误,慢慢修改吧
回复

使用道具 举报

ID:680763 发表于 2020-4-14 11:52 | 显示全部楼层
开始部分错误:加入代码:typedef unsigned char uchar;
typedef unsigned int  uint;
uint key_1,pinlv,keyz;
int delay(int n);
回复

使用道具 举报

ID:680763 发表于 2020-4-14 12:54 | 显示全部楼层
writedata 和writecommand应该在头文件里面吧?
回复

使用道具 举报

ID:680763 发表于 2020-4-14 13:06 | 显示全部楼层
加入头文件,调取writedata 和writecommand函数就可通过,看上去还少一些功能函数,好像程序不完整。现有的已经
  1. #include <reg51.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. uint key_1,pinlv,miao,n,s,o,keyz;
  5. int delay(int n);
  6. uint yejingtable[8];
  7. uint        pinlv_s[8];
  8. void writedata(int x);
  9. void writecommand(int x);
  10. uchar keyscan(void)
  11. {
  12. char scan, tmp;
  13. P1=0xf0;

  14. if((P1&0xf0)!=0xf0)

  15. {delay(10);

  16. if((P1&0xf0)!=0xf0)

  17. {scan=0xfe;

  18. while((scan&0x10)!=0)

  19. {
  20. P1=scan;

  21. if((P1&0xf0)!=0xf0)

  22. {tmp=(P1&0xf0)|0xf0;

  23. while((P1&0xf0)!=0xf0);

  24. return((~scan)|(~tmp));
  25. }

  26. else scan=(scan<<1)|0x01;
  27. }
  28. }
  29. }

  30. return(0);
  31. }

  32. void keychuli()

  33. {
  34. keyz=keyscan();

  35. if (keyz!=0)

  36. {
  37. switch(keyz)

  38. {
  39. case 0x11:key_1=1;break;

  40. case 0x21:key_1=2;break;

  41. case 0x41:key_1=3;break;

  42. case 0x81:key_1=4;break;

  43. case 0x12:key_1=5;break;
  44. case 0x22:key_1=6;break;
  45. case 0x42:key_1=7;break;
  46. case 0x82:key_1=8;break;
  47. case 0x14:key_1=9;break;
  48. case 0x44:key_1=0;break;
  49. default:break;
  50. }
  51. }
  52. }

  53. /*void delay(int w)

  54. {
  55. int a;

  56. for(w=a,w>0,w--)

  57. for(a=47,a>0,a--);

  58. }
  59. */
  60. delay(int x)

  61. {int i,j;
  62. for(i=1;i<x;i++);
  63. for(j=1;j<1200;j++);
  64. }

  65. void chuli()

  66. {float pinlv_s[7];
  67.         pinlv_s[1]=pinlv/10000%10;

  68.         pinlv_s[2]=pinlv/10000%10;

  69.         pinlv_s[3]=pinlv/1000%10;

  70.         pinlv_s[4]=pinlv/100%10;

  71.         pinlv_s[5]=pinlv/10%10;

  72.         pinlv_s[6]=pinlv%10;

  73.         if (pinlv_s[1]==0)

  74.                 {pinlv_s[1]=10;
  75.                 if(pinlv_s[2]==0)

  76.                         {pinlv_s[2]=10;
  77.                         if(pinlv_s[3]==0)

  78.                                 {pinlv_s[3]=10;
  79.                                         if(pinlv_s[4]==0)

  80.                                         {pinlv_s[4]=10;}                       
  81.                                 }
  82.                         }       
  83.                 }


  84. writecommand(0x8a);

  85. writedata(int yejingtable[pinlv_s[1]]);

  86. writedata(int yejingtable[pinlv_s[2]]);

  87. writedata(int yejingtable[pinlv_s[3]]);

  88. writedata(int yejingtable[pinlv_s[4]]);
  89. }

  90. void cepin()

  91. {
  92. n=0;
  93. miao=0;
  94. TF0=0;
  95. TMOD=0x15;
  96. TH1=0x3c;
  97. TL1=0xb0;
  98. TH0=0;
  99. TL0=0;
  100. ET1=1;
  101. TCON=0x50;

  102.         while(1)

  103.         {
  104.         if(miao==0&&TF0==1)
  105. {
  106. n++;
  107. TF0=0;
  108. TH0=0;
  109. TL0=0;
  110. }

  111.                 if(miao==1)

  112.                 {
  113. pinlv=(n*65536+(TH0*256+TL0));

  114.                 chuli();
  115.                 n=0;
  116. miao=0;
  117. TF0=0;
  118. TMOD=0x15;
  119. TH1=0x3c;
  120. TL1=0xb0;
  121. TH0=0;
  122. TL0=0;
  123. ET1=1;
  124.                 TCON=0x50;

  125.                 }

  126.         display(1,1, "当前频率: ");

  127.         display(3,7,"Hz");

  128.         keychuli();

  129.         if(keyz==0x88)
  130. {TCON=0x0;
  131. break;}
  132.         }

  133. }

  134. void cezhou(void)

  135. {
  136. while(1)

  137.         {
  138. n=0;
  139. TMOD=0x01;
  140. TH0=0;
  141. TL0=0;
  142. ET0=1;
  143. TR0=0;

  144.         //while(T0==1);

  145.         while(T0==0);
  146. TR0=1;

  147.         while(T0==1);

  148.         //while(T0==0);

  149.         TR0=0;

  150.         zhouq=(n*65535+(TH0*256)+TL0);

  151.         if(zhank==0)

  152.                 {
  153. pinlv=zhouqi;

  154.                 display(1,1,"当前周期:");

  155.                 chuli();

  156.                 display(3,7,"us");

  157.                 }

  158.         for(t=0,t<10000,t++)

  159.                 {
  160. keychuli();

  161.                 if(keyz==0x8||zhank==1)

  162.                 goto tuichu;
  163.                
  164. }

  165.         }

  166. tuichu : ;

  167. }

  168. void cemai()

  169. {
  170. while(1)

  171. {
  172. n=0;
  173. TMOD=0x01;
  174. TH0=0;
  175. TL0=0;
  176. ET0=1;
  177. TR0=0;
  178. while(T0==1);
  179. while(T0==0);
  180. TR0=1;
  181. while(T0==1);
  182. TR0=0;
  183. maik=(n*65535+(TH0*256+TL0));

  184. if(zhank==0)

  185. {
  186. pinlv=maik;

  187. display(1,1,"当前脉宽:"  );

  188. chuli();

  189. display(3,7,"us:");
  190. }

  191. for (t=0,t<10000,t++ )

  192. {
  193. keychuli();

  194. if(keyz==0x88||zhank==1)

  195. goto tuichu1;
  196. }
  197. }

  198. tuichu 1:;
  199. }

  200. void cezhan()

  201. {
  202. float q,x;

  203. unsigned long  m1;

  204. zhank=1;

  205. while (1)

  206. {
  207. display(1,1,"占空比为:");

  208. cezhou();

  209. cemai();

  210. q=zhouq/1.0;

  211. x=maik/q;

  212. m1=x*10000000;

  213. pinlv s[0]=m1/1000000;

  214. pinlv s[1]=m1/100000%10;

  215. pinlv s[2]=m1/10000%10;

  216. pinlv s[3]=m1/1000%10;

  217. pinlv s[4]=m1/100%10;

  218. pinlv s[5]=m1/10%10;

  219. pinlv s[6]=m1%10;

  220. writecommand(0x8a);

  221. writedata(yejingtable[0]);

  222. writedata(0x2e);

  223. writedata(yejingtable[pinlv s[0]]);

  224. writedata(yejingtable[pinlv s[1]]);

  225. writedata(yejingtable[pinlv s[2]]);

  226. writedata(yejingtable[pinlv s[3]]);

  227. writedata(yejingtable[pinlv s[4]]);

  228. writedata(yejingtable[pinlv s[5]]);

  229. writedata(yejingtable[pinlv s[6]]);

  230. for(t=0,t<10000,t++)

  231. {
  232. keychuli();
  233. if(keyz==0x88)
  234. {TR0=0;
  235. goto tuichu 2;
  236. }
  237. }
  238. }
  239. tuichu 2: ;
  240. }

  241. voidtimer1(void) interrupt 3 using 0

  242. {
  243. uchar miao1;
  244. TH1=0x3c;
  245. TL1=0xb0;
  246. miao1 ++;
  247. if(miao1==20)
  248. {
  249. TCON=0x0;
  250. miao1=1;
  251. }
  252. }

  253. void timer0 (void) interrupt1 using 0

  254. {
  255. TH0=0x0;
  256. TL0=0x0;
  257. n++;
  258. }
  259. library ieee;
  260. useieee.std_logic_1164.all;
  261. useieee.std_logic_arith.all;
  262. useieee.std_logic_unsigned.all;

  263. entity trigger  is
  264. Port(
  265. d,j,k,t:in std_logic;
  266.   clk: in  std_logic;
  267. key:in  std_logic_vector(2 downto0);
  268. q,nq:out  std_logic);
  269. end  trigger;
  270. architecture  Behavioral  of trigger  is
  271. signal  temp:std_logic_vector(2downto  0);
  272. signal  q_temp:std_logic:='0';
  273. signal clk_fresh:std_logic;
  274. signal  jk:std_logic_vector(1downto 0);
  275. signal  cnt0:integer range 0 to2000000;
  276. signal  cnt:integer range 0to20000000;
  277. begin
  278. process (clk,key)
  279. begin
  280.   if(key="111")then cnt0<=0;
  281. else if(clk'event' and clk='1')then
  282.   ifcnt0>1999999  then cnt0<=0;
  283. temp<=key;
  284. else  cnt0<=cnt0+1;
  285.   endif ;
  286. end  if;
  287. end  process;
  288. process (clk)
  289.   begin
  290. if(clk'event' and clk='1') then cnt<=cnt+1;
  291.   ifcnt<10000000 then clk_fresh<='0';
  292. elsif cnt<20000000 then clk_fresh<='1';
  293. elsif cnt>20000000 then cnt<=0;
  294.   endif;
  295.   endif;
  296. end  process;
  297. process(clk_fresh)
  298. befin
  299. if(clk_fresh'event'  andclk_fresh='1') then
  300.   if(temp="110")then
  301. q_temp<=d;
  302. elsif (temp="101") then
  303. jk<=j&k;
  304. case jk is
  305. when "00"=>q_temp<=q_temp;
  306. when "01"=>q-temp<='0';
  307. when "10"=>q-temp<='1';
  308. when "11"=>q_temp<=not q_temp;
  309. when others =>q_temp <=null;
  310. end  case ;
  311. elsif (temp="011") then
  312.   if(t='0') then
  313. q_temp<=q_temp;
  314. else q_temp <=not q_temp;
  315. q<=q_temp;
  316. nq<=not q_temp;
  317.   endprocess;
  318. end  behavioral;
  319.   end      if
  320.   end
复制代码
编译通过
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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