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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5627|回復: 7
打印 上一主題 下一主題
收起左側

電子秤仿真與單片機代碼

  [復制鏈接]
跳轉到指定樓層
樓主
沒事做了一個電子秤仿真

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


單片機代碼:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"delay.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define WRITE_ADDR 0x90
  7. #define AD_COMMAND 0x00
  8. #define READ_ADDR 0x91
  9. /*管腳定義*/
  10. sbit SDA = P2^0;
  11. sbit SCL = P2^1;
  12. sbit shumaguan1 = P3^4;
  13. sbit shumaguan2 = P3^5;
  14. sbit shumaguan3 = P3^6;
  15. sbit shumaguan4 = P3^7;
  16. sbit xiaoshudian = P0^7;
  17. sbit alarm = P2^2;
  18. /*共陰極數碼管編碼*/
  19. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  20. /*全局變量*/
  21. uchar adc_data = 0;          //記錄每一次讀取的adc數據
  22. uchar key_value =0;  //記錄每一次按鍵值
  23. uchar temp_data[4] = {0}; //記錄輸入的單價
  24. uchar point_place = 0;    //記錄小數點位置
  25. uchar wei_shu = 0;                  //記錄總共數據位數
  26. uchar equal_sign = 0;          //記錄是否按下“=”號
  27. uchar interrupt_flag = 0; //發生中斷標記
  28. uint  price = 0;  //用來記錄單價
  29. /*微秒級別延時(5us)*/
  30. void delay_us()
  31. {;;}
  32. /*毫秒級別延時(z微妙)*/
  33. void delay_ms(unsigned int z)
  34. {
  35.         unsigned int x,y;
  36.         for(x = z;x > 0;x--)
  37.                 for(y = 120 ;y>0;y--);
  38. }
  39. /*報警*/
  40. void beep_on(void)
  41. {
  42.         alarm = 0;
  43. }
  44. void beep_off(void)
  45. {
  46.         alarm = 1;
  47. }
  48. /*鍵盤讀取函數*/
  49. uchar keyboard_read()
  50. {
  51.         uchar key,temp;
  52.     P1=0xfe;
  53.     temp=P1;
  54.     temp=temp&0xf0;
  55.     if(temp!=0xf0)
  56.     {
  57.       delay_ms(10);
  58.       if(temp!=0xf0)
  59.       {
  60.         temp=P1;
  61.         switch(temp)
  62.         {
  63.           case 0xee:
  64.                key=7;
  65.                break;
  66.           case 0xde:
  67.                key=8;
  68.                break;
  69.           case 0xbe:
  70.                key=9;
  71.                break;
  72.           case 0x7e:
  73.                key='/';
  74.                break;
  75.          }
  76.          while(temp!=0xf0)
  77.          {
  78.            temp=P1;
  79.            temp=temp&0xf0;
  80.          }
  81.       }
  82.     }
  83.     P1=0xfd;
  84.     temp=P1;
  85.     temp=temp&0xf0;
  86.     if(temp!=0xf0)
  87.     {
  88.       delay_ms(10);
  89.       if(temp!=0xf0)
  90.       {
  91.         temp=P1;
  92.         switch(temp)
  93.         {
  94.           case 0xed:
  95.                key=4;
  96.                break;

  97.           case 0xdd:
  98.                key=5;
  99.                break;
  100.           case 0xbd:
  101.                key=6;
  102.                break;
  103.           case 0x7d:
  104.                key='*';
  105.                break;
  106.          }
  107.          while(temp!=0xf0)
  108.          {
  109.            temp=P1;
  110.            temp=temp&0xf0;
  111.          }
  112.       }
  113.       }
  114.     P1=0xfb;
  115.     temp=P1;
  116.     temp=temp&0xf0;
  117.     if(temp!=0xf0)
  118.     {
  119.       delay_ms(10);
  120.       if(temp!=0xf0)
  121.       {
  122.         temp=P1;
  123.         switch(temp)
  124.         {
  125.           case 0xeb:
  126.                key=1;
  127.                break;
  128.           case 0xdb:
  129.                key=2;
  130.                break;
  131.           case 0xbb:
  132.                key=3;
  133.                break;
  134.           case 0x7b:
  135.                key='-';
  136.                break;
  137.          }
  138.          while(temp!=0xf0)
  139.          {
  140.            temp=P1;
  141.            temp=temp&0xf0;
  142.          }
  143.       }
  144.       }
  145.     P1=0xf7;
  146.     temp=P1;
  147.     temp=temp&0xf0;
  148.     if(temp!=0xf0)
  149.     {
  150.       delay_ms(10);
  151.       if(temp!=0xf0)
  152.       {
  153.         temp=P1;
  154.         switch(temp)
  155.         {
  156.           case 0xe7:
  157.                key='.';
  158.                break;
  159.           case 0xd7:
  160.                key=0;
  161.                break;
  162.           case 0xb7:
  163.                key='=';
  164.                break;
  165.           case 0x77:
  166.                key='+';
  167.                break;
  168.          }
  169.          while(temp!=0xf0)
  170.          {
  171.            temp=P1;
  172.            temp=temp&0xf0;
  173.          }
  174.       }
  175.     }
  176.         return key;
  177. }
  178. /*iic開始信號*/
  179. void start()
  180. {
  181.         SCL = 1;
  182.         _nop_();
  183.         SDA = 1;
  184.         delay_us();
  185.         SDA = 0;
  186.         delay_us();
  187.         SCL = 0;//拉低時鐘線,開始信號以后方便更改SDA 上面的數據來發送
  188.         _nop_();
  189. }
  190. /*iic 停止信號*/
  191. void stop()
  192. {
  193.         SCL = 1;
  194.         _nop_();
  195.         SDA = 0;
  196.         delay_us();
  197.         SDA = 1;
  198.         delay_us();
  199. }
  200. /*回復響應信號*/
  201. void respond()
  202. {
  203.         SCL = 1;
  204.         _nop_();
  205.         SDA = 0;
  206.         delay_us();
  207.         
  208.         SCL = 0; //凡是在一個小節后拉低SCL 都是為了方便接下來的 數據傳輸
  209.         _nop_();
  210. }
  211. /*不響應*/
  212. void norespond()
  213. {
  214.         SCL = 1;
  215.         _nop_();
  216.         SDA = 1;
  217.         delay_us();
  218. }
  219. /*初始化iic總線*/
  220. void init_iic_line()
  221. {
  222.         SCL = 1;
  223.         _nop_();
  224.         SDA = 1;
  225.         _nop_();
  226. }

  227. /*往iic設備發送數據,先發送數據的最高位 */
  228. void write_byte(uchar value)
  229. {
  230.         uchar i,temp;
  231.         temp = value;
  232.         for(i = 0;i<8;i++)
  233.         {
  234.                 SCL = 0;
  235.                 _nop_();
  236.                 if((temp & 0x80) == 0x80)
  237.                 {
  238.                         SDA = 1;
  239.                 }
  240.                 else
  241.                 {
  242.                         SDA = 0;
  243.                 }
  244.                 SCL = 1;
  245.                 _nop_();  
  246.                 temp <<=1;
  247.         }
  248.         SCL = 0;
  249.         _nop_();
  250. }
  251. /*讀取iic設備發送過來的數據*/
  252. uchar read_byte()
  253. {
  254.         uchar i, return_value = 0;
  255.         SDA = 1;//釋放數據線,交給從機控制
  256.         _nop_();
  257.         SCL = 0;
  258.         _nop_();
  259.         for(i = 0;i<8;i++)
  260.         {
  261.                 SCL = 1;
  262.                 if(SDA == 1)
  263.                 {
  264.                         return_value  = return_value |0x01;
  265.                 }
  266.                 if(i<7)//這里很重要
  267.                 {
  268.                         return_value <<= 1;
  269.                 }
  270.                 SCL = 0;
  271.                 _nop_();
  272.         }
  273.         return return_value;
  274. }
  275. /*顯示一個數碼管*/
  276. void display_one(uchar value)
  277. {
  278.         P0 = table[value];
  279. }
  280. /*初始化iic設備*/
  281. void init_iic_device()
  282. {
  283.         start();
  284.         write_byte(WRITE_ADDR);
  285.         respond();
  286.         write_byte(AD_COMMAND);
  287.         respond();
  288. }
  289. /*讀取adc數據*/
  290. uchar read_adc_data()
  291. {
  292.         uchar adc_data = 0;
  293.         start();
  294.         write_byte(READ_ADDR);
  295.         respond();
  296.         adc_data = read_byte();
  297.         norespond();
  298.         stop();
  299.         return adc_data;
  300. }
  301. /*adc數據處理*/
  302. void adc_data_process()
  303. {
  304.         long temp_weight;
  305.         temp_weight = ((long)adc_data)*1000/51;
  306.         temp_data[0] = temp_weight/1000;
  307.         temp_data[1] = temp_weight%1000/100;
  308.         temp_data[2] = temp_weight%1000%100/10;
  309.         temp_data[3] = temp_weight%1000%100%10;
  310.         point_place = 1;
  311.         wei_shu = 4;
  312. }
  313. /*選擇哪個數碼管亮*/
  314. void shumaguan_slect_on(uchar num)
  315. {
  316.         uchar temp = 4;
  317.         temp = temp-(wei_shu -num);
  318.         switch(temp)
  319.         {
  320.                  case 0:
  321.                          shumaguan1 = 0;
  322.                         break;
  323.                  case 1:
  324.                          shumaguan2 = 0;
  325.                         break;
  326.                  case 2:
  327.                          shumaguan3 = 0;
  328.                         break;
  329.                  case 3:
  330.                          shumaguan4 = 0;
  331.                         break;
  332.                  default:
  333.                          break;
  334.         }
  335. }
  336. /*選擇哪個數碼管熄滅*/
  337. void shumaguan_slect_off(uchar num)
  338. {
  339.         uchar temp = 4;
  340.         temp = temp-(wei_shu -num);
  341.         switch(temp)
  342.         {
  343.                  case 0:
  344.                          shumaguan1 = 1;
  345.                         break;
  346.                  case 1:
  347.                          shumaguan2 = 1;
  348.                         break;
  349.                  case 2:
  350.                          shumaguan3 = 1;
  351.                         break;
  352.                  case 3:
  353.                          shumaguan4 = 1;
  354.                         break;
  355.                  default:
  356.                          break;
  357.         }
  358. }
  359. void clear_led(void)
  360. {
  361.         shumaguan1 = 1;
  362.         shumaguan2 = 1;
  363.         shumaguan3 = 1;
  364.         shumaguan3 = 1;        
  365. }
  366. /*顯示子程序,支持顯示重量,單價,總價*/
  367. void display()
  368. {
  369.         uchar i;
  370.         clear_led();
  371.         for(i = 0;i < wei_shu;i++)
  372.         {
  373.                 if((i + 1) == point_place)
  374.                 {
  375.                         shumaguan_slect_off(i);
  376.                         display_one(temp_data[i]);
  377.                         xiaoshudian = 1;
  378.                         shumaguan_slect_on(i);
  379.                         delay_ms(5);
  380.                         shumaguan_slect_off(i);
  381.                 }
  382.                 else
  383.                 {
  384.                         shumaguan_slect_off(i);
  385.                         display_one(temp_data[i]);
  386.                         shumaguan_slect_on(i);
  387.                         delay_ms(5);
  388.                         shumaguan_slect_off(i);        
  389.                 }
  390.         }        
  391. }
  392. /*計算總價并將總價每一位分離*/
  393. void calculate_total_price()
  394. {
  395.         int temp_number = 0 ;
  396.         unsigned long total_price = 0;
  397.         switch(wei_shu -point_place)
  398.         {
  399.                 case 3:
  400.                         temp_number = 100;
  401.                         break;
  402.                 case 2:
  403.                         temp_number = 10;
  404.                         break;
  405.                 case 1:
  406.                         temp_number = 1;
  407.                         break;
  408.         }
  409.         total_price = (unsigned long)price * (unsigned long)adc_data*1000;
  410.         total_price = total_price/51/temp_number/1000;
  411.         if(total_price <10000&&total_price>999)
  412.         {
  413.                 temp_data[0] = total_price/1000;
  414.                 temp_data[1] = total_price%1000/100;
  415.                 temp_data[2] = total_price%1000%100/10;
  416.                 temp_data[3] = total_price%1000%100%10;
  417.                 wei_shu = 4;
  418.                 point_place = 3;
  419.         }
  420.         else if(total_price <1000&&total_price >99)
  421.         {
  422.                 temp_data[0] = total_price/100;
  423.                 temp_data[1] = total_price%100/10;
  424.                 temp_data[2] = total_price%100%10;
  425.                 wei_shu = 3;
  426.                 point_place = 2;
  427.         }
  428.         else if(total_price < 100&&total_price>9)
  429.         {
  430.                 temp_data[0] = total_price/10;
  431.                 temp_data[1] = total_price%10;
  432.                 wei_shu = 2;
  433.                 point_place = 1;
  434.         }
  435.         else
  436.         {
  437.                 temp_data[0] = total_price/10;
  438.                 temp_data[1] = total_price%10;
  439.                 wei_shu = 2;
  440.                 point_place = 1;
  441.         }
  442. }

  443. /*中斷初始化*/
  444. void interrupt_init()
  445. {
  446.         EA = 1;           //開總中斷
  447.         IT0 = 0;   //設置外部中斷0為下降沿觸發
  448.         EX0 = 1;   //開外部中斷0
  449.         P1 = 0xf0; //初始化矩陣鍵盤外部引腳電平
  450. }
  451. int main()
  452. {
  453.         interrupt_init();
  454.         init_iic_line();
  455.         init_iic_device();
  456.         /*讀取傳感器并顯示重量,直到鍵盤輸入重量跳出*/
  457.         while(1)
  458.         {
  459.                 if(interrupt_flag != 1)
  460.                 {
  461.                         adc_data = read_adc_data();
  462.                         adc_data_process();
  463.                         display();         
  464.                 }
  465.                 else
  466.                 {
  467.                         clear_led();
  468.                         break;
  469.                 }         
  470.         }
  471.         /*顯示從鍵盤輸入的單價*/
  472.         while(1)
  473.         {
  474.                 if(equal_sign != 1)
  475.                 {
  476.                         display();
  477.                         adc_data = read_adc_data();
  478.                         if(adc_data == 0)
  479.                         {
  480.                                 break;
  481.                         }
  482.                 }
  483.                 else
  484.                 {
  485.                         break;
  486.                 }
  487.         }
  488.         /*計算總價并顯示,直到重量為0 ,表示稱量物品已經離開,回到程序開始執行處*/
  489.         calculate_total_price();
  490.         while(1)
  491.         {        
  492.                 adc_data = read_adc_data();
  493.                 if(adc_data != 0)
  494.                 {
  495.                         display();
  496.                 }
  497.                 else
  498.                 {
  499.                         uchar i = 0;
  500.                         for(i = 0 ; i<4 ; i++)
  501.                         {
  502.                                 temp_data[i] = 0;
  503.                         }
  504.                         adc_data = 0;         
  505.                          key_value = 0;  
  506.                         point_place = 0;   
  507.                         wei_shu = 0;                 
  508.                         equal_sign = 0;
  509.                         interrupt_flag = 0;
  510.                         price = 0;
  511.                         break;
  512.                 }
  513.         }
  514.         return 0;
  515. }
  516. /***************************中斷處理函數************************/
  517. void keyboard_int(void) interrupt 0
  518. {
  519.         EA = 0;
  520.         /*清除數據 */
  521.         if(interrupt_flag == 0)
  522.         {
  523.                 wei_shu = 0;
  524.                 point_place = 0;
  525.         }
  526.         /*讀取鍵盤值*/
  527.         key_value = keyboard_read();
  528.         if(key_value != '=')
  529.         {
  530.                 if(wei_shu <4)
  531.                 {
  532.                         if(key_value!='.')
  533.                         {
  534.                                 temp_data[wei_shu] = key_value;//將價格存入數組temp_data中
  535.                                 wei_shu ++;
  536.                                 price = price *10 + key_value;
  537.                         }
  538.                         else
  539.                         {
  540.                                 point_place = wei_shu; //記錄小數點位置
  541.                         }
  542.                 }
  543.         }
  544.         else
  545.         {
  546.                 equal_sign = 1;
  547.         }
  548.         interrupt_flag = 1;
  549.         P1 = 0xf0;
  550.         EA = 1;
  551. }
