找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3329|回复: 1
收起左侧

AVR单片机电子抽奖完整项目仿真+源码设计

[复制链接]
ID:433862 发表于 2018-11-26 23:59 | 显示全部楼层 |阅读模式
电子抽奖完整项目,基于AVR单片机ATMEG128,包含原理图,源代码及仿真

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  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)
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表