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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1807|回復(fù): 2
收起左側(cè)

STC15F204EA T12數(shù)碼管焊臺移植STC15W408AS單片機(jī)問題

[復(fù)制鏈接]
ID:1039485 發(fā)表于 2022-8-29 11:47 | 顯示全部樓層 |閱讀模式
  1. /*****************STC15W408AS單片機(jī)旋轉(zhuǎn)編碼器版白光T12控制器代碼(by金向維)***********************/
  2. #include "STC15W408AS.h"//單片機(jī)頭文件,24MHz時鐘頻率
  3. #include "INTRINS.h"//頭文件
  4. unsigned char code duanma[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x73};//共陰數(shù)碼管段碼數(shù)據(jù)(0,1,2,3,4,5,6,7,8,9),倒數(shù)第二個是顯示負(fù)號-的數(shù)據(jù),倒數(shù)第一個是顯示字母P的數(shù)據(jù)
  5. unsigned int code wendubiao[62]={924,959,996,1033,1071,1110,1150,1190,1232,1273,1315,1358,1401,1443,1487,1501,1574,1619,1663,1706,1751,1756,1776,1810,1853,1903,1958,2017,2078,2141,2204,2266,2327,2387,2444,2500,2554,2607,2657,2706,2738,2800,2844,2889,2931,2974,3016,3056,3098,3139,3179,3218,3257,3296,3333,3372,3408,3446,3484,3519,3554,3590};//根據(jù)NTC電阻隨溫度變化進(jìn)而引起電壓變化得出的數(shù)據(jù),用來查表計算室溫(進(jìn)而對熱電偶冷端補(bǔ)償)
  6. unsigned char code moren[8]={150,100,43,10,3,5,30,0};//白光控制器的默認(rèn)參數(shù)
  7. unsigned char canshu[7]={100,43,10,3,5,30,0};//部分參數(shù),依次為:失調(diào)電壓,熱電偶數(shù)據(jù),溫度步進(jìn),休眠時間,關(guān)機(jī)時間,溫度修正,喚醒方式
  8. sbit dot=P2^7;//數(shù)碼管的小數(shù)點(diǎn)接P2.7
  9. sbit t12=P2^0;//T12通過P2.0控制
  10. sbit bw=P3^4;//數(shù)碼管百位位選為P3.4
  11. sbit sw=P3^5;//數(shù)碼管十位位選為P3.5
  12. sbit gw=P3^6;//數(shù)碼管個位位選為P3.6
  13. sbit tihuan=P3^7;//數(shù)碼管的a段本應(yīng)該用P1.0控制,由于P1.0被用來控制T12,所以要用P3.7替代P1.0
  14. sbit encoderb=P1^4;//編碼器的b腳接P1.4
  15. sbit encodera=P3^2;//編碼器的a腳接P3.2
  16. sbit zhendongkaiguan=P5^5;//震動開關(guān)接P5.5
  17. sbit bianmaanniu=P3^3;//編碼器的按鍵接P3.3
  18. sbit a7=P2^7;
  19. sbit a6=P2^6;
  20. sbit a5=P2^5;
  21. sbit a4=P2^4;
  22. sbit a3=P2^3;
  23. sbit a2=P2^2;
  24. sbit a1=P2^1;
  25. bit e=1,f=1,g,h=1;//e,f,h用來保存編碼器上一次的狀態(tài),g用來保存震動開關(guān)上一次的狀態(tài)
  26. bit huancunkaiguan=0;//用于改變設(shè)定溫度后延時顯示設(shè)定溫度(而不是立刻顯示t12溫度)
  27. bit xiumiankaiguan=0;//定義休眠開關(guān)
  28. bit xiumianjishukaiguan=0;//定義休眠計數(shù)開關(guān)
  29. bit ganggangkaiji=1;//定義剛剛開機(jī)(用于確保剛開機(jī)未震動手柄能進(jìn)入休眠狀態(tài),因?yàn)槊看涡菝哂嫊r是通過震動傳感器狀態(tài)改變觸發(fā)的,而剛開機(jī)手柄沒有震動所以要特殊處理)
  30. bit guanjikaiguan=0;//定義關(guān)機(jī)開關(guān)
  31. bit guanjijishukaiguan;//定義關(guān)機(jī)計數(shù)開關(guān)
  32. bit huifumoren=0;//是否恢復(fù)默認(rèn)參數(shù)
  33. bit shezhimoshi=0;//設(shè)置模式還是正常工作模式
  34. bit shezhixianshijishukaiguan;//用于設(shè)置模式延時顯示P01,P02等菜單項(xiàng)
  35. bit jinzhicaozuo=1;//用于設(shè)置模式下某時刻禁止編碼器操作
  36. bit xianship;//用于設(shè)置模式下顯示菜單P01,P02等的字母P
  37. bit wendujiaqiang;//溫度加強(qiáng)開關(guān)
  38. bit wendujiaqiangjishukaiguan;//溫度加強(qiáng)計數(shù)開關(guān)
  39. bit moshijishukaiguan;//編碼器按下時間計數(shù)開關(guān),用來判斷長按還是短按
  40. signed char wenduxiuzheng;
  41. signed int huancun;//顯示函數(shù)直接顯示huancun,要顯示一個數(shù)據(jù)將必須這個數(shù)據(jù)賦值給緩存(由于數(shù)碼管只有三位,為了在顯示三位數(shù)同時保持四位數(shù)的精度,所以實(shí)際顯示的是數(shù)據(jù)除以10,支持顯示負(fù)數(shù).但是在參數(shù)設(shè)置模式下顯示的是實(shí)際值,不除以10)
  42. signed int shiwen;//10倍實(shí)際室溫,即實(shí)際室溫乘以10(為了精確)(允許的室溫范圍為-11度至50度)
  43. signed int t12wendu;//T12烙鐵頭的實(shí)際溫度(非熱電偶的溫差)(同樣為10倍溫度)
  44. signed int shedingwendu;//設(shè)定溫度(范圍200~450度)
  45. signed int wencha;//T12兩個周期間的溫差
  46. unsigned char zhouqijishu;//加熱周期200ms計數(shù)
  47. unsigned char jinduzhi;//設(shè)置模式中設(shè)置到了P幾(P00,P01,P02等等)
  48. unsigned char moshixuanze;//有效值0,1,2;短按編碼器置2,長按置3
  49. unsigned int jiareshu;//每200ms加熱周期內(nèi)需要加熱的次數(shù)(一次等于1ms,相當(dāng)于加熱占空比)
  50. unsigned int huancunjishu;//用于改變設(shè)定溫度后保持顯示設(shè)定溫度一段時間再顯示t12溫度(而不是立刻顯示t12溫度)
  51. unsigned int baocunwendu;//用于進(jìn)入休眠時保存退出休眠時恢復(fù)原來的設(shè)定溫度
  52. unsigned int zengyi;//運(yùn)算放大器增益
  53. unsigned int shezhixianshijishu;//設(shè)置模式中用于延時顯示菜單項(xiàng)
  54. unsigned int moshijishu;//編碼器按下時間計數(shù),用來判斷長按還是短按
  55. unsigned int shijian;
  56. unsigned long cankaodianya0,t12dianya,ntcdianya,dianyuandianya;//用于參考電壓(ADC后的直接數(shù)據(jù),未轉(zhuǎn)換為mV),計算電源電壓,熱電偶經(jīng)放大器放大后的電壓和NTC電阻確定的室溫電壓(單位均為mV)
  57. unsigned long xiumianjishu;//等待多長時間進(jìn)入休眠狀態(tài)(單位ms)
  58. unsigned long guanjijishu;//等待多長時間進(jìn)入關(guān)機(jī)狀態(tài)(單位ms)
  59. unsigned long wendujiaqiangjishu;//多長時間退出溫度加強(qiáng)模式(單位ms)

  60. /********************************EEPROM公共函數(shù)(1)************************************************/
  61. void gonggonghanshu(void)//所有的公共函數(shù)都是因?yàn)槎啻问褂玫搅?而把它們整理起來再調(diào)用可以減小編譯后的文件大小(迫不得已的做法,因?yàn)閱纹瑱C(jī)的FLASH太小了,否則裝不下程序)
  62. {
  63. IAP_TRIG = 0x5a;//發(fā)送5ah到觸發(fā)寄存器
  64. IAP_TRIG = 0xa5;//發(fā)送a5h到觸發(fā)寄存器
  65. _nop_();//延時
  66. IAP_CONTR = 0;//關(guān)閉IAP 功能
  67. IAP_CMD = 0;//清空命令寄存器
  68. IAP_TRIG = 0;//清空命令觸發(fā)寄存器
  69. IAP_ADDRH = 0;//清空地址高位
  70. IAP_ADDRL = 0;//清空地址低位
  71. }

  72. /********************************字節(jié)讀函數(shù)****************************************************/
  73. unsigned char Byte_Read(unsigned int add)
  74. {
  75. IAP_DATA = 0x00;//清空數(shù)據(jù)
  76. IAP_CONTR = 0x81;//打開IAP,設(shè)置操作等待時間
  77. IAP_CMD = 0x01;//字節(jié)讀命令
  78. IAP_ADDRH = add>>8;//設(shè)置高8位地址
  79. IAP_ADDRL = add&0x00ff;//設(shè)置低8位地址
  80. gonggonghanshu();
  81. return (IAP_DATA);//返回讀到的數(shù)據(jù)
  82. }

  83. /********************************字節(jié)編程函數(shù)************************************************/
  84. void Byte_Program(unsigned int add, unsigned char dat)
  85. {
  86. IAP_CONTR = 0x81;//打開IAP,設(shè)置操作等待時間
  87. IAP_CMD = 0x02;//字節(jié)編程命令
  88. IAP_ADDRH = add>>8;//設(shè)置高8位地址
  89. IAP_ADDRL = add&0x00ff;//設(shè)置低8位地址
  90. IAP_DATA = dat;//要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
  91. gonggonghanshu();
  92. }

  93. /********************************扇區(qū)擦除函數(shù)************************************************/
  94. void Sector_Erase(unsigned int add)
  95. {
  96. IAP_CONTR = 0x81;//打開IAP,設(shè)置操作等待時間
  97. IAP_CMD = 0x03;//扇區(qū)擦除命令
  98. IAP_ADDRH = add>>8;//設(shè)置高8位地址
  99. IAP_ADDRL = add&0x00ff;//設(shè)置低8位地址
  100. gonggonghanshu();
  101. }

  102. /********************************1ms延時函數(shù)*************************************************/
  103. void delay_ms (unsigned int a)//24MHz時鐘時的1毫秒延時函數(shù)
  104. {
  105. unsigned int b;
  106. while(a--)
  107. {
  108.   for(b=0;b<1200;b++);
  109. }
  110. }

  111. /********************************10us延時函數(shù)************************************************/
  112. void delay_10us (unsigned int a)//24MHz時鐘時的10微秒延時函數(shù)
  113. {
  114. unsigned int b;
  115. while(a--)
  116. {
  117.   for(b=0;b<12;b++);
  118. }
  119. }

  120. /********************************數(shù)碼管延時關(guān)斷函數(shù)******************************************/
  121. void guanduan (void)//用于關(guān)斷數(shù)碼管的位選
  122. {
  123. delay_ms(1);//延時
  124. bw=1;//關(guān)斷百位
  125. sw=1;//關(guān)斷十位
  126. gw=1;//關(guān)斷個位
  127. }

  128. /********************************公共函數(shù)10(顯示)********************************************/
  129. void gonggonghanshu10(unsigned char a)
  130. {
  131. a7=a&0x80;
  132. a6=a&0x40;
  133. a5=a&0x20;
  134. a4=a&0x10;
  135. a3=a&0x08;
  136. a2=a&0x04;
  137. a1=a&0x02;
  138. tihuan=a&0x01;
  139. }

  140. /********************************顯示函數(shù)****************************************************/
  141. void display(signed int a)//顯示函數(shù)(顯示實(shí)際數(shù)據(jù)除以10(參數(shù)設(shè)置模式除外),支持顯示負(fù)數(shù),負(fù)數(shù)顯示方式為百位顯示負(fù)號"-"十位和個位顯示數(shù)據(jù))
  142. {
  143.   unsigned char baiwei,shiwei,gewei,d;//定義百位,十位,個位,每次顯示幀數(shù)
  144.   unsigned char f;//用于小數(shù)點(diǎn)閃爍
  145.   signed int c;//用于處理數(shù)字a
  146.   if(a<0)//如果a是負(fù)數(shù)
  147.    c=-a;//取a的相反數(shù)
  148.   else//否則
  149.    c=a;//就直接取a
  150.   if(guanjikaiguan==1&&shezhimoshi==0)//如果是關(guān)機(jī)狀態(tài)
  151.    c=0;//就顯示000
  152.   if(shezhimoshi==0)//如果是正常模式就顯示數(shù)據(jù)的十分之一,如果是設(shè)置模式直接顯示數(shù)據(jù)   
  153.    c=c/10;
  154.   baiwei=c/100;//計算百位
  155.   c=c%100;
  156.   shiwei=c/10;//計算十位
  157.   c=c%10;
  158.   gewei=c;//計算個位
  159.   for(d=0;d<20;d++)//顯示部分,每次顯示20個循環(huán)(20幀)
  160.   {
  161.    if(a<0)//如果a是負(fù)數(shù),則百位顯示負(fù)號
  162.         gonggonghanshu10(duanma[10]);
  163.    else if(shezhimoshi==1&&xianship==1)//在設(shè)置模式顯示菜單項(xiàng)時,百位顯示字母P
  164.         gonggonghanshu10(duanma[11]);
  165.    else//否則直接顯示百位
  166.     gonggonghanshu10(duanma[baiwei]);//顯示百位
  167.    if(shijian>6000&&f>1)//如果是溫度加強(qiáng)模式,十位小數(shù)點(diǎn)閃爍
  168.     dot=1;
  169.    bw=0;//打開百位
  170.    guanduan();//延時關(guān)斷百位

  171.    gonggonghanshu10(duanma[shiwei]);//顯示十位
  172.    if(wendujiaqiang==1&&f>1)//如果是溫度加強(qiáng)模式,十位小數(shù)點(diǎn)閃爍
  173.     dot=1;
  174.    sw=0;//打開十位
  175.    guanduan();//延時關(guān)斷十位

  176.    gonggonghanshu10(duanma[gewei]);//顯示個位
  177.    if((xiumiankaiguan==1&&guanjikaiguan==0)&&f>1)//如果是休眠狀態(tài),個位小數(shù)點(diǎn)閃爍
  178.         dot=1;
  179.    gw=0;//打開個位
  180.    guanduan();//延時關(guān)斷個位
  181.    if(d==19)//用于確定小數(shù)點(diǎn)何時點(diǎn)亮(從而實(shí)現(xiàn)閃爍)
  182.     f++;
  183.    if(f==4)
  184.     f=0;
  185.   }
  186. }

  187. /********************************ADC公共函數(shù)**************************************************/
  188. void gonggonghanshu2(void)//此函數(shù)測量單片機(jī)電源電壓
  189. {
  190. ADC_CONTR=0x88;//ADC_POWER, SPEED1, SPEED0, ADC_FLAG---ADC_START, CHS2, CHS1, CHS0
  191. delay_10us(5);//延時等待轉(zhuǎn)換結(jié)束
  192. ADC_RESL=ADC_RESL&0x03;//取轉(zhuǎn)換結(jié)果低八位中的低二位
  193. cankaodianya0=(ADC_RES*4+ADC_RESL);//把結(jié)果轉(zhuǎn)換成十進(jìn)制數(shù)據(jù)(10位ADC,最大值1024)
  194. dianyuandianya=2549760/cankaodianya0;//計算電源電壓,單位mV
  195. }

  196. /********************************ADC測電壓函數(shù)************************************************/
  197. void adc (void)//ADC函數(shù),用于測量和計算各種電壓
  198. {
  199. signed char a;//查NTC表用
  200. signed int b;//兩次溫度求平均值用
  201. gonggonghanshu2();//公共函數(shù)2(此函數(shù)功能是測量電源電壓,單位mV)

  202. ADC_CONTR=0x89;//ADC_POWER, SPEED1, SPEED0, ADC_FLAG---ADC_START, CHS2, CHS1, CHS0 轉(zhuǎn)換采用最低速度速,低速更精確(測量t12電壓務(wù)必使用最低速度AD轉(zhuǎn)換,實(shí)測高速誤差大)
  203. delay_10us(5);
  204. ADC_RESL=ADC_RESL&0x03;
  205. t12dianya=(ADC_RES*4+ADC_RESL);
  206. t12dianya=2490*t12dianya/cankaodianya0;//計算t12電壓,單位mV
  207.                                                                                                                        
  208. ADC_CONTR=0x8a;//ADC_POWER, SPEED1, SPEED0, ADC_FLAG---ADC_START, CHS2, CHS1, CHS0       
  209. delay_10us(5);
  210. ADC_RESL=ADC_RESL&0x03;
  211. ntcdianya=(ADC_RES*4+ADC_RESL);
  212. ntcdianya=2490*ntcdianya/cankaodianya0;//計算ntc電壓,單位mV

  213. for(a=0;wendubiao[a]<ntcdianya;a++)//查表計算室溫
  214.   {
  215.    if(a>=61)//如果超出表的范圍就取允許的最高溫度(50度)
  216.    break;//并且退出查表
  217.   }
  218. shiwen=(a-11)*10;//得出室溫(實(shí)際室溫乘以10)

  219. t12wendu=(t12dianya-canshu[0])*canshu[1]*10/zengyi+shiwen-wenduxiuzheng*10;//計算t12的實(shí)際溫度
  220. if((t12wendu-b)>-2000&&(t12wendu-b)<2000)//如果兩次溫度相差不超過200度
  221.   t12wendu=(t12wendu+b)/2;//就兩次溫度求平均值
  222. if(t12wendu<shiwen)//如果t12溫度小于室溫
  223.   t12wendu=shiwen;//就取室溫
  224. b=t12wendu;//記錄上一次溫度
  225. if(t12wendu>5000)//如果得出的溫度超過500度,說明沒有插入烙鐵頭或參數(shù)錯誤(因?yàn)槔予F頭的溫度不可能超過500度)
  226.   t12wendu=5000;//顯示500作為錯誤指示(注意顯示函數(shù)顯示的是1/10,所以要顯示500,需要賦值5000)
  227. if(huancunkaiguan==1)//如果緩存開關(guān)開,說明剛剛改變了設(shè)定溫度
  228.   huancun=shedingwendu;//于是顯示設(shè)定溫度(而不是t12溫度)
  229. else
  230.   huancun=t12wendu;//否則直接顯示t12溫度
  231. }

  232. /********************************定時器0初始化函數(shù)*******************************************/
  233. void timer0init (void)//定時器0初始化程序,24MHz頻率下,每1ms中斷一次
  234. {
  235. TMOD=0x00;//定時模式,16位自動重裝
  236. TH0=0xf8; //計時1ms
  237. TL0=0x2f;
  238. ET0=1;//開啟定時器0中斷
  239. TR0=1;//啟動定時器0
  240. }

  241. /********************************定時器1初始化函數(shù)*******************************************/
  242. void timer1init (void)//定時器0初始化程序,24MHz頻率下,每1ms中斷一次
  243. {
  244. TMOD=0x00;//定時模式,16位自動重裝
  245. TH1=0xf8; //計時1ms
  246. TL1=0x2f;
  247. ET1=1;//開啟定時器1中斷
  248. TR1=1;//啟動定時器1
  249. }

  250. /********************************恢復(fù)默認(rèn)值函數(shù)********************************************/
  251. void morenzhi(void)//恢復(fù)控制器的默認(rèn)參數(shù)
  252. {
  253. unsigned char a;
  254. Sector_Erase(0x0000);//擦除扇區(qū)
  255. for(a=0;a<9;a++)//一項(xiàng)一項(xiàng)的查表并存儲參數(shù)
  256.   Byte_Program(a,moren[a]);
  257. }

  258. /********************************公共函數(shù)4(退出溫度加強(qiáng))************************************/
  259. void gonggonghanshu4(void)
  260. {
  261. wendujiaqiangjishukaiguan=0;//溫度加強(qiáng)計數(shù)關(guān)閉
  262. wendujiaqiangjishu=0;//清零溫度加強(qiáng)計數(shù)
  263. wendujiaqiang=0;//退出溫度加強(qiáng)
  264. }

  265. /********************************公共函數(shù)3(編碼器)******************************************/
  266. void gonggonghanshu3(void)
  267. {
  268. ganggangkaiji=0;//已經(jīng)開機(jī)
  269. if(xiumiankaiguan==1)//如果原來在休眠狀態(tài)
  270.   {
  271.    xiumiankaiguan=0;//停止休眠
  272.    shedingwendu=baocunwendu;//恢復(fù)休眠前的設(shè)定溫度
  273.   }
  274. xiumianjishukaiguan=1;//允許新的一次休眠計時
  275. xiumianjishu=0;//從0開始計時
  276. guanjijishukaiguan=0;//停止關(guān)機(jī)計數(shù)
  277. guanjikaiguan=0;//退出關(guān)機(jī)狀態(tài)
  278. gonggonghanshu4();//退出溫度加強(qiáng)
  279. }

  280. /********************************公共函數(shù)6(記錄編碼器狀態(tài))**********************************/
  281. void gonggonghanshu6(void)
  282. {
  283. e=encodera;//記錄編碼器a腳此次狀態(tài)
  284. f=encoderb;//記錄編碼器b腳此次狀態(tài)
  285. h=bianmaanniu;//記錄編碼按鈕此次狀態(tài)
  286. }

  287. /********************************公共函數(shù)8(進(jìn)入休眠)****************************************/
  288. void gonggonghanshu8(void)
  289. {
  290. ganggangkaiji=0;//已經(jīng)開機(jī)
  291. baocunwendu=shedingwendu;//記錄當(dāng)前設(shè)定溫度
  292. shedingwendu=2000;//設(shè)定休眠溫度
  293. xiumiankaiguan=1;//進(jìn)入休眠狀態(tài)
  294. xiumianjishukaiguan=0;//停止休眠計數(shù)
  295. xiumianjishu=0;//清零休眠計數(shù)
  296. guanjijishukaiguan=1;//允許關(guān)機(jī)計數(shù)
  297. }
  298. /********************************公共函數(shù)9(確定按下模式)************************************/
  299. void gonggonghanshu9(void)
  300. {
  301. if(h==1&&bianmaanniu==0)//如果按下了編碼器
  302.    moshijishukaiguan=1;//允許按下時間計數(shù)
  303. if(moshijishukaiguan==1)//如果允許按下時間計數(shù)
  304.   moshijishu++;//就開始計數(shù)
  305. if(moshijishukaiguan==1&&bianmaanniu==1)//如果在計數(shù)過程中編碼器松開
  306.   {
  307.    moshijishukaiguan=0;//停止按下時間計數(shù)
  308.    if(moshijishu>1500)//
  309.     moshixuanze=3;
  310.    else if(moshijishu>300)//如果按下時間大于0.3秒
  311.     moshixuanze=2;//就是長按
  312.    else//否則
  313.     moshixuanze=1;//就是短按;
  314.    moshijishu=0;//清零計數(shù)
  315.   }
  316. }

  317. /********************************編碼器函數(shù)(正常加熱模式調(diào)用)********************************/
  318. void bianmaqi(void)
  319. {
  320. if(e==1&&f==1&&encodera==1&&encoderb==0)//和前一次狀態(tài)比較確定為右旋
  321.   {
  322.    shedingwendu=shedingwendu+canshu[2]*10;//步進(jìn)
  323.    if(shedingwendu>4500)//最高允許450度
  324.         shedingwendu=4500;
  325.    huancun=shedingwendu;//顯示改變后的設(shè)定溫度
  326.    huancunkaiguan=1;//打開緩存開關(guān)(用于延時顯示設(shè)定溫度1.5秒)
  327.    huancunjishu=0;//重新開始緩存計數(shù)
  328.    gonggonghanshu3();
  329.   }
  330. if(e==1&&f==1&&encodera==0&&encoderb==1)//和前一次狀態(tài)比較確定為左旋
  331.   {
  332.    shedingwendu=shedingwendu-canshu[2]*10;//步進(jìn)
  333.    if(shedingwendu<2000)//最低允許200度
  334.         shedingwendu=2000;
  335.    huancun=shedingwendu;//顯示改變后的設(shè)定溫度
  336.    huancunkaiguan=1;//打開緩存開關(guān)(用于延時顯示設(shè)定溫度1.5秒)
  337.    huancunjishu=0;//重新開始緩存計數(shù)
  338.    gonggonghanshu3();
  339.   }
  340. gonggonghanshu9();//確定按下模式
  341. if(moshixuanze==2)//如果是長按
  342.   {
  343.    gonggonghanshu8();//就進(jìn)入休眠狀態(tài)
  344.    moshixuanze=0;//清零按下模式
  345.   }
  346. if(moshixuanze==3)
  347.   {
  348.    jinduzhi=0;//進(jìn)度值設(shè)為0
  349.    shezhimoshi=1;//進(jìn)入?yún)?shù)設(shè)置模式
  350.    ET0=0;//關(guān)閉定時器0中斷
  351.    TR0=0;//關(guān)閉定時器0
  352.    IE=0x82;//打開定時器1中斷,關(guān)閉定時器0中斷
  353.    timer1init();//初始化定時器1
  354.    ganggangkaiji=1;//認(rèn)為是剛剛開機(jī)
  355.    moshixuanze=0;//清零模式選擇
  356.   }
  357. if(xiumiankaiguan==0)//如果不是休眠狀態(tài)
  358.   {
  359.    if(moshixuanze==1)//如果是短按
  360.         {
  361.      wendujiaqiang=~wendujiaqiang;//改變溫度加強(qiáng)狀態(tài)
  362.          moshixuanze=0;
  363.         }
  364.    if(wendujiaqiang==1)//如果溫度加強(qiáng)打開
  365.     wendujiaqiangjishukaiguan=1;//開始溫度加強(qiáng)計時
  366.   }
  367. else//如果是休眠狀態(tài)
  368.   {
  369.    if(moshixuanze==1)//如果是短按
  370.     {
  371.          gonggonghanshu3();//退出溫度加強(qiáng)模式
  372.      moshixuanze=0;//清零按下模式
  373.         }
  374.   }
  375. gonggonghanshu6();//記錄編碼器狀態(tài)
  376. }

  377. /********************************讀取設(shè)置數(shù)據(jù)函數(shù)******************************************/
  378. void duqushezhishuju(void)//讀取控制器的參數(shù)
  379. {
  380. unsigned char a;
  381. zengyi=Byte_Read(0x0000);//讀取增益原始參數(shù)
  382. zengyi=zengyi+100;//換算到正確的區(qū)間
  383. for(a=0;a<7;a++)//讀取其他的參數(shù)值
  384.   {
  385.    canshu[a]=Byte_Read(a+1);
  386.   }
  387. wenduxiuzheng=canshu[5]-30;
  388. }

  389. /********************************保存數(shù)據(jù)函數(shù)**********************************************/
  390. void baocunshuju(void)//保存控制器數(shù)據(jù)到EEPROM
  391. {
  392. unsigned char a;
  393. Sector_Erase(0x0000);//擦除扇區(qū)
  394. Byte_Program(0x0000,(zengyi-100));//保存增益參數(shù)
  395. for(a=0;a<7;a++)//保存其他參數(shù)
  396.   {
  397.    Byte_Program(a+1,canshu[a]);
  398.   }
  399. }
  400. /********************************公共函數(shù)7(刷新菜單顯示)*************************************/
  401. void gonggonghanshu7(void)
  402. {
  403. huancun=canshu[jinduzhi-2];
  404. if(jinduzhi==0)
  405.   huancun=huifumoren;
  406. if(jinduzhi==1)
  407.   huancun=zengyi;
  408. if(jinduzhi==7)
  409.   huancun=wenduxiuzheng;
  410. }

  411. /********************************公共函數(shù)11(退出設(shè)置模式,進(jìn)入加熱模式)**************************/
  412. void gonggonghanshu11(void)
  413. {
  414. shijian=0;
  415. moshixuanze=0;
  416. baocunshuju();//保存數(shù)據(jù)到EEPROM
  417. xianship=0;//所以百位不再顯示字母P
  418. shezhimoshi=0;//退出設(shè)置模式
  419. ET1=0;//關(guān)閉定時器1
  420. TR1=0;
  421. IE=0x88;//關(guān)閉定時器1中斷,開啟定時器0中斷
  422. timer0init();//初始化定時器0,進(jìn)入正常工作模式!!!!!!!!!!!
  423. ganggangkaiji=1;//認(rèn)為是剛剛開機(jī)
  424. xiumianjishukaiguan=1;//允許新的一次休眠計時
  425. xiumianjishu=0;//從0開始計時
  426. }

  427. /********************************編碼器函數(shù)2(參數(shù)設(shè)置模式調(diào)用)******************************/
  428. void bianmaqi2(void)
  429. {
  430. gonggonghanshu9();//確定按下模式
  431. if(e==1&&f==1&&encodera==1&&encoderb==0&&jinzhicaozuo==0)//和前一次狀態(tài)比較確定為右旋
  432.   {
  433.    if(jinduzhi==0)//菜單P00
  434.          huifumoren=1;
  435.    if(jinduzhi==1)//菜單P01
  436.         {
  437.          if(zengyi<350)
  438.           zengyi++;
  439.         }
  440.    if(jinduzhi==2)//菜單P02
  441.         {
  442.          if(canshu[0]<250)
  443.           canshu[0]=canshu[0]+2;
  444.         }
  445.    if(jinduzhi==3)//菜單P03
  446.         {
  447.          if(canshu[1]<50)
  448.           canshu[1]++;
  449.         }
  450.    if(jinduzhi==4)//菜單P04
  451.     {
  452.      if(canshu[2]==0)
  453.       canshu[2]=1;
  454.      else if(canshu[2]==1)
  455.       canshu[2]=2;
  456.      else if(canshu[2]==2)
  457.       canshu[2]=5;
  458.      else if(canshu[2]==5)
  459.       canshu[2]=10;
  460.     }
  461.    if(jinduzhi==5)//菜單P05
  462.     {
  463.          if(canshu[3]<60)
  464.           canshu[3]++;
  465.         }
  466.    if(jinduzhi==6)//菜單P06
  467.     {
  468.          if(canshu[4]<180)
  469.           {
  470.            if(canshu[4]<30)
  471.             canshu[4]++;
  472.            else
  473.             canshu[4]=canshu[4]+10;
  474.           }
  475.         }
  476.    if(jinduzhi==7)//菜單P07
  477.     {
  478.          if(wenduxiuzheng<30)
  479.           {
  480.            wenduxiuzheng++;
  481.            canshu[5]=wenduxiuzheng+30;
  482.           }
  483.         }
  484.    if(jinduzhi==8)//菜單P08
  485.         canshu[6]=1;
  486.    gonggonghanshu7();//刷新菜單顯示
  487.    shijian=0;
  488.   }
  489. if(e==1&&f==1&&encodera==0&&encoderb==1&&jinzhicaozuo==0)//和前一次狀態(tài)比較確定為左旋
  490.   {
  491.    if(jinduzhi==0)//同上,不再贅述
  492.          huifumoren=0;
  493.    if(jinduzhi==1)
  494.         {
  495.          if(zengyi>200)
  496.           zengyi--;
  497.         }
  498.    if(jinduzhi==2)
  499.         {
  500.          if(canshu[0]>=2)
  501.           canshu[0]=canshu[0]-2;
  502.         }
  503.    if(jinduzhi==3)
  504.         {
  505.          if(canshu[1]>30)
  506.           canshu[1]--;
  507.         }
  508.    if(jinduzhi==4)
  509.     {
  510.      if(canshu[2]==1)
  511.       canshu[2]=0;
  512.      else if(canshu[2]==2)
  513.       canshu[2]=1;
  514.      else if(canshu[2]==5)
  515.       canshu[2]=2;
  516.      else if(canshu[2]==10)
  517.       canshu[2]=5;
  518.     }
  519.    if(jinduzhi==5)
  520.     {
  521.          if(canshu[3]>0)
  522.           canshu[3]--;
  523.         }
  524.    if(jinduzhi==6)
  525.     {
  526.          if(canshu[4]>0)
  527.           {
  528.            if(canshu[4]<31)
  529.             canshu[4]--;
  530.            else
  531.             canshu[4]=canshu[4]-10;
  532.           }
  533.         }
  534.    if(jinduzhi==7)
  535.     {
  536.          if(wenduxiuzheng>-30)
  537.           {
  538.            wenduxiuzheng--;
  539.            canshu[5]=wenduxiuzheng+30;
  540.           }
  541.         }
  542.    if(jinduzhi==8)
  543.         canshu[6]=0;
  544.    gonggonghanshu7();//刷新菜單顯示
  545.    shijian=0;
  546.   }
  547. if(shijian>8000)//如果超過設(shè)定時間
  548.   gonggonghanshu11();//自動退出參數(shù)設(shè)置模式,進(jìn)入加熱模式
  549. if(h==0&&bianmaanniu==1&&jinzhicaozuo==0)//如果按下編碼按鈕,并且此時允許操作編碼器
  550.   {
  551.    if(jinduzhi==0&&huifumoren==1)//如果在P00菜單選擇了恢復(fù)默認(rèn)值
  552.         {
  553.          morenzhi();//就恢復(fù)默認(rèn)值
  554.          duqushezhishuju();//并重新讀取數(shù)據(jù)到RAM
  555.         }
  556.    jinduzhi++;//菜單數(shù)加一(即下一項(xiàng)菜單)
  557.    xianship=1;//百位顯示字母P
  558.    huancun=jinduzhi;//顯示新的菜單項(xiàng)(指P幾菜單)
  559.    jinzhicaozuo=1;//由于菜單項(xiàng)要延遲顯示1.5秒才顯示菜單對應(yīng)的參數(shù),所以顯示菜單項(xiàng)的時候禁止操作編碼器改變參數(shù)
  560.    shezhixianshijishukaiguan=1;//允許開始新的延遲計數(shù)(1.5秒)
  561.    shezhixianshijishu=0;//從0開始計數(shù)
  562.    baocunshuju();//保存數(shù)據(jù)到EEPROM
  563.    if(jinduzhi==9||moshixuanze==3)//菜單項(xiàng)最大為P08,如果到了P09說明所有的菜單都設(shè)置完了
  564.         gonggonghanshu11();//退出參數(shù)設(shè)置模式,進(jìn)入加熱模式
  565.   }
  566. gonggonghanshu6();//記錄編碼器狀態(tài)
  567. if(bianmaanniu==0)
  568.   shijian=0;
  569. }

  570. /********************************掉電存儲函數(shù)*********************************************/
  571. void diaodiancunchu(void)//用于關(guān)機(jī)時存儲溫度數(shù)據(jù),以便下次開機(jī)時恢復(fù)溫度
  572. {
  573. gonggonghanshu2();//檢測電源電壓
  574. if(dianyuandianya<4850)//如果電源電壓降低到4.85V說明掉電了
  575.   {
  576.    P2=0x00;//關(guān)閉數(shù)碼管位選和t12(即停止顯示,停止加熱),節(jié)約電量
  577.    P3=0x70;//關(guān)閉替換腳,關(guān)閉位選腳,節(jié)約電量
  578.    if(xiumiankaiguan==1)//如果是休眠狀態(tài)
  579.     shedingwendu=baocunwendu;//就恢復(fù)休眠前的溫度
  580.    Sector_Erase(0x0200);//擦除扇區(qū)
  581.    Byte_Program(0x0200,(shedingwendu/10-200));//寫入溫度到EEPROM
  582.    delay_ms(40);//等待寫入完畢
  583.    t12=1;//設(shè)定溫度已經(jīng)保存,于是加熱t(yī)12以盡快耗盡電容電量,加速關(guān)機(jī)
  584.    delay_ms(1000);//最多加熱1S
  585.   }
  586. }

  587. /********************************震動休眠函數(shù)**********************************************/
  588. void zhendongxiumian(void)
  589. {
  590. if(zhendongkaiguan!=g)//震動開關(guān)狀態(tài)改變,說明晃動了手柄
  591.   {
  592.    ganggangkaiji=0;//已經(jīng)開機(jī)
  593.    xiumianjishu=0;//清零休眠計數(shù)
  594.    xiumianjishukaiguan=1;//開始新的休眠計數(shù)
  595.    if((xiumiankaiguan==1&&guanjikaiguan==0)||(xiumiankaiguan==1&&guanjikaiguan==1&&canshu[6]==0))//
  596.     {
  597.          xiumiankaiguan=0;//停止休眠
  598.          shedingwendu=baocunwendu;//恢復(fù)原來的溫度
  599.          xiumianjishukaiguan=1;//允許新一次休眠計數(shù)
  600.      xiumianjishu=0;//從0開始計數(shù)
  601.      guanjijishukaiguan=0;//停止關(guān)機(jī)計數(shù)
  602.      guanjikaiguan=0;//退出關(guān)機(jī)狀態(tài)(如果原來是關(guān)機(jī)狀態(tài)的話)
  603.         }
  604.   }
  605. g=zhendongkaiguan;//保存當(dāng)前震動傳感器狀態(tài)(用于和下一次比較,以便確定是否震動了)
  606. }

  607. /********************************定時器0中斷函數(shù)********************************************/
  608. void timer0(void) interrupt 1//定時0中斷函數(shù),用于檢測旋轉(zhuǎn)編碼器,掉電存儲等操作(僅用于正常工作模式)
  609. {
  610. unsigned int a,b;
  611. unsigned char buchang;
  612. diaodiancunchu();//調(diào)用掉電存儲函數(shù)
  613. bianmaqi();//調(diào)用編碼器函數(shù)
  614. zhendongxiumian();//調(diào)用震動休眠函數(shù)
  615. if(huancunkaiguan==1)//延時顯示計數(shù)
  616.   huancunjishu++;
  617. if(xiumianjishukaiguan==1||ganggangkaiji==1)//休眠計數(shù)
  618.   {
  619.    if(wendujiaqiang==0)//如果不是溫度加強(qiáng)模式
  620.     xiumianjishu++;//就計數(shù)
  621.    else//否則
  622.     xiumianjishu=1;//不計數(shù)
  623.   }
  624. if(guanjijishukaiguan==1||canshu[4]==0)//關(guān)機(jī)計數(shù)
  625.   guanjijishu++;
  626. if(wendujiaqiangjishukaiguan==1)//溫度加強(qiáng)計數(shù)
  627.   wendujiaqiangjishu++;
  628. if(wendujiaqiangjishu==60000)//如果到達(dá)設(shè)定的溫度加強(qiáng)時間(60s)
  629.   gonggonghanshu4();//退出溫度加強(qiáng)模式
  630. if(xiumianjishu==canshu[3]*60000)//如果達(dá)到設(shè)定時間就休眠
  631.   gonggonghanshu8();//進(jìn)入休眠模式

  632. if(guanjijishu==canshu[4]*60000)//如果關(guān)機(jī)計數(shù)達(dá)到了設(shè)定的時間
  633.   {
  634.    guanjikaiguan=1;//進(jìn)入關(guān)機(jī)狀態(tài)
  635.    guanjijishukaiguan=0;//停止關(guān)機(jī)計數(shù)
  636.    guanjijishu=0;//清零關(guān)機(jī)計數(shù)
  637.   }
  638. zhouqijishu++;//加熱周期計數(shù)
  639. if(jiareshu>196)//最多加熱196ms
  640.   jiareshu=196;
  641. if((zhouqijishu<=jiareshu)&&(guanjikaiguan==0))//如果當(dāng)前計數(shù)小于等于加熱數(shù)并且不是關(guān)機(jī)模式
  642.   t12=1;//就加熱
  643. else//否則
  644.   t12=0;//不加熱
  645. if(t12wendu==5000)//如果t12溫度為500,說明沒有插入烙鐵頭或參數(shù)嚴(yán)重錯誤
  646.   t12=0;//停止加熱
  647. if(huancunjishu==1500)//設(shè)定溫度延時顯示1.5秒
  648.   {
  649.    huancunkaiguan=0;//如果達(dá)到了1.5秒,關(guān)閉緩存開關(guān)
  650.    huancunjishu=0;//停止緩存計數(shù)
  651.    huancun=t12wendu;//由顯示設(shè)定溫度改為顯示t12溫度
  652.   }
  653. if(zhouqijishu==200)//t12停止加熱后2ms再檢測溫度(給電容留出放電時間,防止檢測的溫度偏高)
  654.   {
  655.    adc();//檢測電壓,計算溫度
  656.    zhouqijishu=0;//重新開始加熱周期計數(shù)
  657.    if(wendujiaqiang==1)
  658.     a=shedingwendu+515;
  659.    else
  660.     a=shedingwendu+15;
  661.    if(a>4515)
  662.     a=4515;        //////////////////////////以下為加熱算法(請自行理解,不作注釋)//////////////////////
  663.    if(t12wendu>a)
  664.     {
  665.          if(t12wendu-a<=20)
  666.           jiareshu=(t12wendu-a)/4+a/1000;
  667.          else
  668.           jiareshu=0;
  669.         }
  670.    if(t12wendu<=a)
  671.     {
  672.          wencha=a-t12wendu;
  673.          if(wencha>30)
  674.           {
  675.            buchang++;
  676.            if(buchang>150)
  677.             buchang=150;
  678.           }
  679.          else
  680.           buchang=0;
  681.          if(a-t12wendu>=300)
  682.           jiareshu=198;
  683.          else if(a-t12wendu>=200)
  684.           jiareshu=160;
  685.          else if(a-t12wendu>=150)
  686.           jiareshu=130;
  687.          else if(a-t12wendu>=100)
  688.           jiareshu=90+wencha/2+buchang;
  689.          else if(a-t12wendu>=50)
  690.           jiareshu=50+buchang*2;
  691.          else
  692.           jiareshu=shedingwendu/400+wencha*2/3+buchang;
  693.         }
  694.    }
  695.   if((b>t12wendu)&&(t12wendu<shedingwendu-30))
  696.    jiareshu=jiareshu+50;
  697.   b=t12wendu;
  698. }

  699. /********************************定時器1中斷函數(shù)*******************************************/
  700. void timer1(void) interrupt 3//定時器1中斷僅用于參數(shù)設(shè)置模式
  701. {
  702. shijian++;
  703. t12=0;
  704. bianmaqi2();//調(diào)用編碼器2函數(shù)
  705. if(ganggangkaiji==1)//如果剛剛開機(jī)
  706.   {
  707.    xianship=1;//百位顯示字母P
  708.    huancun=jinduzhi;//顯示菜單P00(因?yàn)榇藭r進(jìn)度值為0)
  709.    ganggangkaiji=0;//已經(jīng)開機(jī)
  710.    shezhixianshijishukaiguan=1;//允許設(shè)置顯示計數(shù)
  711.   }
  712. if(shezhixianshijishukaiguan==1)//如果允許設(shè)置顯示計數(shù),就開始計數(shù)
  713.   shezhixianshijishu++;
  714. if(shezhixianshijishu==1500)//如果計數(shù)到規(guī)定的1.5s
  715.   {
  716.    xianship=0;//停止顯示百位的字母P
  717.    shezhixianshijishukaiguan=0;//停止設(shè)置顯示計數(shù)
  718.    shezhixianshijishu=0;//清零計數(shù)
  719.    jinzhicaozuo=0;//此時禁止操作編碼器
  720.    huancun=canshu[jinduzhi-2];
  721.    if(jinduzhi==0)//顯示當(dāng)前菜單項(xiàng)對應(yīng)的參數(shù)(P00的參數(shù))
  722.     huancun=huifumoren;
  723.    if(jinduzhi==1)//同上,不再贅述
  724.     huancun=zengyi;
  725.    if(jinduzhi==7)
  726.     huancun=wenduxiuzheng;
  727.    jinzhicaozuo=0;//禁止編碼器操作
  728.   }
  729. }

  730. /********************************主函數(shù)*****************************************************/
  731. void main (void)//主函數(shù)
  732. {
  733. P1M0=0x00;//P1除P1.0,P1.1,P1.2為輸入模式外均為正常模式
  734. P1M1=0x07;
  735. P1ASF=0x07;//設(shè)置P1相應(yīng)ADC轉(zhuǎn)換的I/O口為ADC輸入模式
  736. P2M0=0xff;//P2都是推挽模式
  737. P2M1=0x00;
  738. P3M0=0xf0;//P3.4,P3.5,P3.6,P3.7為推挽模式,P3.2,P3.3為輸入模式,其余正常模式
  739. P3M1=0x06;
  740. ADC_CONTR=0xe0;//打開ADC電源
  741. shedingwendu=Byte_Read(0x0200);//讀取上次關(guān)機(jī)時保存的設(shè)定溫度
  742. shedingwendu=(shedingwendu+200)*10;
  743. if(shedingwendu>4500||shedingwendu<2000)//如果讀取的設(shè)定溫度超出范圍
  744.   shedingwendu=3000;//就設(shè)為300度
  745. duqushezhishuju();//讀取控制器的設(shè)置參數(shù)
  746. if(bianmaanniu==0)//如果開機(jī)時編碼按鈕是低電平(即按下了按鈕)
  747.   {
  748.    shezhimoshi=1;//進(jìn)入?yún)?shù)設(shè)置模式
  749.    IE=0x82;//打開定時器1中斷,關(guān)閉定時器0中斷
  750.    timer1init();//初始化定時器1
  751.   }
  752. else//如果開機(jī)時沒有按下編碼器按鈕
  753.   {
  754.    shezhimoshi=0;//進(jìn)入正常加熱模式
  755.    IE=0x88;//打開定時器0中斷,關(guān)閉定時器1中斷
  756.    timer0init();//初始化定時器0
  757.   }
  758. while(1)
  759. {
  760.   display(huancun);//數(shù)碼管顯示數(shù)據(jù)
  761. }
  762. }
