找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1061|回复: 1
打印 上一主题 下一主题
收起左侧

单片机应力测试仪程序

[复制链接]
跳转到指定楼层
楼主
ID:569130 发表于 2020-4-23 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ad0_7 P0    //AD转换数字量输出
  6. void disp(uchar);
  7. void dig_trans(uchar);
  8. void RTL_C();
  9. void long_delay(void);   //长延时约120us
  10. void short_delay(void);   //短延时约8us
  11. void delay10ms(uchar);    //延时10ms
  12. void longdelay(uint time);
  13. //************7279子程序声明*******
  14. void init_7279(void);
  15. void write7279(uchar cmd,uchar dta);  //写入到HD7279
  16. uchar read7279(uchar);        //从HD7279读出
  17. void send_byte(uchar);        //发送一个字节
  18. uchar receive_byte(void);     //接受一个字节
  19. //************AD转换子程序声明******
  20. void start_ad(void);
  21. read_ad();
  22. avr_read_ad();
  23. uchar digit[4];
  24. uchar key_number,j,k;
  25. uint tmr;
  26. unsigned long wait_cnter;

  27. //*************语音转换子程序*******
  28. void SC_Speech(uchar cm);
  29. void SC_WBusy(void);
  30. void SC_Speechs(void);
  31. void init_SC(void);  //sc1010初始化

  32. sbit SC_RST=P3^0;   //脉冲复位
  33. sbit SC_DATA=P3^1;   //脉冲数据
  34. sbit SC_BUSY=P3^2;   //放音busy
  35. uint sp[8];     //组合语音数组变量

  36. sbit AD_CS=P1^0;//芯片选择信号,控制芯片的启动和结果读取,低电平有效
  37. sbit AD_CLK=P1^1;//读数据控制,低电平有效
  38. sbit AD_DI=P1^2;//AD转换启动控制,上升沿有效
  39. sbit AD_DO=P1^3;//AD转换结束输出低电平

  40. sbit cs=P2^0;//7279片选
  41. sbit clk=P2^1;
  42. sbit dat=P2^2;
  43. sbit key=P2^3;
  44. sbit buzzer=P2^7;


  45. //*****  HD7279 指令  *****
  46. #define CMD_RESET 0xa4      
  47. #define CMD_TEST 0xbf       //测试
  48. #define DECODE0 0x80       //译码方式
  49. #define DECODE1 0xc8       //译码方式
  50. #define CMD_READ 0x15      //读
  51. #define UNDECODE 0x90      //译码方式:不译码
  52. #define RTL_CYCLE 0xa3     //循环左移
  53. #define RTR_CYCLE 0xa2     //循环右移
  54. #define RTL_UNCYL 0xa1     //左移
  55. #define RTR_UNCYL 0xa0    //右移
  56. #define ACTCTL 0x98      //消影
  57. #define SEGON 0xe0      //段亮
  58. #define SEGOFF 0xc0     //段灭
  59. #define BLINKCTL 0x88   //闪烁
  60. void main(){

  61.     //init_SC();
  62.           init_7279();
  63. buzzer=1;
  64.         while(1){
  65.                 //for(tmr=0;tmr<0x2000;tmr++);//上电延时
  66.                 //send_byte(CMD_RESET);

  67.                 //start_ad();//启动AD
  68.    // long_delay();
  69.         
  70.                

  71.                 disp(avr_read_ad());
  72.                 //SC_Speechs();
  73.           delay10ms(200);
  74.         }
  75. }

  76. /*
  77. //***********启动AD转换子程序*********
  78. void start_ad(void){
  79.         ad_cs=0;//允许进行AD转换
  80.         ad_wr=0;
  81.         _nop_();
  82.         ad_wr=1;//WR由低变高时,AD开始转换
  83.         while(ad_intr);
  84.         ad_cs=1;//停止AD转换
  85. }
  86. //************读AD数据子程序**********
  87. read_ad(){
  88.         uchar ad_data;
  89.         ad0_7=0xff;
  90.         ad_cs=0;//允许读
  91.         ad_rd=0;//读取转换数据结果
  92.         _nop_();
  93.         ad_data=ad0_7;//把数据存到ad_data中
  94.         ad_rd=1;
  95.         ad_cs=1;//停止AD读取
  96.         return(ad_data);
  97. }*/
  98. int adc_0832()
  99. {
  100. uint tmp=0;
  101.   uint a,b;
  102.         AD_CS=0;
  103.         AD_CLK=0;
  104.         AD_DI=1;
  105.         _nop_();
  106.         _nop_();
  107.         AD_CLK=1;
  108.         _nop_();
  109.         _nop_();
  110.         AD_CLK=0;
  111.         AD_DI=1;
  112.         _nop_();
  113.         _nop_();
  114.         AD_CLK=1;
  115.         _nop_();
  116.         _nop_();
  117.         AD_CLK=0;
  118.         AD_DI=0;
  119.         _nop_();
  120.         _nop_();
  121.         AD_CLK=1;
  122.         _nop_();
  123.         _nop_();
  124.         AD_CLK=0;
  125.         _nop_();
  126.         _nop_();
  127.         
  128.         for(a=0;a<8;a++)
  129.         
  130.         {
  131.                 AD_CLK=1;
  132.                 _nop_();
  133.                 _nop_();
  134.                 AD_CLK=0;
  135.                 _nop_();
  136.                 _nop_();
  137.                 tmp|=AD_DO;
  138.                 if(a<7)
  139.                         tmp<<=1;
  140.         }
  141.         for(b=0;b<8;b++)
  142.         {
  143.                 AD_CLK=1;
  144.                 _nop_();
  145.                 _nop_();
  146.                 AD_CLK=0;
  147.                 _nop_();
  148.                 _nop_();
  149.         }
  150.         AD_CS=1;
  151.         return tmp;
  152. }



  153. //************AD转换8次取平均**********
  154. avr_read_ad(){
  155.         uint i;
  156.         uint average,max,min,sum;
  157.         uint array[8];
  158.         sum=0;
  159.         for(i=0;i<8;i++){
  160.                 //start_ad();
  161.                 array[i]=adc_0832();
  162.         }
  163.                
  164.         max=array[0];
  165.         min=array[0];
  166.         for(i=0;i<8;i++){
  167.                 if(max<array[i])
  168.                         max=array[i];
  169.                 if(min>array[i])
  170.                         min=array[i];
  171.                 sum=sum+array[i];
  172.         }
  173.         average=(sum-max-min)/6;
  174.         return average;
  175. }

  176. //********显示***********
  177. void disp(uchar ad_data){
  178.                 uint a;

  179.         
  180.         digit[3]=(ad_data-0x08)*400/51%10;
  181.         digit[2]=(ad_data-0x08)*40/51%10;
  182.         digit[1]=(ad_data-0x08)*40/51%100/10;
  183.         digit[0]=(ad_data-0x08)*40/51/100;  //百位


  184.         /*if(ad_data=0xe6)        
  185.                 xshu=0x00;
  186.         
  187.         */
  188.         buzzer=1;
  189.         
  190. if((ad_data-0x06)>=0xff){
  191.                 digit[1]=0x00;
  192.                 digit[2]=0x00;
  193.                 digit[3]=0x00;


  194.         }        
  195. if(ad_data>=0x7f){
  196.         for(a=0;a<5;a++){
  197.                 buzzer=0;
  198.         longdelay(250);
  199.         buzzer=1;
  200.         longdelay(150);
  201.         }
  202.         }        
  203.         
  204.         digit[2]=digit[2]+0x80;



  205.         //while(a--){
  206.                 write7279(0x84,digit[0]);
  207.                 short_delay();
  208.                 write7279(0x85,digit[1]);
  209.         short_delay();
  210.                 write7279(0x86,digit[2]);
  211.         short_delay();
  212.                 write7279(0x87,digit[3]);
  213.         short_delay();
  214.         //}
  215. }

  216. //*******语音模块初始化*****
  217. /*void init_SC(void){
  218.         SC_DATA=0;
  219.         SC_RST=1;
  220.         delay_us(100);
  221.         SC_RST=0;
  222.         delay_us(100);
  223.         sp[0]=0;
  224.         sp[1]=0;
  225.         sp[2]=0;
  226. }
  227. void SC_Speech(uchar cnt){
  228.         uchar i;
  229.         SC_RST=1;
  230.         delay_us(100);
  231.         SC_RST=0;
  232.         delay_us(100);
  233.         for(i=0;i<cnt;i++){
  234.                 SC_DATA=1;
  235.                 delay_us(100);
  236.                 SC_DATA=0;
  237.                 delay_us(100);
  238.         }
  239. }
  240. void SC_WBusy(void){
  241.         uint times;
  242.         for(times=0;times<20;times++){
  243.                 delay_ms(100);
  244.                 if(SC_BUSY==0)
  245.                         break;
  246.         }
  247. }
  248. //*******控制地址段组合放音******
  249. void SC_Speechs(void){
  250.         sp[0]=24;
  251.         sp[1]=22;
  252.         sp[2]=23;
  253.         sp[3]=digit[0]+2;
  254.         sp[4]=27;
  255.         sp[5]=digit[1]+2;
  256.         sp[6]=15;
  257.         sp[7]=digit[2]+2;
  258.         sp[8]=20;
  259.         
  260.         SC_Speech(sp[0]);
  261.         SC_WBusy();
  262.         SC_Speech(sp[1]);
  263.         SC_WBusy();
  264.         SC_Speech(sp[2]);
  265.         SC_WBusy();
  266.         SC_Speech(sp[3]);
  267.         SC_WBusy();
  268.         SC_Speech(sp[4]);
  269.         SC_WBusy();
  270.         SC_Speech(sp[5]);
  271.         SC_WBusy();
  272.         SC_Speech(sp[6]);
  273.         SC_WBusy();
  274.         SC_Speech(sp[7]);
  275.         SC_WBusy();
  276.         SC_Speech(sp[8]);
  277.         SC_WBusy();
  278.         sp[0]=0;sp[1]=0;sp[2]=0;sp[3]=0;//播放完毕后将各位置于无语音播放的0地址位
  279.         sp[4]=0;sp[5]=0;sp[6]=0;sp[7]=0;SC_Speech(sp[8]);
  280. }
  281. */


  282. void init_7279(){
  283.         uchar i;
  284.         send_byte(CMD_RESET);
  285.         for(i=0;i<8;i++)
  286.         write7279(UNDECODE+i,1);
  287. }
  288. void write7279(uchar cmd,uchar dta){
  289.         send_byte(cmd);
  290.         send_byte(dta);
  291. }
  292. uchar read7279(uchar command){
  293.         send_byte(command);
  294.         return(receive_byte());
  295. }
  296. void send_byte(uchar out_byte){
  297.         uchar i;
  298.         cs=0;
  299.         long_delay();
  300.         for(i=0;i<8;i++){
  301.                 if(out_byte&0x80)
  302.                         dat=1;
  303.                 else
  304.                         dat=0;
  305.           clk=1;
  306.                 short_delay();
  307.                 clk=0;
  308.                 short_delay();
  309.                 out_byte=out_byte*2;
  310.         }
  311.         dat=0;
  312. }

  313. uchar receive_byte(void){
  314.         uchar i,in_byte;
  315.         dat=1;
  316.         long_delay();
  317.         for(i=0;i<8;i++){
  318.                 clk=1;
  319.                         short_delay();
  320.                 in_byte=in_byte*2;
  321.                 if(dat)
  322.                         in_byte=in_byte|0x01;
  323.                 clk=0;
  324.                         short_delay();
  325.         }
  326.         dat=0;
  327.         return(in_byte);
  328. }
  329.                



  330. void long_delay(void){
  331.         uint i;
  332.         for(i=0;i<30;i++);
  333. }
  334. void short_delay(void){
  335.         uchar i;
  336.         for(i=0;i<8;i++);
  337. }
  338. void delay10ms(uchar time){
  339.         
  340.         
  341.         uchar i;
  342.         uint j;
  343.         for(i=0;i<time;i++){
  344.                 for(j=0;j<0x390;j++){
  345.                         //if(!key)
  346.                                 //ket_int();
  347.                 }
  348.         }
  349. }
  350. void longdelay(uint time){
  351.         
  352.         
  353.         uint i;
  354.         uint j;
  355.         for(i=0;i<time;i++){
  356.                 for(j=0;j<110;j++){
  357.                         //if(!key)
  358.                                 //ket_int();
  359.                 }
  360.         }
  361. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2020-4-27 00:02 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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