完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//************************************************
//包含文件,端口定义,程序开始 //************************************************ #include #define uchar unsigned char #define uint unsigned int int dw ; ***it DQ =P1^4; ***it moc30=P3^7;//可控硅位 unsigned char flag; unsigned char realtemp; //uchar temp1; //行扫描数组 uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf,0x7f};//row0--row7 //数码管显示的段码 uchar code table[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F, 0x6F,0x40,0x39,0x00,0x78,0x79};//,-,C,kong,t,e uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06, 0x06,0x07,0x08,0x08,0x09,0x09};//小数显示查询表 uchar dispbuf[8]; //显示缓冲区 uchar temper[2]; //存放温度的数组 //************************************************ //延时函数 //************************************************ void delay (unsigned int us) { while(us--); } //************************************************ //DS18B20复位函数 //************************************************ void reset(void) { uchar x=0; DQ = 1; delay(8); //稍做延时 DQ = 0; delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; delay(20); } //************************************************ //DS18B20读一个字节 //************************************************ uchar readbyte(void) { uchar i=0; uchar dat=0; for (i=8;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat|=0x80; delay(4); } return(dat); } //************************************************ //DS18B20写一个字节 //************************************************ void writebyte(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(4); } //************************************************ //读取温度值 //************************************************ void readtemp(void) { uchar a=0,b=0; uint t=0; reset(); writebyte(0xCC); //跳过序列号 writebyte(0x44); //启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE); //读9个寄存器,前两个为温度 a=readbyte(); //低位 b=readbyte(); //高位 if(b>0x0f) //不能使用b^7==1来判断 { a=~a+1; if(a==0) b=~b+1; else b=~b; flag=10; } else flag=12; temper[0]=a&0x0f; a=a>>4; //低位右移4位,舍弃小数部分 temper[1]=b<<4; //高位左移4位,舍弃符号位 temper[1]=temper[1]|a; } //************************************************ //扫描显示函数 //************************************************ void scan_disp() { unsigned char i,value; for(i=0;i<8;i++) { P2 = 0xff; //关显示 value =table[dispbuf[i]]; //取一行显示数据 if(i==3) value|= 0x80; P0 = value; P2 = scan[i]; //取row0--row7行扫描数据 delay(50); //延时50us } } //************************************************ //设定显示函数 //************************************************ //************************************************ //按键测试与控制温度设定函数 //************************************************ //************************************************ //实时温度显示码处理函数 //************************************************ void dat_pre() { uchar temp; readtemp(); //读18B20 temp=temper[0]; dispbuf[4]=ditab[temp]; dispbuf[5] = 11 ; //显示 C temp = temper[1]; //取整数部分 realtemp=temp; //获取实时温度数据 dispbuf[1] = temp/100; dispbuf[3] = temp%10; temp = temp/10; dispbuf[2]= temp%10; //取余不变,除法变为余数 dispbuf[0]=flag; } //************************************************ void temp_pro() { int temp; temp=temper[1] ; if(temp<15) dw=0 ; if(15 dw=1; if(20 if(25 if(30 if(35 if(temp>37) dw=6; } //************************************************ //定时计数器中断,输出波形发生函数 //************************************************ //************************************************ //主函数 //************************************************ void main() // 主函数 { TMOD=0X01; EX0=1; ET0=1; IT0=1; EA=1; moc30=1; while(1) { scan_disp(); //显示,读键扫描 dat_pre(); temp_pro(); if(dw==0) //(15a0) { TL0=0xA0; TH0=0x15; } if(dw==1) { //不同的档位,改变导通角延时8ms(e0c0) TL0=0XC0; TH0=0XE0; } if(dw==2) { //不同的档位,改变导通角延时4ms(f060) TL0=0X60; TH0=0XF0; } if(dw==3) { //不同的档位,改变导通角延时3ms(f448) TL0=0X48; TH0=0XF4; } if(dw==4) { //不同的档位,改变导通角延时2ms(f830) TL0=0X30; TH0=0XF8; } if(dw==5) { //相对平稳些不同的档位,改变导通角延时1ms(64536=fc18) TL0=0X18; TH0=0XFc; } if(dw==6) { //不同的档位,改变导通角延时0ms (65536=1000) TL0=0X00; TH0=0X10; } } } interrupt0() interrupt 0 { TR0=1; moc30=1; } time0() interrupt 1 { TR0=0; moc30=0; } 过零检测触发外中断,延时控制可控硅导通角,实现不了,求指点 |
|
相关推荐
7个回答
|
|
好像是触发脉冲宽度不够
|
|
|
|
|
|
|
|
冒昧问下 ,楼主当时控制的是调光还是调速 我正在做一个电机调速的,220V 120W的,方便的话想请教下
|
|
|
|
谢谢你。
|
|
|
|
|
|
|
|
楼主,你的问题解决没?
|
|
|
|
能否分享一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2024年上海海思MCU开发者体验官招募,手机/MatePad大奖等你拿!
1144 浏览 0 评论
【xG24 Matter开发套件试用体验】蓝牙控制板载LED
890 浏览 0 评论
1066 浏览 0 评论
电赛:mspm0l1306的开发板可以烧录程序,但是程序运行不了,怎么解决这个问题?
1117 浏览 1 评论
【xG24 Matter开发套件试用体验】Silicon Labs 基于 EFR32MG24 Explorer Kit 开发板 开箱试用体验
872 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10535 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-7 11:28 , Processed in 1.148349 second(s), Total 87, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号