復(fù)制代碼
以上為金大師STC15F204EA T12數(shù)碼管焊臺固件,本人小白。只知道改引腳P5.5,后來發(fā)現(xiàn)STC15W408AS沒有定時器1,導(dǎo)致刷了程序?qū)е耇12無法正常工作,請教大佬們怎么把定時器1改成定時器2。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-8-29 17:53 | 顯示全部樓層
void Timer2Init(void)                //1毫秒@24.000MHz
{
        AUXR |= 0x04;                //定時器時鐘1T模式
        T2L = 0x40;                //設(shè)置定時初始值
        T2H = 0xA2;                //設(shè)置定時初始值
        AUXR |= 0x10;                //定時器2開始計時
}

void timer2() interrupt 12
{
shijian++;
t12=0;
bianmaqi2();//調(diào)用編碼器2函數(shù)
if(ganggangkaiji==1)//如果剛剛開機(jī)
  {
   xianship=1;//百位顯示字母P
   huancun=jinduzhi;//顯示菜單P00(因?yàn)榇藭r進(jìn)度值為0)
   ganggangkaiji=0;//已經(jīng)開機(jī)
   shezhixianshijishukaiguan=1;//允許設(shè)置顯示計數(shù)
  }
if(shezhixianshijishukaiguan==1)//如果允許設(shè)置顯示計數(shù),就開始計數(shù)
  shezhixianshijishu++;
if(shezhixianshijishu==1500)//如果計數(shù)到規(guī)定的1.5s
  {
   xianship=0;//停止顯示百位的字母P
   shezhixianshijishukaiguan=0;//停止設(shè)置顯示計數(shù)
   shezhixianshijishu=0;//清零計數(shù)
   jinzhicaozuo=0;//此時禁止操作編碼器
   huancun=canshu[jinduzhi-2];
   if(jinduzhi==0)//顯示當(dāng)前菜單項(xiàng)對應(yīng)的參數(shù)(P00的參數(shù))
    huancun=huifumoren;
   if(jinduzhi==1)//同上,不再贅述
    huancun=zengyi;
   if(jinduzhi==7)
    huancun=wenduxiuzheng;
   jinzhicaozuo=0;//禁止編碼器操作
  }
}
回復(fù)

