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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5566|回復: 1
收起左側

單片機方波發生器Proteus仿真+代碼

[復制鏈接]
ID:442670 發表于 2018-12-21 12:42 | 顯示全部樓層 |閱讀模式
方波發生器仿真原理圖如下(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. uint result=0; //result為周期
  18. bit flag=0;
  19. uchar flag1=0; //flag1為確認狀態
  20. uchar a=0,b=0,c=0; //a,b,c為輸入值
  21. uchar buf[4]={0,0,0,0};
  22. uchar buffer;
  23. void main()
  24. {
  25.         timer_init() ;                        //初始化
  26.         while(1)
  27.         {
  28.            flag1=get_value();        //獲取確認的flag1
  29.            temp=result/2;                //計算出周期一半
  30.            if(flag1==1)
  31.            {
  32.                      TR0=1;                        //打開定時器
  33.            }
  34.            display_s();                        //顯示
  35.         }
  36. }

  37. void timer_init() //方式一 定時1ms
  38. {
  39.    TMOD=0X01; //定時器T0為方式一
  40.    TH0=(65536-1000)/256; //TH放高8位
  41.    TL0=(65536-1000)%256; //TL放低8位
  42.    TR0=0;
  43.    ET0=1;//允許定時器0中斷
  44.    EA=1;//總中斷允許
  45. }
  46. void timer()   interrupt 1 //T0中斷函數
  47. {
  48.    TH0=(65536-1000)/256; //重新賦值
  49.    TL0=(65536-1000)%256;  //

  50.    num++; //循環次數加1
  51.    if(num==temp)
  52.    {
  53.              OUT=~OUT;          //取反輸出
  54.           num=0;//重置循環次數
  55.    }

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

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

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

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

  179. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
方波發生器.zip (21.69 KB, 下載次數: 59)


評分

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

查看全部評分

回復

使用道具 舉報

ID:754464 發表于 2020-5-18 08:44 | 顯示全部樓層
很不錯,謝謝版主
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲精品 | 99免费精品视频 | 国产精品伦理一区二区三区 | 成年免费大片黄在线观看一级 | 国产999精品久久久久久 | 一区二区三区在线播放视频 | 亚洲国产成人精品女人久久久 | 日韩中文字幕在线观看 | 免费看的黄网站 | 亚洲一av | 精品国产欧美一区二区三区成人 | 97精品国产97久久久久久免费 | 久久久久9999亚洲精品 | 国产精品视频一区二区三区四区国 | 国产精品久久久亚洲 | 精品国产乱码久久久久久牛牛 | 国产激情一区二区三区 | 91精品国产91久久久久久不卞 | 久久国产精品99久久久久 | 日本网站在线看 | 国产精品揄拍一区二区 | 成人精品一区亚洲午夜久久久 | 国产成人短视频在线观看 | 天天天天操 | 日韩在线电影 | 国产精品一二三区 | 亚洲欧美自拍偷拍视频 | 日韩在线观看一区 | 亚洲一一在线 | 91就要激情 | 国产一区二区视频在线观看 | 欧美一区二 | 97福利在线 | 日韩在线视频免费观看 | 久久精品亚洲精品国产欧美kt∨ | 午夜精品福利视频 | 国产精品久久久久久妇女6080 | 91精品一区二区三区久久久久久 | 少妇性l交大片免费一 | 亚洲成人精品免费 | 韩国理论电影在线 |