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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AVR單片機電子抽獎完整項目仿真+源碼設計

[復制鏈接]
跳轉到指定樓層
樓主
電子抽獎完整項目,基于AVR單片機ATMEG128,包含原理圖,源代碼及仿真

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


單片機源程序如下:
  1. //ICC-AVR application builder
  2. // Target : M128
  3. // Crystal: 8.0000Mhz

  4. #include <iom128v.h>
  5. #include <macros.h>
  6. #include <stdlib.h>


  7. #define  bit_read(var,bitno) ((var)<<(7-(bitno))>>7)
  8. #define TRUE 0xFF
  9. #define FALSE 0x00


  10. unsigned int randdata = 0;
  11. unsigned char wdata,qdata,baidata,sdata,gdata;
  12. unsigned char temp2,temp3,temp4,temp5,temp6;

  13. unsigned char TimerFlg = FALSE;
  14. unsigned char T3Flg = FALSE;
  15. unsigned char SEGtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


  16. void delay(int i)
  17. {
  18.         unsigned char j;
  19.         for(;i>0;i--)
  20.                 for(j=111;j>0;j--);
  21. }
  22. //統計為1的個數
  23. unsigned char count(unsigned char n)
  24. {   
  25.   int sum=0;   
  26.   while(n)   
  27. {        
  28.   sum+=n&0x01;      
  29.   n>>=1;   
  30.   }   
  31.   return sum;
  32. }

  33. void initrand(void)
  34. {
  35.            unsigned char counter=0;
  36.         unsigned char temp = 0;
  37.         PORTC = 0xFF;
  38.         temp = PINC; //讀取撥碼開關狀態
  39.         counter = count(temp);
  40.     srand(counter);       //初始化種子
  41. }

  42. void port_init(void)
  43. {
  44. PORTA = 0x00;
  45. DDRA  = 0x00;
  46. PORTB = 0x00;
  47. DDRB  = 0xff;
  48. PORTC = 0x00; //m103 output only
  49. DDRC  = 0x00;
  50. PORTD = 0x00;
  51. DDRD  = 0x00;
  52. PORTE = 0x00;
  53. DDRE  = 0xFF;
  54. PORTF = 0x00;
  55. DDRF  = 0xFF;
  56. PORTG = 0x00;
  57. DDRG  = 0x00;
  58. }

  59. //TIMER3 initialize - prescale:256
  60. // WGM: 0) Normal, TOP=0xFFFF
  61. // desired value: 100mSec
  62. // actual value: 100.000mSec (0.0%)
  63. void timer3_init(void)
  64. {
  65. TCCR3B = 0x00; //stop
  66. TCNT3H = 0xF3; //setup
  67. TCNT3L = 0xCB;
  68. OCR3AH = 0x0C;
  69. OCR3AL = 0x35;
  70. OCR3BH = 0x0C;
  71. OCR3BL = 0x35;
  72. OCR3CH = 0x0C;
  73. OCR3CL = 0x35;
  74. ICR3H  = 0x0C;
  75. ICR3L  = 0x35;
  76. TCCR3A = 0x00;
  77. TCCR3B = 0x00;
  78. T3Flg = FALSE;
  79. }

  80. #pragma interrupt_handler timer3_ovf_isr:iv_TIM3_OVF
  81. void timer3_ovf_isr(void)
  82. {
  83. //TIMER3 has overflowed
  84. TCNT3H = 0xF3; //reload counter high value
  85. TCNT3L = 0xCB; //reload counter low value
  86. TimerFlg = TRUE;                 //修改標志位
  87. PORTB^=BIT(0);
  88. }

  89. #pragma interrupt_handler int0_isr:iv_INT0
  90. void int0_isr(void)
  91. {
  92.   if(T3Flg == TRUE)                       //判斷當前定時計數器的狀態
  93.   {
  94.     TCCR3B = 0x00;
  95.         T3Flg = FALSE;
  96.         PORTB= 0xff;
  97.   }
  98.   else
  99.   {
  100.     initrand();   //初始化種子
  101.         T3Flg = TRUE;
  102.         TCCR3B = 0x04;
  103.         PORTC = 0x00;
  104.   }
  105. }

  106. //call this routine to initialize all peripherals
  107. void init_devices(void)
  108. {
  109. //stop errant interrupts until set up
  110. CLI(); //disable all interrupts
  111. XDIV  = 0x00; //xtal divider
  112. XMCRA = 0x00; //external memory
  113. port_init();
  114. timer3_init();

  115. MCUCR = 0x00;
  116. EICRA = 0x00; //extended ext ints
  117. EICRB = 0x00; //extended ext ints
  118. EIMSK = 0x01;
  119. TIMSK = 0x00; //timer interrupt sources
  120. ETIMSK = 0x04; //extended timer interrupt sources
  121. SEI(); //re-enable interrupts
  122. //all peripherals are now initialized
  123. }

  124. void WR5952(unsigned char data)
  125. {
  126.          //PE0-SHCP,PE1-DS,PE2-STCP
  127.         unsigned char j;
  128.         /*SPI發送開始*/
  129.         PORTE&=~(1<<PE2);
  130.         delay(1);
  131.         for(j=0;j<=7;j++)
  132.         {        
  133.                 PORTE&=~(1<<PE0);
  134.                 delay(1);
  135.                 if(bit_read(data,j))
  136.                 {
  137.                  PORTE|=1<<PE1;
  138.                 }
  139.                 else
  140.                 {
  141.                  PORTE&=~(1<<PE1);
  142.                 }
  143.                 delay(1);
  144.                 PORTE=1<<PE0;
  145.                 delay(1);
  146.         }
  147.         PORTE&=~(1<<PE0);
  148.         delay(1);
  149.         PORTE|=1<<PE2;        
  150.         delay(1);
  151. }        

  152. void WR5953(unsigned char data)
  153. {
  154.          //PE3-SHCP,PE4-DS,PE5-STCP
  155.         unsigned char j;
  156.         /*SPI發送開始*/
  157.         PORTE&=~(1<<PE5);
  158.         delay(1);
  159.         for(j=0;j<=7;j++)
  160.         {        
  161.                 PORTE&=~(1<<PE3);
  162.                 delay(1);
  163.                 if(bit_read(data,j))
  164.                 {
  165.                  PORTE|=1<<PE4;
  166.                 }
  167.                 else
  168.                 {
  169.                  PORTE&=~(1<<PE4);
  170.                 }
  171.                 delay(1);
  172.                 PORTE=1<<PE3;
  173.                 delay(1);
  174.         }
  175.         PORTE&=~(1<<PE3);
  176.         delay(1);
  177.         PORTE|=1<<PE5;        
  178.         delay(1);
  179. }        

  180. void WR5954(unsigned char data)
  181. {
  182.          //PE6-SHCP,PE7-DS,PF0-STCP
  183.         unsigned char j;
  184.         /*SPI發送開始*/
  185.         PORTF&=~(1<<PF0);
  186.         delay(1);
  187.         for(j=0;j<=7;j++)
  188.         {        
  189.                 PORTE&=~(1<<PE6);
  190.                 delay(1);
  191.                 if(bit_read(data,j))
  192.                 {
  193.                  PORTE|=1<<PE7;
  194.                 }
  195.                 else
  196.                 {
  197.                  PORTE&=~(1<<PE7);
  198.                 }
  199.                 delay(1);
  200.                 PORTE=1<<PE6;
  201.                 delay(1);
  202.         }
  203.         PORTE&=~(1<<PE6);
  204.         delay(1);
  205.         PORTF|=1<<PF0;        
  206.         delay(1);
  207. }        

  208. void WR5955(unsigned char data)
  209. {
  210.          //PF1-SHCP,PF2-DS,PF3-STCP
  211.         unsigned char j;
  212.         /*SPI發送開始*/
  213.         PORTF&=~(1<<PF3);
  214.         delay(1);
  215.         for(j=0;j<=7;j++)
  216.         {        
  217.                 PORTF&=~(1<<PF1);
  218.                 delay(1);
  219.                 if(bit_read(data,j))
  220.                 {
  221.                  PORTF|=1<<PF2;
  222.                 }
  223.                 else
  224.                 {
  225.                  PORTF&=~(1<<PF2);
  226.                 }
  227.                 delay(1);
  228.                 PORTF=1<<PF1;
  229.                 delay(1);
  230.         }
  231.         PORTF&=~(1<<PF1);
  232.         delay(1);
  233.         PORTF|=1<<PF3;        
  234.         delay(1);
  235. }        

  236. void WR5956(unsigned char data)
  237. {
  238.          //PF4-SHCP,PF5-DS,PF6-STCP
  239.         unsigned char j;
  240.         /*SPI發送開始*/
  241.         PORTF&=~(1<<PF6);
  242.         delay(1);
  243.         for(j=0;j<=7;j++)
  244.         {        
  245.                 PORTF&=~(1<<PF4);
  246.                 delay(1);
  247.                 if(bit_read(data,j))
  248.                 {
  249.                  PORTF|=1<<PF5;
  250.                 }
  251.                 else
  252.                 {
  253.                  PORTF&=~(1<<PF5);
  254.                 }
  255.                 delay(1);
  256.                 PORTF=1<<PF4;
  257.                 delay(1);
  258.         }
  259.         PORTF&=~(1<<PF4);
  260.         delay(1);
  261.         PORTF|=1<<PF6;        
  262.         delay(1);
  263. }        

  264. //
  265. void main(void)
  266. {
  267. init_devices();
  268. WR5952(0x02);
  269. //insert your functional code here...
  270. while(1)
  271. {
  272.     while(TimerFlg==FALSE);            //等待延時標志位
  273.     TimerFlg=FALSE;  

  274.     randdata = 2 * rand();    //獲得隨機數
  275.   
  276.     wdata = randdata/10000;    //輸出萬位
  277.     temp2 = SEGtable[wdata];
  278.         WR5952(temp2);
  279.    
  280.     qdata = randdata%10000/1000;  //輸出千位
  281.     temp3 =  SEGtable[qdata];
  282.         WR5953(temp3);

  283.     baidata = randdata%1000/100;  //輸出百位
  284.     temp4 =  SEGtable[baidata];
  285.         WR5954(temp4);

  286.     sdata = randdata%100/10;    //輸出10位
  287.     temp5 =  SEGtable[sdata];
  288.         WR5955(temp5);

  289.     gdata = randdata%10;    //輸出個位
  290.     temp6 =  SEGtable[gdata];
  291.         WR5956(temp6);
  292. }
  293. }
