久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5573|回復(fù): 3
收起左側(cè)

周期可調(diào)的單片機方波發(fā)生器仿真與源程序(帶數(shù)碼管顯示功能)

[復(fù)制鏈接]
ID:256906 發(fā)表于 2018-1-14 14:34 | 顯示全部樓層 |閱讀模式
利用單片機、串行口和3位數(shù)碼管,構(gòu)建電腦設(shè)置周期可調(diào)的方波發(fā)生器。要求:
1)周期范圍200~500ms,具體數(shù)值在數(shù)碼管上顯示,顯示方式不限,共陰共陽不限;
2)從電腦鍵盤輸入方波周期值,單片機按此周期產(chǎn)生方波,并在虛擬示波器上觀察效果。

單片機方波發(fā)生器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機源程序如下:
  1. #include "reg52.h"
  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. sbit L1 = P1^0;
  5. sbit L2 = P1^1;
  6. sbit L3 = P1^2;
  7. sbit L4 = P1^3;
  8. sbit OUT=P3^0;
  9. uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10. uchar get_value(void);
  11. void display_s();
  12. void timer_init();
  13. void delay(uint z);
  14. char scan(void) ;
  15. uchar num=0;
  16. uchar temp=0;
  17. ///////////////////
  18. uint result=0;
  19. bit flag=0;
  20. uchar flag1=0;
  21. uchar a=0,b=0,c=0;
  22. uchar buf[4]={0,0,0,0};
  23. uchar buffer;
  24. void main()
  25. {
  26.         timer_init() ;                        //初始化
  27.         while(1)
  28.         {
  29.            flag1=get_value();        //獲取確認的flag1
  30.            temp=result/2;                //計算出周期一半
  31.            if(flag1==1)
  32.            {
  33.                      TR0=1;                        //打開定時器
  34.            }
  35.            display_s();                        //顯示
  36.         }
  37. }

  38. void timer_init() //方式一 定時1ms
  39. {
  40.    TMOD=0X01;
  41.    TH0=(65536-1000)/256;
  42.    TL0=(65536-1000)%256;
  43.    TR0=0;
  44.    ET0=1;
  45.    EA=1;
  46. }
  47. void timer()   interrupt 1
  48. {
  49.    TH0=(65536-1000)/256;
  50.    TL0=(65536-1000)%256;

  51.    num++;
  52.    if(num==temp)
  53.    {
  54.              OUT=~OUT;          //取反輸出
  55.           num=0;
  56.    }

  57. }
  58. uchar get_value()
  59. {
  60.         static         uchar i=0;
  61.         uchar j=0;
  62.         P1 &= 0x0f;
  63.         if(P1 != 0x0f)
  64.         {
  65.                 delay(10);
  66.                 P1 &= 0x0f;
  67.                 if(P1 != 0x0f)
  68.                 {
  69.                         if(flag==1)
  70.                         {
  71.                                    if(scan()==10)//當按下確認鍵時進入
  72.                                   {
  73.                                         if((result <= 250)&&(result >= 50))        //判斷范圍
  74.                                         {
  75.                                                 i=0;
  76.                                                 flag=0;
  77.                                                 return 1;                                           //在范圍內(nèi)則執(zhí)行
  78.                                         }
  79.                                         else
  80.                                         {                                                                //否則清零 重新開始
  81.                                                 flag=0;
  82.                                                 i=0;
  83.                                                 result=0;
  84.                                                 return 0;
  85.                                         }        
  86.                                   }
  87.                                 buf[i] = scan();                                   //按鍵值放入數(shù)組中
  88.                                 i++;
  89.                                 result=0;
  90.                                 for(j=0;j<i;j++)
  91.                                 {
  92.                                         buffer = buf[j]        ;                          
  93.                                         result = result*10 + buffer;  //計算輸入值和
  94.                                 }
  95.                                 if(i==4)                                                  
  96.                                 {
  97.                                         i=0;
  98.                                         result=999;
  99.                                         flag=0;
  100.                                 }
  101.                         }

  102.                         if( scan()==11)                                                  //按下設(shè)置鍵 進入
  103.                         {
  104.                                 flag=1;
  105.                                 flag1=0;
  106.                                 TR0=0;
  107.                                 result=0;
  108.                         }
  109.                 }
  110.                 while(P1 != 0x0f)
  111.                 {
  112.                   P1 &= 0x0f;
  113.                 }                        
  114.         }
  115.                 return 0;
  116. }
  117. void display_s()                                           //掃描顯示
  118. {
  119.         a = result / 100;
  120.         b = result %100/10 ;
  121.         c = result % 10;

  122.         P2=0x04;              //個位位選打開
  123.         delay(1);
  124.         P0=dis_code[c];
  125.         delay(1);         
  126.         P0=0xff;
  127.         delay(1);
  128.                                  
  129.         P2=0x02;                  //十位位選打開
  130.         delay(1);
  131.         P0=dis_code[b];
  132.         delay(1);
  133.         P0=0xff;
  134.         delay(1);

  135.         P2=0x01;                   //百位位選打開
  136.         delay(1);
  137.         P0=dis_code[a];
  138.         delay(1);
  139.         P0=0xff;
  140.         delay(1);        
  141. }
  142. char scan(void)                                                  //按鍵鍵值掃描
  143. {
  144.         uchar temp,i;
  145.         P1=0xef;
  146.         for(i=0;i<=3;i++)
  147.         {
  148.                 if(L1==0)
  149.                 {
  150.                         delay(3);
  151.                         if(L1==0)
  152.                         {        
  153.                         return (i*4+0);
  154.                         }
  155.                         while(L1==0);
  156.                 }
  157.                 if(L2==0)
  158.                 {
  159.                         delay(3);
  160.                         if(L2==0)
  161.                         {        
  162.                         return (i*4+1);
  163.                         }
  164.                         while(L2==0);
  165.                 }
  166.                 if(L3==0)
  167.                 {
  168.                         delay(3);
  169.                         if(L3==0)
  170.                         {        
  171.                                 return (i*4+2);
  172.                         }
  173.                         while(L3==0);
  174.         
  175.                 }
  176.                 if(L4==0)
  177.                 {
  178.                          delay(3);
  179. ……………………

  180. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
方波發(fā)生器.zip (71.8 KB, 下載次數(shù): 74)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:442625 發(fā)表于 2018-12-9 14:02 | 顯示全部樓層
哥,這題有匯編語言的代碼嗎
回復(fù)

使用道具 舉報

ID:442625 發(fā)表于 2018-12-9 14:04 | 顯示全部樓層
有匯編語句的代碼嗎
回復(fù)

使用道具 舉報

ID:655503 發(fā)表于 2019-12-3 21:48 | 顯示全部樓層
題目要求不是電腦鍵盤嗎?為什么你這里用的是矩陣鍵盤?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩三级一区 | 亚洲福利在线观看 | 国产精品日产欧美久久久久 | 欧美精品一二区 | 91av在线视频观看 | 国产91综合一区在线观看 | 亚洲区一区二区 | 国产一区二区在线视频 | 午夜一区二区三区在线观看 | 国产黄色大片在线免费观看 | 国产一区二区三区在线看 | 亚洲精品一区二区三区在线观看 | 欧美成人激情视频 | 在线视频第一页 | 超碰97免费观看 | 黄色在线观看网站 | 成人免费在线视频 | 日韩中文字幕在线观看 | 久久福利电影 | 国产丝袜一区二区三区免费视频 | 欧美日韩一区二区三区视频 | 先锋资源吧 | 亚洲综合婷婷 | 黄色网页在线观看 | 欧美黄色片在线观看 | 请别相信他免费喜剧电影在线观看 | 亚洲成人精品国产 | 麻豆精品一区二区三区在线观看 | 久久91| 国产亚洲精品精品国产亚洲综合 | 国产精品视频免费观看 | 久久精品成人 | 精品视频在线播放 | 久久国产精品亚洲 | 性一区| 精品国产欧美 | 国产欧美一区二区久久性色99 | 成年人黄色一级片 | www国产亚洲精品久久网站 | 精品一区av | 成人福利视频网站 |