復制代碼



評分

參與人數 1黑幣 +4 收起 理由
T阿里巴巴 + 4 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:193104 發表于 2017-6-9 13:05 | 只看該作者
代碼很簡潔,功能很強大,應該是一個實用的電子秤
回復

使用道具 舉報

板凳
ID:260802 發表于 2017-12-14 23:11 | 只看該作者
可以,好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:265870 發表于 2017-12-23 22:32 | 只看該作者
樓主真心棒!
回復

使用道具 舉報

5#
ID:326666 發表于 2018-5-12 17:43 | 只看該作者
那個u2是什么啊 看不清
回復

使用道具 舉報

6#
ID:263018 發表于 2018-11-29 13:49 | 只看該作者
附件呢
回復

使用道具 舉報

7#
ID:254939 發表于 2018-11-30 00:45 | 只看該作者
可以,好好看看
回復

使用道具 舉報

8#
ID:777921 發表于 2020-6-23 18:38 | 只看該作者
沒有傳感器呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品网 | 免费看大片bbbb欧美 | 日韩中文字幕免费在线观看 | 在线观看中文字幕视频 | 久久精品视频免费观看 | 国产视频中文字幕 | 国产一级黄色网 | 国产免费又黄又爽又刺激蜜月al | 久久91av| 一区二区三区在线播放 | 欧美精品一区二区三区蜜桃视频 | 国产午夜精品一区二区三区四区 | 国产精品高潮呻吟久久久久 | 成人国产精品久久 | 综合久久av | 一区二区三区国产 | av毛片在线免费观看 | 免费看黄色小视频 | 亚洲二区视频 | 美国十次成人欧美色导视频 | 99亚洲精品 | 亚洲国产欧美日韩 | 欧美日韩淫片 | 国产精品久久久久久久久久 | 国产片侵犯亲女视频播放 | av在线三级 | 天天看天天摸天天操 | 亚洲综合三区 | 国产一区影院 | 免费毛片网 | 韩日一区二区 | 粉嫩在线 | а天堂中文最新一区二区三区 | 日韩成人在线一区 | 成人精品福利 | 男女啪啪高潮无遮挡免费动态 | 国产色99精品9i | 国产精品久久久久久亚洲调教 | 精品亚洲永久免费精品 | www.色.com| 久www|