使用道具 舉報

ID:1146001 發(fā)表于 2025-3-21 14:11 | 顯示全部樓層
STC15F204EA T12數(shù)碼管焊臺,原始程序,分享一下,謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 337p日本欧洲亚洲大胆精蜜臀 | 一区二区中文字幕 | 91天堂网| 免费啪啪 | 香蕉久久久 | 久久久久精 | 91视频.| 午夜视频免费在线观看 | 91色在线 | 青青伊人久久 | 午夜三级视频 | 在线2区| 色呦呦在线 | 美女拍拍拍网站 | 欧美日韩理论 | 日韩一区二区三区在线观看 | 日韩欧美三级 | 国产精品一区二区三区在线播放 | 欧美精品在线一区二区三区 | 91佛爷在线观看 | 日韩国产在线 | 久久精品国产99国产 | 男人的天堂中文字幕 | 玖玖免费 | 亚洲综合精品 | 国产精品亚洲第一区在线暖暖韩国 | 国产成人一区 | 欧美日韩一 | 久久久国产精品一区 | 亚洲国产精品一区在线观看 | 欧美日韩精品一区二区三区四区 | 日韩欧美视频免费在线观看 | 国产在线一级片 | 在线观看你懂的网站 | 亚洲免费视频网站 | 夜夜艹天天干 | 久久一及片 | 国产欧美日韩一区二区三区在线 | 奇米视频777| 亚洲精品美女在线观看 | 婷婷色国产偷v国产偷v小说 |