復制代碼

所有資料51hei提供下載:
35738618dianzichoujiang.rar (117.24 KB, 下載次數: 20)


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

使用道具 舉報

沙發
ID:389587 發表于 2018-11-30 14:53 | 只看該作者
bit_read(var,bitno) ((var)<<(7-(bitno))>>7)萌新求問,這個宏定義是定義的啥,沒大看懂
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩精品在线 | 中文字幕电影在线观看 | 成人免费在线观看 | 中文字幕高清 | 亚洲看片网站 | 欧美成年人 | 久久国产视频网 | 亚洲丝袜天堂 | 特级a欧美做爰片毛片 | 日本精品久久 | 免费视频一区二区 | 爱草在线 | 久久久一区二区三区四区 | 久久伊人影院 | 精品一区国产 | 国产精品99久久久久久久vr | 久久国产日韩 | 国产又爽又黄的视频 | 免费一区二区在线观看 | www精品美女久久久tv | 欧美日韩在线观看视频网站 | 国产高清在线 | 国产精品乱码一区二三区小蝌蚪 | 国产乱肥老妇国产一区二 | 激情小说综合网 | 99精品视频一区二区三区 | 亚洲免费在线 | 国产婷婷 | 一久久久| 国产一区二区 | 在线观看国产视频 | 久久久久久久久久一区二区 | 狠狠操狠狠色 | 岛国一区 | 亚洲天堂成人在线视频 | 日本韩国电影免费观看 | 一区中文字幕 | 午夜影院黄 | 五月婷婷激情 | 亚洲精品在线91 | 国产精品久久国产愉拍 |