wg.c
上传用户:penglong
上传日期:2014-12-26
资源大小:2k
文件大小:10k
源码类别:

中间件编程

开发平台:

C/C++

  1. //------------------------------------------------------ 
  2. //功能:把数组封包成韦根26的格式,并发送出去 
  3. // 原理是把每个字节的低4位取出,来计算这个字节的值 
  4. //入口:str=要封包的数组, 
  5. //出口:DATA0P3.0;DATA1=P3.1 
  6. //设计:大鹏,大鹏艾迪,2006/4/11 
  7. //------------------------------------------------------ 
  8. /*#include <52.h>
  9. #define  uchar unsigned char
  10. #define  uint unsigned int
  11. #define  ulong unsigned long int*/
  12. extern sbit WG_DATA0 =P3^2;
  13. extern sbit WG_DATA1 =P3^3 ;
  14. void send_wiegand26(uchar *str) 
  15. //| wiegand[0] | wiegand[1] | wiegand[2] | 
  16. //| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)| 
  17. uchar idata i; 
  18. static uchar data one_num; //计算1的个数 
  19. uchar data check_temp; //韦根包奇偶效验中间暂存 
  20. bit data even; //韦根包前12位偶效验 
  21. bit data odd; //韦根包后12位齐效验 
  22. static uchar data wiegand[3]; //韦根包数据24位 
  23. // EA=0;//禁止中断
  24. //--------------------------------端口方向定义 
  25. // P3M0 = 0x00; //普通I/O口 
  26. // P3M1 = 0x00; 
  27. //================================数组到韦根包的转化 
  28. wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每个字节的低4位取出,来计算这个字节的值 
  29. wiegand[0] = wiegand[0]|(*(str+1)&0x0f); 
  30. //--------------------------------计算前8位1的个数,为偶效验用 
  31. check_temp = wiegand[0]; 
  32. for(i = 0;i<8;i++) 
  33. if(check_temp&0x01) //(check_temp&0x01) 
  34. one_num++; 
  35. check_temp >>= 1; 
  36. wiegand[1] = wiegand[1]|(*(str+2)<<4); 
  37. //--------------------------------计算接下来的4位1的个数,为偶效验用 
  38. check_temp = wiegand[1]; 
  39. for(i = 0;i<4;i++) 
  40. if(check_temp&0x80) 
  41. one_num++; 
  42. check_temp<<=1; 
  43. //--------------------------------判断1的个数 
  44. one_num%2 == 0 ? (even = 0):( even = 1); 
  45. one_num = 0; 
  46. wiegand[1] = wiegand[1]|(*(str+3)&0x0f); 
  47. //--------------------------------计算接下来的4位1的个数,为奇效验用 
  48. check_temp = wiegand[1]; 
  49. for(i = 0;i<4;i++) 
  50.  if(check_temp&0x01){one_num++;} 
  51.  check_temp>>=1; 
  52. wiegand[2] = wiegand[2]|(*(str+4)<<4); 
  53. wiegand[2] = wiegand[2]|(*(str+5)&0x0f); 
  54. //--------------------------------计算接下来的8位1的个数,为奇效验用 
  55. check_temp = wiegand[2]; 
  56. for(i = 0;i<8;i++) 
  57. if(check_temp&0x01){one_num++;} 
  58. check_temp >>= 1; 
  59. //--------------------------------判断1的个数 
  60. one_num%2 == 0 ? (odd = 1):( odd = 0); 
  61. one_num = 0; 
  62. //================================启动发送,用定时器做时间延时 
  63. //--------------------------------韦根 输出端初始化 
  64. WG_DATA0 = 1; 
  65. WG_DATA1 = 1; 
  66. //--------------------------------发送偶效验 
  67. TMOD=0X01;                    //T0为方式1计数
  68. EA=1; EX1=0;       EX0=0;   //开中断,禁止INT0,INT1中断
  69. if(even)                     //enen韦根包前12位偶效验标志
  70. WG_DATA1 = 0; 
  71.  //-------------------------延时100us 
  72. TR0 = 0; //停止T0计算
  73. TH0 = (65536 - 158)/256; //定时100us  20MHz晶体
  74. TL0 = (65536 - 158)%256; 
  75. TF0 = 0; //T0中断请求标志清0
  76. ET0 = 0; //T0中断禁止
  77. TR0 = 1; //启动T0计算
  78. while (!TF0) { ;} 
  79. TF0 = 0; 
  80. WG_DATA1 = 1; 
  81. else 
  82. WG_DATA0 = 0; 
  83. //------------------------延时100us 
  84. TR0 = 0; 
  85. TH0 = (65536 - 158)/256; //定时100us 
  86. TL0 = (65536 - 158)%256; 
  87. TF0 = 0; 
  88. ET0 = 0; 
  89. TR0 = 1; 
  90. while (!TF0) { ;} 
  91. TF0 = 0; 
  92. WG_DATA0 = 1; 
  93. //----------------------------延时一个发送周期 
  94. TR0 = 0; 
  95. TH0 = (65536 - 1582)/256; //定时1000us//1500us 
  96. TL0 = (65536 - 1582)%256; 
  97. TF0 = 0; 
  98. ET0 = 0; 
  99. TR0 = 1; 
  100. while (!TF0) { ;} 
  101. TF0 = 0; 
  102. //-------------------------------发送24位数据 
  103. for(i = 0;i<24;i++) 
  104. //---------------------------韦根 输出端初始化 
  105. WG_DATA0 = 1; 
  106. WG_DATA1 = 1; 
  107. if((wiegand[0])&0x80) 
  108. WG_DATA1 = 0; 
  109. //----------------------延时100us 
  110. TR0 = 0; 
  111. TH0 = (65536 - 158)/256; //定时100us 
  112. TL0 = (65536 - 158)%256; 
  113. TF0 = 0; 
  114. ET0 = 0; 
  115. TR0 = 1; 
  116. while (!TF0) { ;} 
  117. TF0 = 0; 
  118. WG_DATA1 = 1; 
  119. else 
  120. WG_DATA0 = 0; 
  121. //---------------------延时100us 
  122. TR0 = 0; 
  123. TH0 = (65536 - 158)/256; //定时100us 
  124. TL0 = (65536 - 158)%256; 
  125. TF0 = 0; 
  126. ET0 = 0; 
  127. TR0 = 1; 
  128. while (!TF0) { ;} 
  129. TF0 = 0; 
  130. WG_DATA0 = 1; 
  131.  (*(long*)&wiegand[0]) <<= 1; 
  132. //-------------------------------延时一个发送周期 
  133. TR0 = 0; 
  134. TH0 = (65536 - 1582)/256; //定时1000us//1500us 
  135. TL0 = (65536 - 1582)%256; 
  136. TF0 = 0; 
  137. ET0 = 0; 
  138. TR0 = 1; 
  139. while (!TF0) { ;} 
  140. TF0 = 0; 
  141. //==============================发送奇效验位 
  142. //------------------------------韦根 输出端初始化 
  143. WG_DATA0 = 1; 
  144. WG_DATA1 = 1; 
  145.  if(odd)  //韦根包后12位齐效验标志
  146. WG_DATA1 = 0; 
  147. //-------------------------延时100us 
  148. TR0 = 0; 
  149. TH0 = (65536 - 158)/256; //定时100us 
  150. TL0 = (65536 - 158)%256; 
  151. TF0 = 0; 
  152. ET0 = 0; 
  153. TR0 = 1; 
  154. while (!TF0) { ;} 
  155. TF0 = 0; 
  156. WG_DATA1 = 1; 
  157. else 
  158. WG_DATA0 = 0; 
  159. //-------------------------延时100us 
  160. TR0 = 0; 
  161. TH0 = (65536 - 158)/256; //定时100us 
  162. TL0 = (65536 - 158)%256; 
  163. TF0 = 0; 
  164. ET0 = 0; 
  165. TR0 = 1; 
  166. while (!TF0) { ;} 
  167. TF0 = 0; 
  168. WG_DATA0 = 1; 
  169. /*
  170. void send_wiegand34(uchar *str) 
  171. //| wiegand[0] | wiegand[1] | wiegand[2] | 
  172. //| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)| 
  173. uchar data i; 
  174. static uchar data one_num; //计算1的个数 
  175. uchar data check_temp;  //韦根包奇偶效验中间暂存 
  176. bit data even;  //韦根包前16位偶效验 
  177. bit data odd;  //韦根包后16位齐效验 
  178. static uchar data wiegand[4]; //韦根包数据32位 
  179. // EA=0;//禁止中断
  180. //--------------------------------端口方向定义 
  181. // P3M0 = 0x00; //普通I/O口 
  182. // P3M1 = 0x00; 
  183. //================================数组到韦根包的转化 
  184. wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每个字节的低4位取出,来计算这个字节的值 
  185. wiegand[0] = wiegand[0]|(*(str+1)&0x0f); 
  186. //--------------------------------计算前8位1的个数,为偶效验用 
  187. check_temp = wiegand[0]; 
  188. for(i = 0;i<8;i++) 
  189. if(check_temp&0x01) //(check_temp&0x01) 
  190. one_num++; 
  191. check_temp >>= 1; 
  192. wiegand[1] = wiegand[1]|(*(str+2)<<4); 
  193. //--------------------------------计算接下来的4位1的个数,为偶效验用 
  194. check_temp = wiegand[1]; 
  195. for(i = 0;i<4;i++) 
  196. if(check_temp&0x80) 
  197. one_num++; 
  198. check_temp<<=1; 
  199. //--------------------------------判断1的个数 
  200. one_num%2 == 0 ? (even = 0):( even = 1); 
  201. one_num = 0; 
  202. wiegand[1] = wiegand[1]|(*(str+3)&0x0f); 
  203. //--------------------------------计算接下来的4位1的个数,为奇效验用 
  204. check_temp = wiegand[1]; 
  205. for(i = 0;i<4;i++) 
  206.  if(check_temp&0x01){one_num++;} 
  207.  check_temp>>=1; 
  208. wiegand[2] = wiegand[2]|(*(str+4)<<4); 
  209. wiegand[2] = wiegand[2]|(*(str+5)&0x0f); 
  210. //--------------------------------计算接下来的8位1的个数,为奇效验用 
  211. check_temp = wiegand[2]; 
  212. for(i = 0;i<8;i++) 
  213. if(check_temp&0x01){one_num++;} 
  214. check_temp >>= 1; 
  215. //--------------------------------判断1的个数 
  216. one_num%2 == 0 ? (odd = 1):( odd = 0); 
  217. one_num = 0; 
  218. //================================启动发送,用定时器做时间延时 
  219. //--------------------------------韦根 输出端初始化 
  220. WG_DATA0 = 1; 
  221. WG_DATA1 = 1; 
  222. //--------------------------------发送偶效验 
  223. // TMOD=0X01;                    //T0为方式1计数
  224. // EA=1; EX1=0;       EX0=0;   //开中断,禁止INT0,INT1中断
  225. if(even)                     //enen韦根包前12位偶效验标志
  226. WG_DATA1 = 0; 
  227.  //-------------------------延时100us 
  228. TR0 = 0; //停止T0计算
  229. TH0 = (65536 - 158)/256; //定时100us  20MHz晶体
  230. TL0 = (65536 - 158)%256; 
  231. TF0 = 0; //T0中断请求标志清0
  232. ET0 = 0; //T0中断禁止
  233. TR0 = 1; //启动T0计算
  234. while (!TF0) { ;} 
  235. TF0 = 0; 
  236. WG_DATA1 = 1; 
  237. else 
  238. WG_DATA0 = 0; 
  239. //------------------------延时100us 
  240. TR0 = 0; 
  241. TH0 = (65536 - 158)/256; //定时100us 
  242. TL0 = (65536 - 158)%256; 
  243. TF0 = 0; 
  244. ET0 = 0; 
  245. TR0 = 1; 
  246. while (!TF0) { ;} 
  247. TF0 = 0; 
  248. WG_DATA0 = 1; 
  249. //----------------------------延时一个发送周期 
  250. TR0 = 0; 
  251. TH0 = (65536 - 1582)/256; //定时1000us //1382//1500us
  252. TL0 = (65536 - 1582)%256; 
  253. TF0 = 0; 
  254. ET0 = 0; 
  255. TR0 = 1; 
  256. while (!TF0) { ;} 
  257. TF0 = 0; 
  258. //-------------------------------发送24位数据 
  259. for(i = 0;i<32;i++) 
  260. //---------------------------韦根 输出端初始化 
  261. WG_DATA0 = 1; 
  262. WG_DATA1 = 1; 
  263. if((wiegand[0])&0x80) 
  264. WG_DATA1 = 0; 
  265. //----------------------延时100us 
  266. TR0 = 0; 
  267. TH0 = (65536 - 158)/256; //定时100us 
  268. TL0 = (65536 - 158)%256; 
  269. TF0 = 0; 
  270. ET0 = 0; 
  271. TR0 = 1; 
  272. while (!TF0) { ;} 
  273. TF0 = 0; 
  274. WG_DATA1 = 1; 
  275. else 
  276. WG_DATA0 = 0; 
  277. //---------------------延时100us 
  278. TR0 = 0; 
  279. TH0 = (65536 - 158)/256; //定时100us 
  280. TL0 = (65536 - 158)%256; 
  281. TF0 = 0; 
  282. ET0 = 0; 
  283. TR0 = 1; 
  284. while (!TF0) { ;} 
  285. TF0 = 0; 
  286. WG_DATA0 = 1; 
  287. (*(long*)&wiegand[0]) <<= 1; 
  288. //-------------------------------延时一个发送周期 
  289. TR0 = 0; 
  290. TH0 = (65536 - 1582)/256; //定时1000us //1500us  -1382 
  291. TL0 = (65536 - 1582)%256; 
  292. TF0 = 0; 
  293. ET0 = 0; 
  294. TR0 = 1; 
  295. while (!TF0) { ;} 
  296. TF0 = 0; 
  297. //==============================发送奇效验位 
  298. //------------------------------韦根 输出端初始化 
  299. WG_DATA0 = 1; 
  300. WG_DATA1 = 1; 
  301.  if(odd)  //韦根包后12位齐效验标志
  302. WG_DATA1 = 0; 
  303. //-------------------------延时100us 
  304. TR0 = 0; 
  305. TH0 = (65536 - 158)/256; //定时100us 
  306. TL0 = (65536 - 158)%256; 
  307. TF0 = 0; 
  308. ET0 = 0; 
  309. TR0 = 1; 
  310. while (!TF0) { ;} 
  311. TF0 = 0; 
  312. WG_DATA1 = 1; 
  313. else 
  314. WG_DATA0 = 0; 
  315. //-------------------------延时100us 
  316. TR0 = 0; 
  317. TH0 = (65536 - 158)/256; //定时100us 
  318. TL0 = (65536 - 158)%256; 
  319. TF0 = 0; 
  320. ET0 = 0; 
  321. TR0 = 1; 
  322. while (!TF0) { ;} 
  323. TF0 = 0; 
  324. WG_DATA0 = 1; 
  325. } */