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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機倒車雷達系統程序Proteus仿真等設計制作資料

[復制鏈接]
ID:853779 發表于 2021-11-30 20:52 | 顯示全部樓層 |閱讀模式
C語言程序,仿真圖及其文件,電路圖及其文件(立創EDA打開),PCB圖及其文件(立創EDA打開),實物圖圖片。元件清單、PPT、文檔


實物圖1.jpg 實物圖2.jpg

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int        // 以后unsigned int 就可以用uint 代替

  5. sfr ISP_DATA  = 0xe2;                        // 數據寄存器
  6. sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位
  7. sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位
  8. sfr ISP_CMD   = 0xe5;                        // 命令寄存器
  9. sfr ISP_TRIG  = 0xe6;                        // 命令觸發寄存器
  10. sfr ISP_CONTR = 0xe7;                        // 命令寄存器

  11. sbit LcdRs_P   = P1^1;                // 1602液晶的RS管腳      
  12. sbit LcdRw_P   = P1^2;                // 1602液晶的RW管腳
  13. sbit LcdEn_P   = P1^3;                // 1602液晶的EN管腳

  14. sbit Trig1_P   = P3^2;                // 超聲波模塊1的Trig管腳
  15. sbit Echo1_P   = P3^3;                // 超聲波模塊1的Echo管腳

  16. sbit KeySet_P  = P2^2;                // 設置按鍵的管腳
  17. sbit KeyDown_P = P2^1;                // 減按鍵的管腳
  18. sbit KeyUp_P   = P2^0;                // 加按鍵的管腳

  19. sbit Buzzer_P  = P2^3;                // 蜂鳴器的管腳
  20. sbit Led1_P    = P3^4;                // 傳感器1報警燈

  21. uint gAlarm;                                                        // 報警距離變量



  22. /*********************************************************/
  23. // 單片機內部EEPROM不使能
  24. /*********************************************************/
  25. void ISP_Disable()
  26. {
  27.         ISP_CONTR = 0;
  28.         ISP_ADDRH = 0;
  29.         ISP_ADDRL = 0;
  30. }


  31. /*********************************************************/
  32. // 從單片機內部EEPROM讀一個字節,從0x2000地址開始
  33. /*********************************************************/
  34. unsigned char EEPROM_Read(unsigned int add)
  35. {
  36.         ISP_DATA  = 0x00;
  37.         ISP_CONTR = 0x83;
  38.         ISP_CMD   = 0x01;
  39.         ISP_ADDRH = (unsigned char)(add>>8);
  40.         ISP_ADDRL = (unsigned char)(add&0xff);
  41.         // 對STC89C51系列來說,每次要寫入0x46,再寫入0xB9,ISP/IAP才會生效
  42.         ISP_TRIG  = 0x46;           
  43.         ISP_TRIG  = 0xB9;
  44.         _nop_();
  45.         ISP_Disable();
  46.         return (ISP_DATA);
  47. }


  48. /*********************************************************/
  49. // 往單片機內部EEPROM寫一個字節,從0x2000地址開始
  50. /*********************************************************/
  51. void EEPROM_Write(unsigned int add,unsigned char ch)
  52. {
  53.         ISP_CONTR = 0x83;
  54.         ISP_CMD   = 0x02;
  55.         ISP_ADDRH = (unsigned char)(add>>8);
  56.         ISP_ADDRL = (unsigned char)(add&0xff);
  57.         ISP_DATA  = ch;
  58.         ISP_TRIG  = 0x46;
  59.         ISP_TRIG  = 0xB9;
  60.         _nop_();
  61.         ISP_Disable();
  62. }


  63. /*********************************************************/
  64. // 擦除單片機內部EEPROM的一個扇區
  65. // 寫8個扇區中隨便一個的地址,便擦除該扇區,寫入前要先擦除
  66. /*********************************************************/
  67. void Sector_Erase(unsigned int add)         
  68. {
  69.         ISP_CONTR = 0x83;
  70.         ISP_CMD   = 0x03;
  71.         ISP_ADDRH = (unsigned char)(add>>8);
  72.         ISP_ADDRL = (unsigned char)(add&0xff);
  73.         ISP_TRIG  = 0x46;
  74.         ISP_TRIG  = 0xB9;
  75.         _nop_();
  76.         ISP_Disable();
  77. }



  78. /*********************************************************/
  79. // 毫秒級的延時函數,time是要延時的毫秒數
  80. /*********************************************************/
  81. void DelayMs(uint time)
  82. {
  83.         uint i,j;
  84.         for(i=0;i<time;i++)
  85.                 for(j=0;j<112;j++);
  86. }


  87. /*********************************************************/
  88. // 1602液晶寫命令函數,cmd就是要寫入的命令
  89. /*********************************************************/
  90. void LcdWriteCmd(uchar cmd)
  91. {
  92.         LcdRs_P = 0;
  93.         LcdRw_P = 0;
  94.         LcdEn_P = 0;
  95.         P0=cmd;
  96.         DelayMs(2);
  97.         LcdEn_P = 1;   
  98.         DelayMs(2);
  99.         LcdEn_P = 0;        
  100. }


  101. /*********************************************************/
  102. // 1602液晶寫數據函數,dat就是要寫入的數據
  103. /*********************************************************/
  104. void LcdWriteData(uchar dat)
  105. {
  106.         LcdRs_P = 1;
  107.         LcdRw_P = 0;
  108.         LcdEn_P = 0;
  109.         P0=dat;
  110.         DelayMs(2);
  111.         LcdEn_P = 1;   
  112.         DelayMs(2);
  113.         LcdEn_P = 0;
  114. }


  115. /*********************************************************/
  116. // 液晶光標定位函數
  117. /*********************************************************/
  118. void LcdGotoXY(uchar line,uchar column)
  119. {
  120.         // 第一行
  121.         if(line==0)        
  122.                 LcdWriteCmd(0x80+column);
  123.         // 第二行
  124.         if(line==1)        
  125.                 LcdWriteCmd(0x80+0x40+column);
  126. }



  127. /*********************************************************/
  128. // 液晶輸出字符串函數
  129. /*********************************************************/
  130. void LcdPrintStr(uchar *str)
  131. {
  132.         while(*str!='\0')
  133.                         LcdWriteData(*str++);
  134. }


  135. /*********************************************************/
  136. // 液晶輸出數字
  137. /*********************************************************/
  138. void LcdPrintNum(uint num)
  139. {
  140.         LcdWriteData(num/100+0x30);                                // 百位
  141.         LcdWriteData(num%100/10+0x30);                // 十位
  142.         LcdWriteData(num%10+0x30);                                // 個位
  143. }


  144. /*********************************************************/
  145. // 1602液晶功能初始化
  146. /*********************************************************/
  147. void LcdInit()
  148. {
  149.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  150.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  151.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  152.         LcdWriteCmd(0x01);        // 清屏
  153. }



  154. /*********************************************************/
  155. // 1602液晶顯示內容初始化
  156. /*********************************************************/
  157. void LcdShowInit()
  158. {
  159.         LcdGotoXY(0,0);                                                                    // 定位到第0行第0列
  160.         LcdPrintStr("D:    cm jianghe");        // 第0行顯示"D:         "
  161. }


  162. /*********************************************************/
  163. // 計算傳感器1測量到的距離
  164. /*********************************************************/

  165. uint GetDistance1(void)
  166. {
  167.         uint ss;                                        // 用于記錄測得的距離

  168.         TH0=0;
  169.         TL0=0;

  170.         Trig1_P=1;                                // 給超聲波模塊1一個開始脈沖
  171.         DelayMs(1);
  172.         Trig1_P=0;

  173.         while(!Echo1_P);        // 等待超聲波模塊1的返回脈沖
  174.         TR0=1;                                                // 啟動定時器,開始計時
  175.         while(Echo1_P);                // 等待超聲波模塊1的返回脈沖結束
  176.         TR0=0;                                                // 停止定時器,停止計時

  177.         ss=((TH0*256+TL0)*0.034)/2;                // 距離cm=(時間us * 速度cm/us)/2
  178.         return ss;
  179. }

  180. /*********************************************************/
  181. // 按鍵掃描
  182. /*********************************************************/
  183. void KeyScanf()
  184. {
  185.         if(KeySet_P==0)                                        // 判斷是否有按鍵按下
  186.         {
  187.                 LcdGotoXY(0,0);                                                                    // 光標定位
  188.                 LcdPrintStr(" Alarm Set 1037 ");        // 第0行顯示“   Alarm Set    ”
  189.                 LcdGotoXY(1,0);                                                                                // 光標定位
  190.                 LcdPrintStr(" alarm =     cm ");        // 第1行顯示“  alarm=   cm   ”
  191.                 LcdGotoXY(1,9);                                                                                // 光標定位
  192.                 LcdPrintNum(gAlarm);                                                        // 顯示當前的報警值

  193.                 DelayMs(10);                                                                                        // 消除按鍵按下的抖動
  194.                 while(!KeySet_P);                                                                        // 等待按鍵釋放
  195.                 DelayMs(10);                                                                                        // 消除按鍵松開的抖動               

  196.                 while(1)
  197.                 {               
  198.                         /* 報警值減的處理 */
  199.                         if(KeyDown_P==0)                                       
  200.                         {
  201.                                 if(gAlarm>2)                                                // 報警值大于2才能減1
  202.                                         gAlarm--;                                                        // 報警值減1
  203.                                 LcdGotoXY(1,9);                                        // 光標定位
  204.                                 LcdPrintNum(gAlarm);                // 刷新修改后的報警值
  205.                                 DelayMs(300);                                                // 延時
  206.                         }

  207.                         /* 報警值加的處理 */
  208.                         if(KeyUp_P==0)                                       
  209.                         {
  210.                                 if(gAlarm<400)                                        // 報警值小于400才能加1
  211.                                         gAlarm++;                                                        // 報警值加1
  212.                                 LcdGotoXY(1,9);                                        // 光標定位
  213.                                 LcdPrintNum(gAlarm);                // 刷新修改后的報警值
  214.                                 DelayMs(300);                                                // 延時
  215.                         }
  216.                         
  217.                         /* 退出報警值設置 */
  218.                         if(KeySet_P==0)                                       
  219.                         {
  220.                                 break;                                                                        // 退出while循環
  221.                         }        
  222.                 }
  223.                
  224.                 LcdShowInit();                                                        // 液晶恢復測量到測量界面
  225.                 DelayMs(10);                                                          // 消除按鍵按下的抖動
  226.                 while(!KeySet_P);                                                // 等待按鍵釋放
  227.                 DelayMs(10);                                                          // 消除按鍵松開的抖動               

  228.                 Sector_Erase(0x2000);                                // 保存報警距離
  229.                 EEPROM_Write(0x2000,gAlarm/100);
  230.                 EEPROM_Write(0x2001,gAlarm%100);               
  231.         }        
  232. }


  233. /*********************************************************/
  234. // 傳感器1報警判斷
  235. /*********************************************************/
  236. void AlarmJudge1(uint ss)
  237. {
  238.         
  239.         if(ss<gAlarm)                // LED燈判斷
  240.         {
  241.                 Led1_P=0;
  242.                 Buzzer_P=1;
  243.                 DelayMs(100);
  244.                 Buzzer_P=0;
  245.                 //DelayMs(100);
  246.         }
  247.         else
  248.         {
  249.                 Led1_P=1;
  250.                 Buzzer_P=0;
  251.         }


  252. }

  253. /*********************************************************/
  254. // 報警值初始化
  255. /*********************************************************/
  256. void AlarmInit()
  257. {
  258.         gAlarm=EEPROM_Read(0x2000)*100+EEPROM_Read(0x2001);                // 從EEPROM讀取報警值

  259.         if((gAlarm==0)||(gAlarm>400))                        // 如果讀取到的報警值異常(等于0或大于400則認為異常)
  260.         {
  261.                 gAlarm=15;                                                                                        // 重新賦值報警值為15
  262. ……………………

  263. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png
教程及成品演示見B站 @玄客kali 視頻:https://space.bilibili.com/496375938
PCB是立創格式的

以上資料51hei附件下載:
程序+仿真+文檔資料.7z (8.07 MB, 下載次數: 126)

評分

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

查看全部評分

回復

使用道具 舉報

ID:262 發表于 2021-12-5 07:00 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线看片 | 999热精品视频 | 毛片网络 | 激情五月综合 | 久久av一区二区三区 | 亚洲毛片在线 | 精品国产精品国产偷麻豆 | 亚洲国产免费 | 欧美日韩亚洲在线 | www.亚洲国产精品 | 在线成人av | 亚洲视频不卡 | 亚洲一区二区三区观看 | 欧美一区二区视频 | 欧产日产国产精品99 | 日韩国产中文字幕 | 欧美精品三区 | 久久在线看 | 亚洲视频免费观看 | 久久久精品综合 | 精品视频一区二区三区四区 | 涩涩视频在线观看免费 | 国产精品精品视频一区二区三区 | 久久精品国产99国产精品 | 亚洲成人免费在线观看 | 久久com| 在线一区视频 | 亚洲一区中文 | 一本一道久久a久久精品蜜桃 | 午夜在线小视频 | 色婷婷国产精品综合在线观看 | 亚洲综合一区二区三区 | a级毛片国产 | 欧美国产91 | 波波电影院一区二区三区 | 男人的天堂在线视频 | 欧美国产精品一区二区三区 | 欧美精品成人一区二区三区四区 | 日韩精品在线观看一区二区 | 99精品国产一区二区三区 | 国产91丝袜在线18 |